summaryrefslogtreecommitdiffstats
path: root/src/libthread/ucontext.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2004-09-23 03:01:36 +0000
committerrsc <devnull@localhost>2004-09-23 03:01:36 +0000
commit7966faa931bfa9cf4ca53dd2d5b6e1eb0f174411 (patch)
treecbf2c9099f0d78c2c26aeea687803d43049db521 /src/libthread/ucontext.c
parentc6687d4591964cb13df87f55ec4770e778a4a55c (diff)
downloadplan9port-7966faa931bfa9cf4ca53dd2d5b6e1eb0f174411.tar.gz
plan9port-7966faa931bfa9cf4ca53dd2d5b6e1eb0f174411.zip
Continue fighting pthreads.
Clean up thread library a bit too.
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