--- deliantra/server/include/util.h 2008/04/01 19:50:38 1.65 +++ deliantra/server/include/util.h 2008/04/02 11:13:55 1.66 @@ -45,6 +45,8 @@ #define expect_false(expr) expect ((expr) != 0, 0) #define expect_true(expr) expect ((expr) != 0, 1) +#include + #include #include #include @@ -82,6 +84,7 @@ #define IN_RANGE_EXC(val,beg,end) \ ((unsigned int)(val) - (unsigned int)(beg) < (unsigned int)(end) - (unsigned int)(beg)) +void cleanup (const char *cause, bool make_core = false); void fork_abort (const char *msg); // rationale for using (U) not (T) is to reduce signed/unsigned issues, @@ -570,5 +573,43 @@ // like sprintf, but returns a "static" buffer const char *format (const char *format, ...); +///////////////////////////////////////////////////////////////////////////// +// threads, very very thin wrappers around pthreads + +struct thread +{ + pthread_t id; + + void start (void *(*start_routine)(void *), void *arg = 0); + + void cancel () + { + pthread_cancel (id); + } + + void *join () + { + void *ret; + + if (pthread_join (id, &ret)) + cleanup ("pthread_join failed", 1); + + return ret; + } +}; + +// note that mutexes are not classes +typedef pthread_mutex_t smutex; + +#if __linux && defined (PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP) + #define SMUTEX_INITIALISER PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP +#else + #define SMUTEX_INITIALISER PTHREAD_MUTEX_INITIALIZER +#endif + +#define SMUTEX(name) smutex name = SMUTEX_INITIALISER +#define SMUTEX_LOCK(name) pthread_mutex_lock (&(name)) +#define SMUTEX_UNLOCK(name) pthread_mutex_unlock (&(name)) + #endif