diff --git a/src/runtime/time.go b/src/runtime/time.go index b14eae6a..4fa3a418 100644 --- a/src/runtime/time.go +++ b/src/runtime/time.go @@ -13,6 +13,7 @@ func (t *timerNode) whenTicks() timeUnit { } // Defined in the time package, implemented here in the runtime. +// //go:linkname startTimer time.startTimer func startTimer(tim *timer) { addTimer(&timerNode{ @@ -48,3 +49,11 @@ func timerCallback(tn *timerNode) { func stopTimer(tim *timer) bool { return removeTimer(tim) } + +//go:linkname resetTimer time.resetTimer +func resetTimer(tim *timer, when int64) bool { + tim.when = when + removed := removeTimer(tim) + startTimer(tim) + return removed +} diff --git a/testdata/timers.go b/testdata/timers.go index d412abc8..13fb207b 100644 --- a/testdata/timers.go +++ b/testdata/timers.go @@ -38,4 +38,17 @@ func main() { <-timer.C println("waited on timer at 250ms") time.Sleep(time.Millisecond * 250) + + reset := timer.Reset(time.Millisecond * 250) + println("timer reset:", reset) + println("waiting on timer") + go func() { + time.Sleep(time.Millisecond * 125) + println(" - after 125ms") + time.Sleep(time.Millisecond * 250) + println(" - after 250ms") + }() + <-timer.C + println("waited on timer at 250ms") + time.Sleep(time.Millisecond * 250) } diff --git a/testdata/timers.txt b/testdata/timers.txt index 783c402c..544e15b0 100644 --- a/testdata/timers.txt +++ b/testdata/timers.txt @@ -9,3 +9,8 @@ waiting on timer - after 125ms waited on timer at 250ms - after 250ms +timer reset: false +waiting on timer + - after 125ms +waited on timer at 250ms + - after 250ms