Commit dc6726b3 authored by Dmitriy Vyukov's avatar Dmitriy Vyukov

runtime: fix timers crash

Timer callbacks occasionally crash
with "sched while holding locks" message.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5381043
parent 0a8005c7
......@@ -149,6 +149,8 @@ timerproc(void)
{
int64 delta, now;
Timer *t;
void (*f)(int64, Eface);
Eface arg;
for(;;) {
runtime·lock(&timers);
......@@ -173,7 +175,11 @@ timerproc(void)
siftdown(0);
t->i = -1; // mark as removed
}
t->f(now, t->arg);
f = t->f;
arg = t->arg;
runtime·unlock(&timers);
f(now, arg);
runtime·lock(&timers);
}
if(delta < 0) {
// No timers left - put goroutine to sleep.
......
......@@ -7,7 +7,9 @@ package time_test
import (
"errors"
"fmt"
"runtime"
"sort"
"sync/atomic"
"testing"
. "time"
)
......@@ -47,6 +49,20 @@ func TestAfterFunc(t *testing.T) {
<-c
}
func TestAfterStress(t *testing.T) {
stop := uint32(0)
go func() {
for atomic.LoadUint32(&stop) == 0 {
runtime.GC()
}
}()
c := Tick(1)
for i := 0; i < 100; i++ {
<-c
}
atomic.StoreUint32(&stop, 1)
}
func BenchmarkAfterFunc(b *testing.B) {
i := b.N
c := make(chan bool)
......
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