2016-11-19 10:03:41 +00:00
|
|
|
// Copyright 2014 The Go Authors. All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
// Flow control
|
|
|
|
|
|
|
|
package http2
|
|
|
|
|
|
|
|
// flow is the flow control window's size.
|
|
|
|
type flow struct {
|
|
|
|
// n is the number of DATA bytes we're allowed to send.
|
|
|
|
// A flow is kept both on a conn and a per-stream.
|
|
|
|
n int32
|
|
|
|
|
|
|
|
// conn points to the shared connection-level flow that is
|
|
|
|
// shared by all streams on that conn. It is nil for the flow
|
|
|
|
// that's on the conn directly.
|
|
|
|
conn *flow
|
|
|
|
}
|
|
|
|
|
|
|
|
func (f *flow) setConnFlow(cf *flow) { f.conn = cf }
|
|
|
|
|
|
|
|
func (f *flow) available() int32 {
|
|
|
|
n := f.n
|
|
|
|
if f.conn != nil && f.conn.n < n {
|
|
|
|
n = f.conn.n
|
|
|
|
}
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
|
|
|
|
func (f *flow) take(n int32) {
|
|
|
|
if n > f.available() {
|
|
|
|
panic("internal error: took too much")
|
|
|
|
}
|
|
|
|
f.n -= n
|
|
|
|
if f.conn != nil {
|
|
|
|
f.conn.n -= n
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// add adds n bytes (positive or negative) to the flow control window.
|
|
|
|
// It returns false if the sum would exceed 2^31-1.
|
|
|
|
func (f *flow) add(n int32) bool {
|
2018-09-21 10:01:55 +00:00
|
|
|
sum := f.n + n
|
|
|
|
if (sum > n) == (f.n > 0) {
|
|
|
|
f.n = sum
|
|
|
|
return true
|
2016-11-19 10:03:41 +00:00
|
|
|
}
|
2018-09-21 10:01:55 +00:00
|
|
|
return false
|
2016-11-19 10:03:41 +00:00
|
|
|
}
|