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  }