2019-04-22 02:59:20 +00:00

47 lines
888 B
Go

package vegas
import (
"sync/atomic"
)
type sample struct {
count int64
maxInFlight int64
drop int64
// nanoseconds
totalRTT int64
}
func (s *sample) Add(rtt int64, inFlight int64, drop bool) {
if drop {
atomic.StoreInt64(&s.drop, 1)
}
for max := atomic.LoadInt64(&s.maxInFlight); max < inFlight; max = atomic.LoadInt64(&s.maxInFlight) {
if atomic.CompareAndSwapInt64(&s.maxInFlight, max, inFlight) {
break
}
}
atomic.AddInt64(&s.totalRTT, rtt)
atomic.AddInt64(&s.count, 1)
}
func (s *sample) RTT() int64 {
count := atomic.LoadInt64(&s.count)
if count == 0 {
return 0
}
return atomic.LoadInt64(&s.totalRTT) / count
}
func (s *sample) MaxInFlight() int64 {
return atomic.LoadInt64(&s.maxInFlight)
}
func (s *sample) Count() int64 {
return atomic.LoadInt64(&s.count)
}
func (s *sample) Drop() bool {
return atomic.LoadInt64(&s.drop) == 1
}