mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 10:22:25 -05:00 
			
		
		
		
	
		
			
	
	
		
			53 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			53 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 { | ||
|  | 	_ incomparable | ||
|  | 
 | ||
|  | 	// 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 { | ||
|  | 	sum := f.n + n | ||
|  | 	if (sum > n) == (f.n > 0) { | ||
|  | 		f.n = sum | ||
|  | 		return true | ||
|  | 	} | ||
|  | 	return false | ||
|  | } |