#include "pth_p.h" #include #include #include #include #ifndef CURRENT_STACK_FRAME #define CURRENT_STACK_FRAME ({ char __csf; &__csf; }) #endif /* CURRENT_STACK_FRAME */ pth_mctx_t main_context; int threadnum = 0; /* int *__errno_location() { static pth_mctx_t ctx; errno_shield { pth_mctx_save (&ctx); } return &ctx.error; return &main_context.error; } */ void thread (char *str) { printf ("1.1: current stack frame: %p\n", CURRENT_STACK_FRAME); printf ("1.1: sleeping 2s in thread %d...\n", threadnum); sleep (2); printf ("1.1: current stack frame: %p\n", CURRENT_STACK_FRAME); printf ("1.1: returning to cothread 0\n"); pth_mctx_restore (&main_context); } void pthread (void* unused) { pth_mctx_t ctx; char *skaddr; printf ("1: saving the main context\n"); printf ("1: current stack frame: %p\n", CURRENT_STACK_FRAME); pth_mctx_save (&main_context); while (1) { skaddr = malloc (1024 * 1024); printf ("1: current stack frame: %p\n", CURRENT_STACK_FRAME); printf ("1: spawning a new cothread\n"); pth_mctx_set (&ctx, thread, skaddr, skaddr + 1024 * 1024); printf ("1: new thread's stack frame will be in the heap at %p\n", skaddr); printf ("1: current stack frame: %p\n", CURRENT_STACK_FRAME); printf ("1: switching to cothread %d...\n", ++threadnum); printf ("1: current stack frame: %p\n", CURRENT_STACK_FRAME); pth_mctx_switch (&main_context, &ctx); printf ("1: current stack frame: %p\n", CURRENT_STACK_FRAME); printf ("1: back now, looping\n"); } } int main (int argc, char *argv[]) { pthread_t tid; printf ("0: current stack frame: %p\n", CURRENT_STACK_FRAME); printf ("0: creating the pthread\n"); pthread_create (&tid, NULL, pthread, NULL); // printf ("joining the pthread\n"); // pthread_join (tid, NULL); printf ("0: current stack frame: %p\n", CURRENT_STACK_FRAME); printf ("0: take five...\n"); sleep(5); printf ("0 current stack frame: %p\n", CURRENT_STACK_FRAME); printf ("exiting\n"); exit (0); }