runtime: Use getcontext, not setjmp, to save regs for GC.
From-SVN: r187777
This commit is contained in:
parent
3cd50158f5
commit
ef1f343258
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue