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