31 lines · 616 B · C
RawDownload
#include "threadimpl.h" voidmakecontext(ucontext_t *ucp, void (*func)(void), int argc, ...){	int *sp; 	sp = (int*)ucp->uc_stack.ss_sp+ucp->uc_stack.ss_size/4;	sp -= argc;	/*	 * Stack pointer at call instruction (before return address	 * gets pushed) must be 16-byte aligned.	 */	if((uintptr)sp%4)		abort();	while((uintptr)sp%16)		sp--;	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;} intswapcontext(ucontext_t *oucp, ucontext_t *ucp){	if(getcontext(oucp) == 0)		setcontext(ucp);	return 0;}