| * FreeBSD 4 and earlier needs the context functions. |
| makecontext(ucontext_t *ucp, void (*func)(void), int argc, ...) |
| sp = (int*)ucp->uc_stack.ss_sp+ucp->uc_stack.ss_size/4; |
| memmove(sp, &argc+1, argc*sizeof(int)); |
| *--sp = 0; /* return address */ |
| ucp->uc_mcontext.mc_eip = (long)func; |
| ucp->uc_mcontext.mc_esp = (int)sp; |
| extern int getmcontext(mcontext_t*); |
| extern int setmcontext(mcontext_t*); |
| getcontext(ucontext_t *uc) |
| return getmcontext(&uc->uc_mcontext); |
| setcontext(ucontext_t *uc) |
| setmcontext(&uc->uc_mcontext); |
| swapcontext(ucontext_t *oucp, ucontext_t *ucp) |
| if(getcontext(oucp) == 0) |