@ -8,7 +8,7 @@ import (
// Valve needs to be universal, across all sessions that belong to a user
// Valve needs to be universal, across all sessions that belong to a user
// gabe please don't sue
// gabe please don't sue
type Valve struct {
type Limited Valve struct {
// traffic directions from the server's perspective are refered
// traffic directions from the server's perspective are refered
// exclusively as rx and tx.
// exclusively as rx and tx.
// rx is from client to server, tx is from server to client
// rx is from client to server, tx is from server to client
@ -21,9 +21,11 @@ type Valve struct {
tx * int64
tx * int64
}
}
func MakeValve ( rxRate , txRate int64 ) * Valve {
type UnlimitedValve struct { }
func MakeValve ( rxRate , txRate int64 ) * LimitedValve {
var rx , tx int64
var rx , tx int64
v := & Valve {
v := & Limited Valve{
rxtb : ratelimit . NewLimitedBucketWithRate ( float64 ( rxRate ) , rxRate ) ,
rxtb : ratelimit . NewLimitedBucketWithRate ( float64 ( rxRate ) , rxRate ) ,
txtb : ratelimit . NewLimitedBucketWithRate ( float64 ( txRate ) , txRate ) ,
txtb : ratelimit . NewLimitedBucketWithRate ( float64 ( txRate ) , txRate ) ,
rx : & rx ,
rx : & rx ,
@ -32,27 +34,34 @@ func MakeValve(rxRate, txRate int64) *Valve {
return v
return v
}
}
func MakeUnlimitedValve ( ) * Valve {
var UNLIMITED_VALVE = & UnlimitedValve { }
var rx , tx int64
v := & Valve {
rxtb : ratelimit . NewUnlimitedBucket ( ) ,
txtb : ratelimit . NewUnlimitedBucket ( ) ,
rx : & rx ,
tx : & tx ,
}
return v
}
var UNLIMITED_VALVE = MakeUnlimitedValve ( )
func ( v * Valve) rxWait ( n int ) { v . rxtb . Wait ( int64 ( n ) ) }
func ( v * LimitedValve ) rxWait ( n int ) { v . rxtb . Wait ( int64 ( n ) ) }
func ( v * Valve) txWait ( n int ) { v . txtb . Wait ( int64 ( n ) ) }
func ( v * LimitedValve ) txWait ( n int ) { v . txtb . Wait ( int64 ( n ) ) }
func ( v * Valve) AddRx ( n int64 ) { atomic . AddInt64 ( v . rx , n ) }
func ( v * LimitedValve ) AddRx ( n int64 ) { atomic . AddInt64 ( v . rx , n ) }
func ( v * Valve) AddTx ( n int64 ) { atomic . AddInt64 ( v . tx , n ) }
func ( v * LimitedValve ) AddTx ( n int64 ) { atomic . AddInt64 ( v . tx , n ) }
func ( v * Valve) GetRx ( ) int64 { return atomic . LoadInt64 ( v . rx ) }
func ( v * LimitedValve ) GetRx ( ) int64 { return atomic . LoadInt64 ( v . rx ) }
func ( v * Valve) GetTx ( ) int64 { return atomic . LoadInt64 ( v . tx ) }
func ( v * LimitedValve ) GetTx ( ) int64 { return atomic . LoadInt64 ( v . tx ) }
func ( v * Valve) Nullify ( ) ( int64 , int64 ) {
func ( v * LimitedValve ) Nullify ( ) ( int64 , int64 ) {
rx := atomic . SwapInt64 ( v . rx , 0 )
rx := atomic . SwapInt64 ( v . rx , 0 )
tx := atomic . SwapInt64 ( v . tx , 0 )
tx := atomic . SwapInt64 ( v . tx , 0 )
return rx , tx
return rx , tx
}
}
func ( v * UnlimitedValve ) rxWait ( n int ) { }
func ( v * UnlimitedValve ) txWait ( n int ) { }
func ( v * UnlimitedValve ) AddRx ( n int64 ) { }
func ( v * UnlimitedValve ) AddTx ( n int64 ) { }
func ( v * UnlimitedValve ) GetRx ( ) int64 { return 0 }
func ( v * UnlimitedValve ) GetTx ( ) int64 { return 0 }
func ( v * UnlimitedValve ) Nullify ( ) ( int64 , int64 ) { return 0 , 0 }
type Valve interface {
rxWait ( n int )
txWait ( n int )
AddRx ( n int64 )
AddTx ( n int64 )
GetRx ( ) int64
GetTx ( ) int64
Nullify ( ) ( int64 , int64 )
}