aboutsummaryrefslogtreecommitdiff
path: root/src/libthread/ucontext.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libthread/ucontext.c')
-rw-r--r--src/libthread/ucontext.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/src/libthread/ucontext.c b/src/libthread/ucontext.c
index 60f803d3..b1c5ef53 100644
--- a/src/libthread/ucontext.c
+++ b/src/libthread/ucontext.c
@@ -6,17 +6,18 @@ _threadinitstack(Thread *t, void (*f)(void*), void *arg)
sigset_t zero;
/* do a reasonable initialization */
- memset(&t->sched.uc, 0, sizeof t->sched.uc);
+ memset(&t->context.uc, 0, sizeof t->context.uc);
sigemptyset(&zero);
- sigprocmask(SIG_BLOCK, &zero, &t->sched.uc.uc_sigmask);
+ sigprocmask(SIG_BLOCK, &zero, &t->context.uc.uc_sigmask);
/* call getcontext, because on Linux makecontext neglects floating point */
- getcontext(&t->sched.uc);
+ getcontext(&t->context.uc);
/* call makecontext to do the real work. */
- t->sched.uc.uc_stack.ss_sp = t->stk;
- t->sched.uc.uc_stack.ss_size = t->stksize;
- makecontext(&t->sched.uc, (void(*)())f, 1, arg);
+ /* leave a few words open on both ends */
+ t->context.uc.uc_stack.ss_sp = t->stk+8;
+ t->context.uc.uc_stack.ss_size = t->stksize-16;
+ makecontext(&t->context.uc, (void(*)())f, 1, arg);
}
void