Commit ab4af52a authored by Brad Fitzpatrick's avatar Brad Fitzpatrick

time: panic with a more helpful error on use of invalid Timer

Fixes #8721

LGTM=rsc
R=r, rsc
CC=golang-codereviews
https://golang.org/cl/155620045
parent 93fcb922
...@@ -55,6 +55,9 @@ type Timer struct { ...@@ -55,6 +55,9 @@ type Timer struct {
// Stop does not close the channel, to prevent a read from the channel succeeding // Stop does not close the channel, to prevent a read from the channel succeeding
// incorrectly. // incorrectly.
func (t *Timer) Stop() bool { func (t *Timer) Stop() bool {
if t.r.f == nil {
panic("time: Stop called on uninitialized Timer")
}
return stopTimer(&t.r) return stopTimer(&t.r)
} }
...@@ -78,6 +81,9 @@ func NewTimer(d Duration) *Timer { ...@@ -78,6 +81,9 @@ func NewTimer(d Duration) *Timer {
// It returns true if the timer had been active, false if the timer had // It returns true if the timer had been active, false if the timer had
// expired or been stopped. // expired or been stopped.
func (t *Timer) Reset(d Duration) bool { func (t *Timer) Reset(d Duration) bool {
if t.r.f == nil {
panic("time: Reset called on uninitialized Timer")
}
w := when(d) w := when(d)
active := stopTimer(&t.r) active := stopTimer(&t.r)
t.r.when = w t.r.when = w
......
...@@ -9,6 +9,7 @@ import ( ...@@ -9,6 +9,7 @@ import (
"fmt" "fmt"
"runtime" "runtime"
"sort" "sort"
"strings"
"sync" "sync"
"sync/atomic" "sync/atomic"
"testing" "testing"
...@@ -407,3 +408,23 @@ func TestOverflowRuntimeTimer(t *testing.T) { ...@@ -407,3 +408,23 @@ func TestOverflowRuntimeTimer(t *testing.T) {
// the end of CheckRuntimeTimerOverflow in internal_test.go. // the end of CheckRuntimeTimerOverflow in internal_test.go.
CheckRuntimeTimerOverflow() CheckRuntimeTimerOverflow()
} }
func checkZeroPanicString(t *testing.T) {
e := recover()
s, _ := e.(string)
if want := "called on uninitialized Timer"; !strings.Contains(s, want) {
t.Errorf("panic = %v; want substring %q", e, want)
}
}
func TestZeroTimerResetPanics(t *testing.T) {
defer checkZeroPanicString(t)
var tr Timer
tr.Reset(1)
}
func TestZeroTimerStopPanics(t *testing.T) {
defer checkZeroPanicString(t)
var tr Timer
tr.Stop()
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment