diff options
Diffstat (limited to 'src/libthread/ucontext.c')
| -rw-r--r-- | src/libthread/ucontext.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/libthread/ucontext.c b/src/libthread/ucontext.c new file mode 100644 index 00000000..60f803d3 --- /dev/null +++ b/src/libthread/ucontext.c @@ -0,0 +1,41 @@ +#include "threadimpl.h" + +void +_threadinitstack(Thread *t, void (*f)(void*), void *arg) +{ + sigset_t zero; + + /* do a reasonable initialization */ + memset(&t->sched.uc, 0, sizeof t->sched.uc); + sigemptyset(&zero); + sigprocmask(SIG_BLOCK, &zero, &t->sched.uc.uc_sigmask); + + /* call getcontext, because on Linux makecontext neglects floating point */ + getcontext(&t->sched.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); +} + +void +_threadinswitch(int enter) +{ + USED(enter); +} + +void +_threadstacklimit(void *bottom, void *top) +{ + USED(bottom); + USED(top); +} + +void +_swaplabel(Label *old, Label *new) +{ + if(swapcontext(&old->uc, &new->uc) < 0) + sysfatal("swapcontext: %r"); +} + |
