00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef _LOG4CPP_THREADING_MSTHREADS_HH
00011 #define _LOG4CPP_THREADING_MSTHREADS_HH
00012
00013 #include <string>
00014
00015
00016
00017
00018 #ifndef _WINDOWS_
00019 # ifndef NOGDI
00020 # define NOGDI // this will circumvent the ERROR #define in windows.h
00021 # define LOG4CPP_UNDEFINE_NOGDI
00022 # endif
00023
00024 # ifndef WIN32_LEAN_AND_MEAN
00025 # define WIN32_LEAN_AND_MEAN
00026 # define LOG4CPP_UNDEFINE_WIN32_LEAN_AND_MEAN
00027 # endif
00028
00029 # include <windows.h>
00030
00031 # ifdef LOG4CPP_UNDEFINE_NOGDI
00032 # undef NOGDI
00033 # endif
00034
00035 # ifdef LOG4CPP_UNDEFINE_WIN32_LEAN_AND_MEAN
00036 # undef WIN32_LEAN_AND_MEAN
00037 # endif
00038
00039 #endif // done dealing with ERROR #define
00040
00041 namespace log4cpp {
00042 namespace threading {
00048 LOG4CPP_EXPORT std::string getThreadId();
00057 LOG4CPP_EXPORT char* getThreadId(char* buffer);
00058
00062 class LOG4CPP_EXPORT MSMutex {
00063 public:
00064 MSMutex() { InitializeCriticalSection(&_criticalSection); }
00065 ~MSMutex() { DeleteCriticalSection(&_criticalSection); }
00066 inline LPCRITICAL_SECTION getCriticalSection() {
00067 return &_criticalSection;
00068 }
00069
00070 private:
00071 MSMutex(const MSMutex& other);
00072 CRITICAL_SECTION _criticalSection;
00073 };
00074
00078 typedef MSMutex Mutex;
00079
00084 class MSScopedLock {
00085 public:
00086 MSScopedLock(MSMutex& mutex) {
00087 _criticalSection = mutex.getCriticalSection();
00088 EnterCriticalSection(_criticalSection);
00089 }
00090
00091 ~MSScopedLock() { LeaveCriticalSection(_criticalSection); }
00092
00093 private:
00094 MSScopedLock(const MSScopedLock& other);
00095 LPCRITICAL_SECTION _criticalSection;
00096 };
00097
00102 typedef MSScopedLock ScopedLock;
00103
00110 template<typename T> class ThreadLocalDataHolder {
00111 public:
00112 inline ThreadLocalDataHolder() :
00113 _key(TlsAlloc()) {};
00114
00115 inline ~ThreadLocalDataHolder() { TlsFree(_key); };
00116
00122 inline T* get() const {
00123 return (T*)TlsGetValue(_key);
00124 };
00125
00132 inline T* operator->() const { return get(); };
00133
00139 inline T& operator*() const { return *get(); };
00140
00147 inline T* release() {
00148 T* result = (T*)TlsGetValue(_key);
00149 TlsSetValue(_key, NULL);
00150 return result;
00151 };
00152
00159 inline void reset(T* p = NULL) {
00160 T* thing = (T*)TlsGetValue(_key);
00161 delete thing;
00162 TlsSetValue(_key, p);
00163 };
00164
00165 private:
00166 DWORD _key;
00167 };
00168 }
00169 }
00170 #endif