runtime: Make all variables used across getcontext volatile.

From-SVN: r187549
This commit is contained in:
Ian Lance Taylor 2012-05-15 18:56:48 +00:00
parent eb60659578
commit fe725c000b
1 changed files with 17 additions and 10 deletions

View File

@ -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)
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.