00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef TDSTHREAD_H
00023 #define TDSTHREAD_H 1
00024
00025
00026
00027 #undef TDS_HAVE_MUTEX
00028
00029 #if defined(_THREAD_SAFE) && defined(TDS_HAVE_PTHREAD_MUTEX)
00030
00031 #include <pthread.h>
00032
00033 #define TDS_MUTEX_DEFINE(name) pthread_mutex_t name = PTHREAD_MUTEX_INITIALIZER
00034 #define TDS_MUTEX_LOCK(mtx) pthread_mutex_lock(mtx)
00035 #define TDS_MUTEX_UNLOCK(mtx) pthread_mutex_unlock(mtx)
00036 #define TDS_MUTEX_DECLARE(name) pthread_mutex_t name
00037 #define TDS_MUTEX_INIT(mtx) pthread_mutex_init(mtx, NULL)
00038 #define TDS_MUTEX_FREE(mtx) pthread_mutex_destroy(mtx)
00039
00040 #define TDS_HAVE_MUTEX 1
00041
00042 #elif defined(_WIN32)
00043
00044 struct ptw32_mcs_node_t_;
00045
00046 typedef struct tds_win_mutex_t_ {
00047 struct ptw32_mcs_node_t_ *lock;
00048 LONG done;
00049 CRITICAL_SECTION crit;
00050 } tds_win_mutex_t;
00051
00052 void tds_win_mutex_lock(tds_win_mutex_t *mutex);
00053 static inline int tds_win_mutex_init(tds_win_mutex_t *mtx)
00054 {
00055 mtx->lock = NULL;
00056 mtx->done = 0;
00057 return 0;
00058 }
00059
00060
00061 #define TDS_MUTEX_DEFINE(name) tds_win_mutex_t name = { NULL, 0 }
00062 #define TDS_MUTEX_LOCK(mtx) \
00063 do { if ((mtx)->done) EnterCriticalSection(&(mtx)->crit); else tds_win_mutex_lock(mtx); } while(0)
00064 #define TDS_MUTEX_UNLOCK(mtx) LeaveCriticalSection(&(mtx)->crit)
00065 #define TDS_MUTEX_DECLARE(name) tds_win_mutex_t name
00066 #define TDS_MUTEX_INIT(mtx) tds_win_mutex_init(mtx)
00067 #define TDS_MUTEX_FREE(mtx) do { if ((mtx)->done) { DeleteCriticalSection(&(mtx)->crit); (mtx)->done = 0; } } while(0)
00068
00069 #define TDS_HAVE_MUTEX 1
00070
00071 #else
00072
00073 #define TDS_MUTEX_DEFINE(name) int name
00074 #define TDS_MUTEX_LOCK(mtx)
00075 #define TDS_MUTEX_UNLOCK(mtx)
00076 #define TDS_MUTEX_DECLARE(name) int name
00077 #define TDS_MUTEX_INIT(mtx)
00078 #define TDS_MUTEX_FREE(mtx)
00079
00080 #endif
00081
00082 #endif