00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00022 #ifndef LOG4CPLUS_HELPERS_THREAD_CONFIG_HEADER_
00023 #define LOG4CPLUS_HELPERS_THREAD_CONFIG_HEADER_
00024
00025 #define INCLUDE_CSTDDEF
00026 #include "dcmtk/ofstd/ofstdinc.h"
00027
00028 #ifdef LOG4CPLUS_USE_PTHREADS
00029 # include <pthread.h>
00030 # include <semaphore.h>
00031 # define LOG4CPLUS_MUTEX_PTR_DECLARE pthread_mutex_t*
00032 # define LOG4CPLUS_MUTEX_CREATE ::log4cplus::thread::createNewMutex()
00033 # define LOG4CPLUS_MUTEX_LOCK(mutex) pthread_mutex_lock(mutex)
00034 # define LOG4CPLUS_MUTEX_UNLOCK(mutex) pthread_mutex_unlock(mutex)
00035 # define LOG4CPLUS_MUTEX_FREE(mutex) ::log4cplus::thread::deleteMutex(mutex)
00036 # define LOG4CPLUS_THREAD_HANDLE_TYPE pthread_t
00037 # define LOG4CPLUS_THREAD_KEY_TYPE pthread_t
00038 # define LOG4CPLUS_GET_CURRENT_THREAD_NAME \
00039 ::log4cplus::thread::getCurrentThreadName()
00040 # define LOG4CPLUS_GET_CURRENT_THREAD pthread_self()
00041 # define LOG4CPLUS_THREAD_LOCAL_TYPE pthread_key_t*
00042 # define LOG4CPLUS_THREAD_LOCAL_INIT(cleanup) \
00043 ::log4cplus::thread::createPthreadKey(cleanup)
00044 # define LOG4CPLUS_GET_THREAD_LOCAL_VALUE(key) pthread_getspecific(*(key))
00045 # define LOG4CPLUS_SET_THREAD_LOCAL_VALUE(key, value) \
00046 pthread_setspecific(*(key), value)
00047 # define LOG4CPLUS_THREAD_LOCAL_CLEANUP(key) \
00048 do { pthread_key_t * pthkey (key); pthread_key_delete(*pthkey); \
00049 delete pthkey; } while(0)
00050 namespace log4cplus {
00051 namespace thread {
00052 LOG4CPLUS_EXPORT LOG4CPLUS_MUTEX_PTR_DECLARE createNewMutex();
00053 LOG4CPLUS_EXPORT void deleteMutex(LOG4CPLUS_MUTEX_PTR_DECLARE);
00054 LOG4CPLUS_EXPORT LOG4CPLUS_THREAD_LOCAL_TYPE createPthreadKey(void (*) (void *));
00055 }
00056 }
00057
00058 #elif defined(LOG4CPLUS_USE_WIN32_THREADS)
00059 # undef WIN32_LEAN_AND_MEAN
00060 # define WIN32_LEAN_AND_MEAN
00061 # include <windows.h>
00062
00063 # define LOG4CPLUS_MUTEX_PTR_DECLARE CRITICAL_SECTION*
00064 # define LOG4CPLUS_MUTEX_CREATE ::log4cplus::thread::createNewMutex()
00065 # define LOG4CPLUS_MUTEX_LOCK(mutex) EnterCriticalSection(mutex)
00066 # define LOG4CPLUS_MUTEX_UNLOCK(mutex) LeaveCriticalSection(mutex)
00067 # define LOG4CPLUS_MUTEX_FREE(mutex) ::log4cplus::thread::deleteMutex(mutex)
00068
00069 # define LOG4CPLUS_THREAD_HANDLE_TYPE HANDLE
00070 # define LOG4CPLUS_THREAD_KEY_TYPE DWORD
00071 # define LOG4CPLUS_GET_CURRENT_THREAD GetCurrentThreadId()
00072 # define LOG4CPLUS_GET_CURRENT_THREAD_NAME \
00073 ::log4cplus::thread::getCurrentThreadName()
00074 # define LOG4CPLUS_THREAD_LOCAL_TYPE DWORD
00075 # define LOG4CPLUS_THREAD_LOCAL_INIT(cleanup) TlsAlloc()
00076 # define LOG4CPLUS_GET_THREAD_LOCAL_VALUE(key) TlsGetValue(key)
00077 # define LOG4CPLUS_SET_THREAD_LOCAL_VALUE(key, value) \
00078 TlsSetValue(key, OFstatic_cast(LPVOID, value))
00079 # define LOG4CPLUS_THREAD_LOCAL_CLEANUP(key) TlsFree(key)
00080 # if defined (_MSC_VER)
00081 # undef LOG4CPLUS_HAVE_TLS_SUPPORT
00082 # undef LOG4CPLUS_THREAD_LOCAL_VAR
00083
00084
00085
00086
00087 # define LOG4CPLUS_HAVE_TLS_SUPPORT 1
00088 # define LOG4CPLUS_THREAD_LOCAL_VAR __declspec(thread)
00089 # endif
00090
00091
00092 namespace log4cplus { namespace thread {
00093
00094 LOG4CPLUS_EXPORT LOG4CPLUS_MUTEX_PTR_DECLARE createNewMutex();
00095 LOG4CPLUS_EXPORT void deleteMutex(LOG4CPLUS_MUTEX_PTR_DECLARE);
00096
00097 } }
00098
00099 #elif defined(LOG4CPLUS_SINGLE_THREADED)
00100 # define LOG4CPLUS_MUTEX_PTR_DECLARE int*
00101 # define LOG4CPLUS_MUTEX_CREATE NULL
00102 # define LOG4CPLUS_MUTEX_LOCK(mutex)
00103 # define LOG4CPLUS_MUTEX_UNLOCK(mutex)
00104 # define LOG4CPLUS_MUTEX_FREE(mutex)
00105 # define LOG4CPLUS_THREAD_HANDLE_TYPE void *
00106 # define LOG4CPLUS_THREAD_KEY_TYPE int
00107 # define LOG4CPLUS_GET_CURRENT_THREAD 1
00108 # define LOG4CPLUS_GET_CURRENT_THREAD_NAME \
00109 LOG4CPLUS_C_STR_TO_TSTRING("single")
00110 # define LOG4CPLUS_THREAD_LOCAL_TYPE void*
00111 # define LOG4CPLUS_THREAD_LOCAL_INIT(cleanup) NULL
00112 # define LOG4CPLUS_GET_THREAD_LOCAL_VALUE(key) (key)
00113 # define LOG4CPLUS_SET_THREAD_LOCAL_VALUE(key, value) \
00114 do { (key) = (value); } while (0)
00115 # define LOG4CPLUS_THREAD_LOCAL_CLEANUP(key) do { (key) = NULL; } while (0)
00116 # undef LOG4CPLUS_HAVE_TLS_SUPPORT
00117 # undef LOG4CPLUS_THREAD_LOCAL_VAR
00118
00119 #else
00120 # error "You Must define a Threading model"
00121 #endif
00122
00134 #ifndef LOG4CPLUS_SINGLE_THREADED
00135 # define LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX(mutex) \
00136 do { ::log4cplus::thread::Guard _sync_guard_object(mutex);
00137 #else
00138 # define LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX(mutex) do { (void)(mutex);
00139 #endif
00140
00141 #define LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX } while (0)
00142
00143
00144 #endif // LOG4CPLUS_HELPERS_THREAD_CONFIG_HEADER_
00145