summaryrefslogtreecommitdiff
path: root/libgo/runtime/proc.c
diff options
context:
space:
mode:
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2011-12-21 22:24:47 +0000
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2011-12-21 22:24:47 +0000
commitdfcc5de0612ab74bb3329e22f5d6487de84c40a4 (patch)
treeb581b11b17c97821c10249103de061834481481d /libgo/runtime/proc.c
parent88f9060eb8b19564912ebca431808943c33ac6b5 (diff)
downloadgcc-dfcc5de0612ab74bb3329e22f5d6487de84c40a4.tar.gz
runtime: Catch signals on altstack, disable splitstack signal blocking.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@182607 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgo/runtime/proc.c')
-rw-r--r--libgo/runtime/proc.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/libgo/runtime/proc.c b/libgo/runtime/proc.c
index 34566fbf9a0..9225f825b88 100644
--- a/libgo/runtime/proc.c
+++ b/libgo/runtime/proc.c
@@ -29,6 +29,11 @@ extern void * __splitstack_resetcontext(void *context[10], size_t *);
extern void *__splitstack_find(void *, void *, size_t *, void **, void **,
void **);
+extern void __splitstack_block_signals (int *, int *);
+
+extern void __splitstack_block_signals_context (void *context[10], int *,
+ int *);
+
#endif
#if defined(USING_SPLIT_STACK) && defined(LINKER_SUPPORTS_SPLIT_STACK)
@@ -862,6 +867,14 @@ runtime_mstart(void* mp)
*(int*)0x21 = 0x21;
}
runtime_minit();
+
+#ifdef USING_SPLIT_STACK
+ {
+ int dont_block_signals = 0;
+ __splitstack_block_signals(&dont_block_signals, nil);
+ }
+#endif
+
schedule(nil);
return nil;
}
@@ -1142,9 +1155,13 @@ runtime_malg(int32 stacksize, byte** ret_stack, size_t* ret_stacksize)
newg = runtime_malloc(sizeof(G));
if(stacksize >= 0) {
#if USING_SPLIT_STACK
+ int dont_block_signals = 0;
+
*ret_stack = __splitstack_makecontext(stacksize,
&newg->stack_context[0],
ret_stacksize);
+ __splitstack_block_signals_context(&newg->stack_context[0],
+ &dont_block_signals, nil);
#else
*ret_stack = runtime_mallocgc(stacksize, FlagNoProfiling|FlagNoGC, 0, 0);
*ret_stacksize = stacksize;
@@ -1186,8 +1203,12 @@ __go_go(void (*fn)(void*), void* arg)
if((newg = gfget()) != nil){
#ifdef USING_SPLIT_STACK
+ int dont_block_signals = 0;
+
sp = __splitstack_resetcontext(&newg->stack_context[0],
&spsize);
+ __splitstack_block_signals_context(&newg->stack_context[0],
+ &dont_block_signals, nil);
#else
sp = newg->gcinitial_sp;
spsize = newg->gcstack_size;