time: fix timer stop
Due to data structure corruption,
some timers could not be removed.
Fixes #2495.
R=golang-dev, adg
CC=golang-dev, mdbrown
https://golang.org/cl/5437060
diff --git a/src/pkg/runtime/time.goc b/src/pkg/runtime/time.goc
index 23ad1aa..ad9f3aa 100644
--- a/src/pkg/runtime/time.goc
+++ b/src/pkg/runtime/time.goc
@@ -133,9 +133,16 @@
return false;
}
- timers.t[i] = timers.t[--timers.len];
- siftup(i);
- siftdown(i);
+ timers.len--;
+ if(i == timers.len) {
+ timers.t[i] = nil;
+ } else {
+ timers.t[i] = timers.t[timers.len];
+ timers.t[timers.len] = nil;
+ timers.t[i]->i = i;
+ siftup(i);
+ siftdown(i);
+ }
runtime·unlock(&timers);
return true;
}