51 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
// 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 {
 | 
						|
	remain := (1<<31 - 1) - f.n
 | 
						|
	if n > remain {
 | 
						|
		return false
 | 
						|
	}
 | 
						|
	f.n += n
 | 
						|
	return true
 | 
						|
}
 |