summaryrefslogtreecommitdiff
path: root/libgo
diff options
context:
space:
mode:
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2012-05-15 18:56:48 +0000
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2012-05-15 18:56:48 +0000
commit2df23bfc858f212298fba49a4dee5fb4616e1286 (patch)
tree13237911691923e59273af3da119f118ad1f4fc3 /libgo
parent07dd0175de047b9ca1d78f7908a2d1c9752b24d9 (diff)
downloadgcc-2df23bfc858f212298fba49a4dee5fb4616e1286.tar.gz
runtime: Make all variables used across getcontext volatile.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@187549 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgo')
-rw-r--r--libgo/runtime/proc.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/libgo/runtime/proc.c b/libgo/runtime/proc.c
index eabd5e82664..0862c604640 100644
--- a/libgo/runtime/proc.c
+++ b/libgo/runtime/proc.c
@@ -1322,7 +1322,7 @@ __go_go(void (*fn)(void*), void* arg)
{
byte *sp;
size_t spsize;
- G * volatile newg; // volatile to avoid longjmp warning
+ G *newg;
schedlock();
@@ -1363,19 +1363,26 @@ __go_go(void (*fn)(void*), void* arg)
if(sp == nil)
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
- newg->context.uc_stack.ss_sp += spsize;
+ vnewg->context.uc_stack.ss_sp += vspsize;
#endif
- newg->context.uc_stack.ss_size = spsize;
- makecontext(&newg->context, kickoff, 0);
+ vnewg->context.uc_stack.ss_size = vspsize;
+ makecontext(&vnewg->context, kickoff, 0);
- newprocreadylocked(newg);
- schedunlock();
+ newprocreadylocked(vnewg);
+ schedunlock();
- return newg;
-//printf(" goid=%d\n", newg->goid);
+ return vnewg;
+ }
}
// Put on gfree list. Sched must be locked.