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) do { pthread_mutex_lock(mtx); } while(0)
00035 #define TDS_MUTEX_TRYLOCK(mtx) pthread_mutex_trylock(mtx)
00036 #define TDS_MUTEX_UNLOCK(mtx) do { pthread_mutex_unlock(mtx); } while(0)
00037 #define TDS_MUTEX_DECLARE(name) pthread_mutex_t name
00038 #define TDS_MUTEX_INIT(mtx) pthread_mutex_init(mtx, NULL)
00039 #define TDS_MUTEX_FREE(mtx) do { pthread_mutex_destroy(mtx); } while(0)
00040
00041 #define TDS_HAVE_MUTEX 1
00042
00043 #elif defined(_WIN32)
00044
00045 struct ptw32_mcs_node_t_;
00046
00047 typedef struct tds_win_mutex_t_ {
00048 struct ptw32_mcs_node_t_ *lock;
00049 LONG done;
00050 CRITICAL_SECTION crit;
00051 } tds_win_mutex_t;
00052
00053 void tds_win_mutex_lock(tds_win_mutex_t *mutex);
00054 int tds_win_mutex_trylock(tds_win_mutex_t *mutex);
00055 static inline int tds_win_mutex_init(tds_win_mutex_t *mtx)
00056 {
00057 mtx->lock = NULL;
00058 mtx->done = 0;
00059 return 0;
00060 }
00061
00062
00063 #define TDS_MUTEX_DEFINE(name) tds_win_mutex_t name = { NULL, 0 }
00064 #define TDS_MUTEX_LOCK(mtx) \
00065 do { if ((mtx)->done) EnterCriticalSection(&(mtx)->crit); else tds_win_mutex_lock(mtx); } while(0)
00066 #define TDS_MUTEX_TRYLOCK(mtx) tds_win_mutex_trylock(mtx)
00067 #define TDS_MUTEX_UNLOCK(mtx) LeaveCriticalSection(&(mtx)->crit)
00068 #define TDS_MUTEX_DECLARE(name) tds_win_mutex_t name
00069 #define TDS_MUTEX_INIT(mtx) tds_win_mutex_init(mtx)
00070 #define TDS_MUTEX_FREE(mtx) do { if ((mtx)->done) { DeleteCriticalSection(&(mtx)->crit); (mtx)->done = 0; } } while(0)
00071
00072 #define TDS_HAVE_MUTEX 1
00073
00074 #else
00075
00076
00077 #define TDS_MUTEX_DEFINE(name) int name
00078 #define TDS_MUTEX_LOCK(mtx) do { ; } while(0)
00079 #define TDS_MUTEX_TRYLOCK(mtx) 0
00080 #define TDS_MUTEX_UNLOCK(mtx) do { ; } while(0)
00081 #define TDS_MUTEX_DECLARE(name) int name
00082 #define TDS_MUTEX_INIT(mtx) 0
00083 #define TDS_MUTEX_FREE(mtx) do { ; } while(0)
00084
00085 #endif
00086
00087 #endif