This is following CL 156038. doscanstackswitch uses the same
mechanism of switching goroutines as getTraceback, and so has
the same problem as described in issue golang/go#29448. This CL
applies the same fix.
Reviewed-on: https://go-review.googlesource.com/c/156697
From-SVN: r267661
-c8a9bccbc524381d150c84907a61ac257c1b07cc
+085ef4556ec810a5a9c422e7b86d98441dc92e86
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
void
doscanstackswitch(G* me, G* gp)
{
void
doscanstackswitch(G* me, G* gp)
{
__go_assert(me->entry == nil);
me->fromgogo = false;
__go_assert(me->entry == nil);
me->fromgogo = false;
+ holdm = gp->m;
+ gp->m = me->m;
+
#ifdef USING_SPLIT_STACK
__splitstack_getcontext((void*)(&me->stackcontext[0]));
#endif
#ifdef USING_SPLIT_STACK
__splitstack_getcontext((void*)(&me->stackcontext[0]));
#endif
if (gp->scang != 0)
runtime_gogo(gp);
if (gp->scang != 0)
runtime_gogo(gp);
}
// Do a stack scan, then switch back to the g that triggers this scan.
}
// Do a stack scan, then switch back to the g that triggers this scan.
gscanstack(G *gp)
{
G *oldg, *oldcurg;
gscanstack(G *gp)
{
G *oldg, *oldcurg;
oldg = (G*)gp->scang;
oldcurg = oldg->m->curg;
oldg = (G*)gp->scang;
oldcurg = oldg->m->curg;
- holdm = gp->m;
- if(holdm != nil && holdm != g->m)
- runtime_throw("gscanstack: m is not nil");
gp->scang = 0;
doscanstack(gp, (void*)gp->scangcw);
gp->scangcw = 0;
gp->scang = 0;
doscanstack(gp, (void*)gp->scangcw);
gp->scangcw = 0;
oldg->m->curg = oldcurg;
runtime_gogo(oldg);
}
oldg->m->curg = oldcurg;
runtime_gogo(oldg);
}