28 #ifndef _LOG4TANGO_THREADING_MSTHREADS_H
29 #define _LOG4TANGO_THREADING_MSTHREADS_H
41 # define NOGDI // circumvent the ERROR #define in windows.h
42 # define LOG4TANGO_UNDEFINE_NOGDI
45 # ifndef WIN32_LEAN_AND_MEAN
46 # define WIN32_LEAN_AND_MEAN
47 # define LOG4TANGO_UNDEFINE_WIN32_LEAN_AND_MEAN
52 # ifdef LOG4TANGO_UNDEFINE_NOGDI
56 # ifdef LOG4TANGO_UNDEFINE_WIN32_LEAN_AND_MEAN
57 # undef WIN32_LEAN_AND_MEAN
79 InitializeCriticalSection(&_criticalSection);
83 DeleteCriticalSection(&_criticalSection);
87 return &_criticalSection;
94 CRITICAL_SECTION _criticalSection;
106 EnterCriticalSection(_criticalSection);
110 LeaveCriticalSection(_criticalSection);
117 LPCRITICAL_SECTION _criticalSection;
128 ::InitializeCriticalSection(&
guard_);
133 ::DeleteCriticalSection(&
guard_);
142 inline int lock (
long timeout_ = 0) {
143 ::EnterCriticalSection(&
guard_);
156 ::LeaveCriticalSection(&
guard_);
161 while (recursion_level_ > 0) {
163 ::LeaveCriticalSection(&
guard_);
173 unsigned long recursion_level_;
189 #ifdef LOG4TANGO_HAS_NDC
190 template<
typename T>
class ThreadLocalDataHolder
194 inline ThreadLocalDataHolder()
198 inline ~ThreadLocalDataHolder() {
207 inline T* get (
void)
const {
208 return (T*)TlsGetValue(_key);
217 inline T* operator->()
const {
226 inline T& operator*()
const {
236 inline T* release() {
237 T* result = (T*)TlsGetValue(_key);
238 TlsSetValue(_key, NULL);
248 inline void reset(T* p = NULL) {
249 T* thing = (T*)TlsGetValue(_key);
251 TlsSetValue(_key, p);
259 #endif // LOG4TANGO_HAS_NDC
265 #endif // _LOG4TANGO_THREADING_MSTHREADS_H