Continue the pthreads torture.
This commit is contained in:
41
src/libthread/ucontext.c
Normal file
41
src/libthread/ucontext.c
Normal file
@@ -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");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user