OFFIS DCMTK  Version 3.6.0
threadcf.h
Go to the documentation of this file.
1 // Module: Log4CPLUS
2 // File: thread-config.h
3 // Created: 4/2003
4 // Author: Tad E. Smith
5 //
6 //
7 // Copyright 2003-2009 Tad E. Smith
8 //
9 // Licensed under the Apache License, Version 2.0 (the "License");
10 // you may not use this file except in compliance with the License.
11 // You may obtain a copy of the License at
12 //
13 // http://www.apache.org/licenses/LICENSE-2.0
14 //
15 // Unless required by applicable law or agreed to in writing, software
16 // distributed under the License is distributed on an "AS IS" BASIS,
17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 // See the License for the specific language governing permissions and
19 // limitations under the License.
22 #ifndef LOG4CPLUS_HELPERS_THREAD_CONFIG_HEADER_
23 #define LOG4CPLUS_HELPERS_THREAD_CONFIG_HEADER_
24 
25 #define INCLUDE_CSTDDEF /* For NULL */
26 #include "dcmtk/ofstd/ofstdinc.h"
27 
28 #ifdef LOG4CPLUS_USE_PTHREADS
29 # include <pthread.h>
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)
50 namespace log4cplus {
51  namespace thread {
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 *));
55  }
56 }
57 
58 #elif defined(LOG4CPLUS_USE_WIN32_THREADS)
59 # undef WIN32_LEAN_AND_MEAN
60 # define WIN32_LEAN_AND_MEAN
61 # include <windows.h>
62 
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)
68 
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
83 // Comment out the following two lines if you do intend to use log4cplus.dll
84 // for loading using LoadLibrary(). The __declspec(thread) functionality is not
85 // compatible with such DLL use. For more information why is this necessary see
86 // <http://msdn.microsoft.com/en-us/library/2s9wt68x(vs.80).aspx>.
87 # define LOG4CPLUS_HAVE_TLS_SUPPORT 1
88 # define LOG4CPLUS_THREAD_LOCAL_VAR __declspec(thread)
89 # endif
90 
91 
92 namespace log4cplus { namespace thread {
93 
94 LOG4CPLUS_EXPORT LOG4CPLUS_MUTEX_PTR_DECLARE createNewMutex();
95 LOG4CPLUS_EXPORT void deleteMutex(LOG4CPLUS_MUTEX_PTR_DECLARE);
96 
97 } } // namespace log4cplus { namespace thread {
98 
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
118 
119 #else
120 # error "You Must define a Threading model"
121 #endif
122 
134 #ifndef LOG4CPLUS_SINGLE_THREADED
135 # define LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX(mutex) \
136  do { ::log4cplus::thread::Guard _sync_guard_object(mutex);
137 #else
138 # define LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX(mutex) do { (void)(mutex);
139 #endif
140 
141 #define LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX } while (0)
142 
143 
144 #endif // LOG4CPLUS_HELPERS_THREAD_CONFIG_HEADER_
145 


Generated on Thu Dec 20 2012 for OFFIS DCMTK Version 3.6.0 by Doxygen 1.8.2