22 #ifndef LOG4CPLUS_HELPERS_THREAD_CONFIG_HEADER_
23 #define LOG4CPLUS_HELPERS_THREAD_CONFIG_HEADER_
25 #define INCLUDE_CSTDDEF
26 #include "dcmtk/ofstd/ofstdinc.h"
28 #ifdef LOG4CPLUS_USE_PTHREADS
30 # include <semaphore.h>
31 # define LOG4CPLUS_MUTEX_PTR_DECLARE pthread_mutex_t*
32 # define LOG4CPLUS_MUTEX_CREATE ::log4cplus::thread::createNewMutex()
33 # define LOG4CPLUS_MUTEX_LOCK(mutex) pthread_mutex_lock(mutex)
34 # define LOG4CPLUS_MUTEX_UNLOCK(mutex) pthread_mutex_unlock(mutex)
35 # define LOG4CPLUS_MUTEX_FREE(mutex) ::log4cplus::thread::deleteMutex(mutex)
36 # define LOG4CPLUS_THREAD_HANDLE_TYPE pthread_t
37 # define LOG4CPLUS_THREAD_KEY_TYPE pthread_t
38 # define LOG4CPLUS_GET_CURRENT_THREAD_NAME \
39 ::log4cplus::thread::getCurrentThreadName()
40 # define LOG4CPLUS_GET_CURRENT_THREAD pthread_self()
41 # define LOG4CPLUS_THREAD_LOCAL_TYPE pthread_key_t*
42 # define LOG4CPLUS_THREAD_LOCAL_INIT(cleanup) \
43 ::log4cplus::thread::createPthreadKey(cleanup)
44 # define LOG4CPLUS_GET_THREAD_LOCAL_VALUE(key) pthread_getspecific(*(key))
45 # define LOG4CPLUS_SET_THREAD_LOCAL_VALUE(key, value) \
46 pthread_setspecific(*(key), value)
47 # define LOG4CPLUS_THREAD_LOCAL_CLEANUP(key) \
48 do { pthread_key_t * pthkey (key); pthread_key_delete(*pthkey); \
49 delete pthkey; } while(0)
52 LOG4CPLUS_EXPORT LOG4CPLUS_MUTEX_PTR_DECLARE createNewMutex();
53 LOG4CPLUS_EXPORT
void deleteMutex(LOG4CPLUS_MUTEX_PTR_DECLARE);
54 LOG4CPLUS_EXPORT LOG4CPLUS_THREAD_LOCAL_TYPE createPthreadKey(
void (*) (
void *));
58 #elif defined(LOG4CPLUS_USE_WIN32_THREADS)
59 # undef WIN32_LEAN_AND_MEAN
60 # define WIN32_LEAN_AND_MEAN
63 # define LOG4CPLUS_MUTEX_PTR_DECLARE CRITICAL_SECTION*
64 # define LOG4CPLUS_MUTEX_CREATE ::log4cplus::thread::createNewMutex()
65 # define LOG4CPLUS_MUTEX_LOCK(mutex) EnterCriticalSection(mutex)
66 # define LOG4CPLUS_MUTEX_UNLOCK(mutex) LeaveCriticalSection(mutex)
67 # define LOG4CPLUS_MUTEX_FREE(mutex) ::log4cplus::thread::deleteMutex(mutex)
69 # define LOG4CPLUS_THREAD_HANDLE_TYPE HANDLE
70 # define LOG4CPLUS_THREAD_KEY_TYPE DWORD
71 # define LOG4CPLUS_GET_CURRENT_THREAD GetCurrentThreadId()
72 # define LOG4CPLUS_GET_CURRENT_THREAD_NAME \
73 ::log4cplus::thread::getCurrentThreadName()
74 # define LOG4CPLUS_THREAD_LOCAL_TYPE DWORD
75 # define LOG4CPLUS_THREAD_LOCAL_INIT(cleanup) TlsAlloc()
76 # define LOG4CPLUS_GET_THREAD_LOCAL_VALUE(key) TlsGetValue(key)
77 # define LOG4CPLUS_SET_THREAD_LOCAL_VALUE(key, value) \
78 TlsSetValue(key, OFstatic_cast(LPVOID, value))
79 # define LOG4CPLUS_THREAD_LOCAL_CLEANUP(key) TlsFree(key)
80 # if defined (_MSC_VER)
81 # undef LOG4CPLUS_HAVE_TLS_SUPPORT
82 # undef LOG4CPLUS_THREAD_LOCAL_VAR
87 # define LOG4CPLUS_HAVE_TLS_SUPPORT 1
88 # define LOG4CPLUS_THREAD_LOCAL_VAR __declspec(thread)
92 namespace log4cplus {
namespace thread {
94 LOG4CPLUS_EXPORT LOG4CPLUS_MUTEX_PTR_DECLARE createNewMutex();
95 LOG4CPLUS_EXPORT
void deleteMutex(LOG4CPLUS_MUTEX_PTR_DECLARE);
99 #elif defined(LOG4CPLUS_SINGLE_THREADED)
100 # define LOG4CPLUS_MUTEX_PTR_DECLARE int*
101 # define LOG4CPLUS_MUTEX_CREATE NULL
102 # define LOG4CPLUS_MUTEX_LOCK(mutex)
103 # define LOG4CPLUS_MUTEX_UNLOCK(mutex)
104 # define LOG4CPLUS_MUTEX_FREE(mutex)
105 # define LOG4CPLUS_THREAD_HANDLE_TYPE void *
106 # define LOG4CPLUS_THREAD_KEY_TYPE int
107 # define LOG4CPLUS_GET_CURRENT_THREAD 1
108 # define LOG4CPLUS_GET_CURRENT_THREAD_NAME \
109 LOG4CPLUS_C_STR_TO_TSTRING("single")
110 # define LOG4CPLUS_THREAD_LOCAL_TYPE void*
111 # define LOG4CPLUS_THREAD_LOCAL_INIT(cleanup) NULL
112 # define LOG4CPLUS_GET_THREAD_LOCAL_VALUE(key) (key)
113 # define LOG4CPLUS_SET_THREAD_LOCAL_VALUE(key, value) \
114 do { (key) = (value); } while (0)
115 # define LOG4CPLUS_THREAD_LOCAL_CLEANUP(key) do { (key) = NULL; } while (0)
116 # undef LOG4CPLUS_HAVE_TLS_SUPPORT
117 # undef LOG4CPLUS_THREAD_LOCAL_VAR
120 # error "You Must define a Threading model"
134 #ifndef LOG4CPLUS_SINGLE_THREADED
135 # define LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX(mutex) \
136 do { ::log4cplus::thread::Guard _sync_guard_object(mutex);
138 # define LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX(mutex) do { (void)(mutex);
141 #define LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX } while (0)
144 #endif // LOG4CPLUS_HELPERS_THREAD_CONFIG_HEADER_