Commit fe725c00 by Ian Lance Taylor

runtime: Make all variables used across getcontext volatile.

From-SVN: r187549
parent eb606595
...@@ -1322,7 +1322,7 @@ __go_go(void (*fn)(void*), void* arg) ...@@ -1322,7 +1322,7 @@ __go_go(void (*fn)(void*), void* arg)
{ {
byte *sp; byte *sp;
size_t spsize; size_t spsize;
G * volatile newg; // volatile to avoid longjmp warning G *newg;
schedlock(); schedlock();
...@@ -1363,19 +1363,26 @@ __go_go(void (*fn)(void*), void* arg) ...@@ -1363,19 +1363,26 @@ __go_go(void (*fn)(void*), void* arg)
if(sp == nil) if(sp == nil)
runtime_throw("nil g->stack0"); runtime_throw("nil g->stack0");
getcontext(&newg->context); {
newg->context.uc_stack.ss_sp = sp; // Avoid warnings about variables clobbered by
// longjmp.
byte * volatile vsp = sp;
size_t volatile vspsize = spsize;
G * volatile vnewg = newg;
getcontext(&vnewg->context);
vnewg->context.uc_stack.ss_sp = vsp;
#ifdef MAKECONTEXT_STACK_TOP #ifdef MAKECONTEXT_STACK_TOP
newg->context.uc_stack.ss_sp += spsize; vnewg->context.uc_stack.ss_sp += vspsize;
#endif #endif
newg->context.uc_stack.ss_size = spsize; vnewg->context.uc_stack.ss_size = vspsize;
makecontext(&newg->context, kickoff, 0); makecontext(&vnewg->context, kickoff, 0);
newprocreadylocked(newg); newprocreadylocked(vnewg);
schedunlock(); schedunlock();
return newg; return vnewg;
//printf(" goid=%d\n", newg->goid); }
} }
// Put on gfree list. Sched must be locked. // Put on gfree list. Sched must be locked.
......
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