
/*
 * Simple user-level context switch example
 */
#include <stdlib.h>
#include <ucontext.h>

#define STACK_SIZE            10240
#define LOOP_COUNT	5000000

typedef struct PCB {
          struct PCB *next;
          struct PCB *prev;
          ucontext_t context;
          void       *function;
          void       **argv;
} PCB;

void init_context( PCB *pcb, void *function, void **argv, void *ss)
{
     bzero( pcb, sizeof(PCB) );
     getcontext( &pcb->context );
     pcb->context.uc_stack.ss_sp = ss;
     pcb->context.uc_stack.ss_size = (size_t) STACK_SIZE;
     pcb->function = function;
     pcb->argv = argv;
     makecontext( &pcb->context, void (*function) (void), 0 );
}

void start_thread( void (*function_name) (void), void **argv, void *stack);
void run( void );
void yield( void );
void function_1( void );
void function_2( void );
void function_3( void );
void enQueue( void **queue, PCB *new_pcb );
PCB *deQueue( void **queue );



