Chromium Code Reviews| Index: common/clock/systemclock.go |
| diff --git a/common/clock/systemclock.go b/common/clock/systemclock.go |
| index b5384a411fed547f99b9067c52abd09f2d2b38b6..41a96f3220fcaddda9e254c4d344cd0ae19efa65 100644 |
| --- a/common/clock/systemclock.go |
| +++ b/common/clock/systemclock.go |
| @@ -6,6 +6,8 @@ package clock |
| import ( |
| "time" |
| + |
| + "golang.org/x/net/context" |
| ) |
| // Implementation of Clock that uses Go's standard library. |
| @@ -26,14 +28,38 @@ func (systemClock) Now() time.Time { |
| return time.Now() |
| } |
| -func (systemClock) Sleep(d time.Duration) { |
| - time.Sleep(d) |
| +func (sc systemClock) Sleep(c context.Context, d time.Duration) error { |
| + ar := <-sc.After(c, d) |
| + return ar.Err |
| } |
| -func (systemClock) NewTimer() Timer { |
| - return new(systemTimer) |
| +func (systemClock) NewTimer(ctx context.Context) Timer { |
| + t := systemTimer{ |
| + ctx: ctx, |
| + } |
| + t.reset() |
| + return &t |
| } |
| -func (systemClock) After(d time.Duration) <-chan time.Time { |
| - return time.After(d) |
| +func (systemClock) After(c context.Context, d time.Duration) <-chan AfterResult { |
| + ac := make(chan AfterResult) |
| + go func() { |
|
dnj (Google)
2016/02/10 03:19:03
I implemented this separately from systemtimer b/c
|
| + ar := AfterResult{} |
| + |
| + select { |
| + case <-c.Done(): |
| + ar.Err = c.Err() |
| + |
| + case tm := <-time.After(d): |
| + // For determinism, prefer context cancellation over full sleep. |
| + select { |
| + case <-c.Done(): |
| + ar.Err = c.Err() |
| + default: |
| + ar.Time = tm |
| + } |
| + } |
| + ac <- ar |
| + }() |
| + return ac |
| } |