/** @file */ #include #include #include "list.h" #define MYTHREAD_STACK_SIZE (64*1024) /* 64 ko */ typedef unsigned mythread_attr_t; typedef unsigned mythread_mutexattr_t; typedef unsigned mythread_condattr_t; typedef void*(*mythread_func_t)(void*); enum _mythread_status_e { active, ready, wait_join, wait_cond, wait_mutex, terminated }; LIST_TYPE(mythread, struct ucontext ucp; enum _mythread_status_e status; mythread_t joining; void*result; ); struct mythread_mutex_s { int count; mythread_t holder; mythread_list_t chain; }; typedef struct mythread_mutex_s mythread_mutex_t; struct mythread_cond_s { mythread_list_t chain; }; typedef struct mythread_cond_s mythread_cond_t; /* ********************************************************* */ /* utilisation : on déclare mythread_main(int argc, char**argv) * dans le programme utilisateur. Le vrai main et dans la lib 'mythread'. */ int mythread_main(int argc, char**argv); void mythread_init(int argc, char**argv); mythread_t mythread_self(void); void mythread_yield(void); int mythread_create(mythread_t*, const mythread_attr_t*, mythread_func_t, void*); int mythread_join(mythread_t, void**); int mythread_mutex_init(mythread_mutex_t*, const mythread_mutexattr_t*); int mythread_mutex_destroy(mythread_mutex_t*); int mythread_mutex_lock(mythread_mutex_t*); int mythread_mutex_unlock(mythread_mutex_t*); int mythread_cond_init(mythread_cond_t*, mythread_condattr_t*); int mythread_cond_destroy(mythread_cond_t*); int mythread_cond_signal(mythread_cond_t*); int mythread_cond_broadcast(mythread_cond_t*); int mythread_cond_wait(mythread_cond_t*, mythread_mutex_t*);