summaryrefslogtreecommitdiff
path: root/libgo
diff options
context:
space:
mode:
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2012-05-22 16:57:23 +0000
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2012-05-22 16:57:23 +0000
commit2fb62959965d4fcb138db18c5c6e20b99edb0bfe (patch)
tree4519e817522fc93f7bdd2860a46165fd4ab038c5 /libgo
parentc93570ad9b8a36a59f9452dd7a785f230fce96d2 (diff)
downloadgcc-2fb62959965d4fcb138db18c5c6e20b99edb0bfe.tar.gz
runtime: Use getcontext, not setjmp, to save regs for GC.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@187777 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgo')
-rw-r--r--libgo/runtime/proc.c8
-rw-r--r--libgo/runtime/runtime.h3
2 files changed, 4 insertions, 7 deletions
diff --git a/libgo/runtime/proc.c b/libgo/runtime/proc.c
index 890b492d404..ade8b9e2db1 100644
--- a/libgo/runtime/proc.c
+++ b/libgo/runtime/proc.c
@@ -1239,9 +1239,7 @@ runtime_entersyscall(void)
// Save the registers in the g structure so that any pointers
// held in registers will be seen by the garbage collector.
- // We could use getcontext here, but setjmp is more efficient
- // because it doesn't need to save the signal mask.
- setjmp(g->gcregs);
+ getcontext(&g->gcregs);
g->status = Gsyscall;
@@ -1299,7 +1297,7 @@ runtime_exitsyscall(void)
gp->gcstack = nil;
#endif
gp->gcnext_sp = nil;
- runtime_memclr(gp->gcregs, sizeof gp->gcregs);
+ runtime_memclr(&gp->gcregs, sizeof gp->gcregs);
if(m->profilehz > 0)
runtime_setprof(true);
@@ -1328,7 +1326,7 @@ runtime_exitsyscall(void)
gp->gcstack = nil;
#endif
gp->gcnext_sp = nil;
- runtime_memclr(gp->gcregs, sizeof gp->gcregs);
+ runtime_memclr(&gp->gcregs, sizeof gp->gcregs);
}
// Allocate a new g, with a stack big enough for stacksize bytes.
diff --git a/libgo/runtime/runtime.h b/libgo/runtime/runtime.h
index 91044184b1f..67dabd26b14 100644
--- a/libgo/runtime/runtime.h
+++ b/libgo/runtime/runtime.h
@@ -7,7 +7,6 @@
#include "config.h"
#include "go-assert.h"
-#include <setjmp.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
@@ -128,7 +127,7 @@ struct G
void* gcnext_segment;
void* gcnext_sp;
void* gcinitial_sp;
- jmp_buf gcregs;
+ ucontext_t gcregs;
byte* entry; // initial function
G* alllink; // on allg
void* param; // passed parameter on wakeup