1 #ifndef ETTERCAP_THREADS_H 2 #define ETTERCAP_THREADS_H 3 4 #include <ec_stdint.h> 5 #include <pthread.h> 6 7 struct ec_thread { 8 char *name; 9 char *description; 10 int detached; 11 pthread_t id; 12 }; 13 14 #define PTHREAD_ID(id) (*(unsigned long*)&(id)) 15 16 #define EC_THREAD_FUNC(x) void * x(void *args) 17 #define EC_THREAD_PARAM args 18 19 EC_API_EXTERN char * ec_thread_getname(pthread_t id); 20 EC_API_EXTERN pthread_t ec_thread_getpid(char *name); 21 EC_API_EXTERN char * ec_thread_getdesc(pthread_t id); 22 EC_API_EXTERN void ec_thread_register_detached(pthread_t id, char *name, char *desc, int detached); 23 EC_API_EXTERN void ec_thread_register(pthread_t id, char *name, char *desc); 24 EC_API_EXTERN pthread_t ec_thread_new(char *name, char *desc, void *(*function)(void *), void *args); 25 EC_API_EXTERN pthread_t ec_thread_new_detached(char *name, char *desc, void *(*function)(void *), void *args, int detached); 26 EC_API_EXTERN void ec_thread_destroy(pthread_t id); 27 EC_API_EXTERN void ec_thread_init(void); 28 EC_API_EXTERN void ec_thread_kill_all(void); 29 EC_API_EXTERN void ec_thread_exit(void); 30 31 #define RETURN_IF_NOT_MAIN() do{ if (strcmp(ec_thread_getname(EC_PTHREAD_SELF), EC_GBL_PROGRAM)) return; }while(0) 32 33 #define CANCELLATION_POINT() pthread_testcancel() 34 35 #if defined(OS_DARWIN) || defined(OS_WINDOWS) || defined(OS_CYGWIN) 36 /* XXX - darwin and windows are broken, pthread_join hangs up forever */ 37 #define BROKEN_PTHREAD_JOIN 38 #endif 39 40 /* Mac OS X does not have it, and some other systems define it as enum */ 41 #ifndef HAVE_MUTEX_RECURSIVE_NP 42 #define PTHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE 43 #endif 44 45 #endif 46 47 /* EOF */ 48 49 // vim:ts=3:expandtab 50 51