diff options
Diffstat (limited to 'src/cmd/godoc/throttle.go')
-rw-r--r-- | src/cmd/godoc/throttle.go | 88 |
1 files changed, 0 insertions, 88 deletions
diff --git a/src/cmd/godoc/throttle.go b/src/cmd/godoc/throttle.go deleted file mode 100644 index ac18b44e0..000000000 --- a/src/cmd/godoc/throttle.go +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2011 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. - -package main - -import "time" - -// A Throttle permits throttling of a goroutine by -// calling the Throttle method repeatedly. -// -type Throttle struct { - f float64 // f = (1-r)/r for 0 < r < 1 - dt time.Duration // minimum run time slice; >= 0 - tr time.Duration // accumulated time running - ts time.Duration // accumulated time stopped - tt time.Time // earliest throttle time (= time Throttle returned + tm) -} - -// NewThrottle creates a new Throttle with a throttle value r and -// a minimum allocated run time slice of dt: -// -// r == 0: "empty" throttle; the goroutine is always sleeping -// r == 1: full throttle; the goroutine is never sleeping -// -// A value of r == 0.6 throttles a goroutine such that it runs -// approx. 60% of the time, and sleeps approx. 40% of the time. -// Values of r < 0 or r > 1 are clamped down to values between 0 and 1. -// Values of dt < 0 are set to 0. -// -func NewThrottle(r float64, dt time.Duration) *Throttle { - var f float64 - switch { - case r <= 0: - f = -1 // indicates always sleep - case r >= 1: - f = 0 // assume r == 1 (never sleep) - default: - // 0 < r < 1 - f = (1 - r) / r - } - if dt < 0 { - dt = 0 - } - return &Throttle{f: f, dt: dt, tt: time.Now().Add(dt)} -} - -// Throttle calls time.Sleep such that over time the ratio tr/ts between -// accumulated run (tr) and sleep times (ts) approximates the value 1/(1-r) -// where r is the throttle value. Throttle returns immediately (w/o sleeping) -// if less than tm ns have passed since the last call to Throttle. -// -func (p *Throttle) Throttle() { - if p.f < 0 { - select {} // always sleep - } - - t0 := time.Now() - if t0.Before(p.tt) { - return // keep running (minimum time slice not exhausted yet) - } - - // accumulate running time - p.tr += t0.Sub(p.tt) + p.dt - - // compute sleep time - // Over time we want: - // - // tr/ts = r/(1-r) - // - // Thus: - // - // ts = tr*f with f = (1-r)/r - // - // After some incremental run time δr added to the total run time - // tr, the incremental sleep-time δs to get to the same ratio again - // after waking up from time.Sleep is: - if δs := time.Duration(float64(p.tr)*p.f) - p.ts; δs > 0 { - time.Sleep(δs) - } - - // accumulate (actual) sleep time - t1 := time.Now() - p.ts += t1.Sub(t0) - - // set earliest next throttle time - p.tt = t1.Add(p.dt) -} |