runtime: Use getcontext, not setjmp, to save regs for GC.
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 May 2012 16:57:23 +0000 (16:57 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 May 2012 16:57:23 +0000 (16:57 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@187777 138bc75d-0d04-0410-961f-82ee72b054a4

libgo/runtime/proc.c
libgo/runtime/runtime.h

index 890b492..ade8b9e 100644 (file)
@@ -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.
index 9104418..67dabd2 100644 (file)
@@ -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