when changing process state to Gsyscall, not after.
R=r
DELTA=8 (4 added, 3 deleted, 1 changed)
OCL=30320
CL=30325
if(debug > 1) {
lock(&debuglock);
printf("m%d run g%d at %p\n", m->id, gp->goid, gp->sched.PC);
- traceback(gp->sched.PC, gp->sched.SP+8, gp);
+ traceback(gp->sched.PC, gp->sched.SP+sizeof(uintptr), gp);
unlock(&debuglock);
}
m->curg = gp;
}
lock(&sched);
g->status = Gsyscall;
+ // Leave SP around for gc and traceback.
+ // Do before notewakeup so that gc
+ // never sees Gsyscall with wrong stack.
+ gosave(&g->sched);
sched.mcpu--;
sched.msyscall++;
if(sched.gwait != 0)
notewakeup(&sched.stopped);
}
unlock(&sched);
- // leave SP around for gc and traceback
- gosave(&g->sched);
}
// The goroutine g exited its system call.
{
Defer *d;
byte *sp, *fn;
- uintptr *caller;
d = g->defer;
if(d == nil)