00001 // Module: Log4CPLUS 00002 // File: thread-config.h 00003 // Created: 4/2003 00004 // Author: Tad E. Smith 00005 // 00006 // 00007 // Copyright 2003-2009 Tad E. Smith 00008 // 00009 // Licensed under the Apache License, Version 2.0 (the "License"); 00010 // you may not use this file except in compliance with the License. 00011 // You may obtain a copy of the License at 00012 // 00013 // http://www.apache.org/licenses/LICENSE-2.0 00014 // 00015 // Unless required by applicable law or agreed to in writing, software 00016 // distributed under the License is distributed on an "AS IS" BASIS, 00017 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00018 // See the License for the specific language governing permissions and 00019 // limitations under the License. 00022 #ifndef LOG4CPLUS_HELPERS_THREAD_CONFIG_HEADER_ 00023 #define LOG4CPLUS_HELPERS_THREAD_CONFIG_HEADER_ 00024 00025 #define INCLUDE_CSTDDEF /* For NULL */ 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 // Comment out the following two lines if you do intend to use log4cplus.dll 00084 // for loading using LoadLibrary(). The __declspec(thread) functionality is not 00085 // compatible with such DLL use. For more information why is this necessary see 00086 // <http://msdn.microsoft.com/en-us/library/2s9wt68x(vs.80).aspx>. 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 } } // namespace log4cplus { namespace thread { 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