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