Commit 72157c30 authored by Russ Cox's avatar Russ Cox

runtime: fix bad status throw

when garbage collector sees recovering goroutine

Fixes #711.

R=r
CC=golang-dev
https://golang.org/cl/869045
parent 2f0cae46
...@@ -135,6 +135,7 @@ mark(void) ...@@ -135,6 +135,7 @@ mark(void)
case Grunnable: case Grunnable:
case Gsyscall: case Gsyscall:
case Gwaiting: case Gwaiting:
case Grecovery:
scanstack(gp); scanstack(gp);
break; break;
} }
......
...@@ -461,9 +461,7 @@ scheduler(void) ...@@ -461,9 +461,7 @@ scheduler(void)
// unwind to the stack frame with d->sp in it. // unwind to the stack frame with d->sp in it.
unwindstack(gp, d->sp); unwindstack(gp, d->sp);
if(d->sp < gp->stackguard || gp->stackbase < d->sp)
throw("bad stack in recovery");
// make the deferproc for this d return again, // make the deferproc for this d return again,
// this time returning 1. function will jump to // this time returning 1. function will jump to
// standard return epilogue. // standard return epilogue.
...@@ -930,6 +928,11 @@ unwindstack(G *gp, byte *sp) ...@@ -930,6 +928,11 @@ unwindstack(G *gp, byte *sp)
gp->stackguard = top->stackguard; gp->stackguard = top->stackguard;
free(stk); free(stk);
} }
if(sp != nil && (sp < gp->stackguard - StackGuard || gp->stackbase < sp)) {
printf("recover: %p not in [%p, %p]\n", sp, gp->stackguard - StackGuard, gp->stackbase);
throw("bad unwindstack");
}
} }
static void static void
......
...@@ -92,6 +92,10 @@ extern register M* m; ...@@ -92,6 +92,10 @@ extern register M* m;
enum enum
{ {
// G status // G status
//
// If you add to this list, add to the list
// of "okay during garbage collection" status
// in mgc0.c too.
Gidle, Gidle,
Grunnable, Grunnable,
Grunning, Grunning,
......
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