From 5887f142a33fbb8da94088e902ced4101a16aa8f Mon Sep 17 00:00:00 2001 From: Dmitriy Vyukov Date: Wed, 17 Jul 2013 12:52:37 -0400 Subject: runtime: more reliable preemption Currently preemption signal g->stackguard0==StackPreempt can be lost if it is received when preemption is disabled (e.g. m->lock!=0). This change duplicates the preemption signal in g->preempt and restores g->stackguard0 when preemption is enabled. Update #543. R=golang-dev, rsc CC=golang-dev https://golang.org/cl/10792043 --- src/pkg/runtime/stack.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/pkg/runtime/stack.c') diff --git a/src/pkg/runtime/stack.c b/src/pkg/runtime/stack.c index 9de692bba4..2ba29956b1 100644 --- a/src/pkg/runtime/stack.c +++ b/src/pkg/runtime/stack.c @@ -250,7 +250,7 @@ runtime·newstack(void) // We are interested in preempting user Go code, not runtime code. if(oldstatus != Grunning || m->locks || m->mallocing || m->gcing) { // Let the goroutine keep running for now. - // TODO(dvyukov): remember but delay the preemption. + // gp->preempt is set, so it will be preempted next time. gp->stackguard0 = gp->stackguard; gp->status = oldstatus; runtime·gogo(&gp->sched); // never return -- cgit v1.3