github.com/Andyfoo/golang/x/net@v0.0.0-20190901054642-57c1bf301704/http2/flow.go (about) 1 // Copyright 2014 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Flow control 6 7 package http2 8 9 // flow is the flow control window's size. 10 type flow struct { 11 // n is the number of DATA bytes we're allowed to send. 12 // A flow is kept both on a conn and a per-stream. 13 n int32 14 15 // conn points to the shared connection-level flow that is 16 // shared by all streams on that conn. It is nil for the flow 17 // that's on the conn directly. 18 conn *flow 19 } 20 21 func (f *flow) setConnFlow(cf *flow) { f.conn = cf } 22 23 func (f *flow) available() int32 { 24 n := f.n 25 if f.conn != nil && f.conn.n < n { 26 n = f.conn.n 27 } 28 return n 29 } 30 31 func (f *flow) take(n int32) { 32 if n > f.available() { 33 panic("internal error: took too much") 34 } 35 f.n -= n 36 if f.conn != nil { 37 f.conn.n -= n 38 } 39 } 40 41 // add adds n bytes (positive or negative) to the flow control window. 42 // It returns false if the sum would exceed 2^31-1. 43 func (f *flow) add(n int32) bool { 44 sum := f.n + n 45 if (sum > n) == (f.n > 0) { 46 f.n = sum 47 return true 48 } 49 return false 50 }