$search
00001 /* 00002 * PThreads.hh 00003 * 00004 * Copyright 2002, Emiliano Martin emilianomc@terra.es All rights reserved. 00005 * 00006 * See the COPYING file for the terms of usage and distribution. 00007 */ 00008 00009 #ifndef _LOG4CPP_THREADING_PTHREADS_HH 00010 #define _LOG4CPP_THREADING_PTHREADS_HH 00011 00012 #include <log4cpp/Portability.hh> 00013 #include <stdio.h> 00014 #include <pthread.h> 00015 #include <string> 00016 #include <assert.h> 00017 00018 00019 namespace log4cpp { 00020 namespace threading { 00021 00025 std::string getThreadId(); 00026 00032 char* getThreadId(char* buffer); 00033 00036 class Mutex { 00037 private: 00038 pthread_mutex_t mutex; 00039 00040 public: 00041 inline Mutex() { 00042 ::pthread_mutex_init(&mutex, NULL); 00043 } 00044 00045 inline void lock() { 00046 ::pthread_mutex_lock(&mutex); 00047 } 00048 00049 inline void unlock() { 00050 ::pthread_mutex_unlock(&mutex); 00051 } 00052 00053 inline ~Mutex() { 00054 ::pthread_mutex_destroy(&mutex); 00055 } 00056 00057 private: 00058 Mutex(const Mutex& m); 00059 Mutex& operator=(const Mutex &m); 00060 }; 00061 00065 class ScopedLock { 00066 private: 00067 Mutex& _mutex; 00068 00069 public: 00070 inline ScopedLock(Mutex& mutex) : 00071 _mutex(mutex) { 00072 _mutex.lock(); 00073 } 00074 00075 inline ~ScopedLock() { 00076 _mutex.unlock(); 00077 } 00078 }; 00079 00083 template<typename T> class ThreadLocalDataHolder { 00084 private: 00085 pthread_key_t _key; 00086 00087 public: 00088 typedef T data_type; 00089 00090 inline ThreadLocalDataHolder() { 00091 ::pthread_key_create(&_key, freeHolder); 00092 } 00093 00094 inline static void freeHolder(void *p) { 00095 assert(p != NULL); 00096 delete reinterpret_cast<T *>(p); 00097 } 00098 00099 inline ~ThreadLocalDataHolder() { 00100 T *data = get(); 00101 if (data != NULL) { 00102 delete data; 00103 } 00104 ::pthread_key_delete(_key); 00105 } 00106 00107 inline T* get() const { 00108 return reinterpret_cast<T *>(::pthread_getspecific(_key)); 00109 } 00110 00111 inline T* operator->() const { return get(); } 00112 inline T& operator*() const { return *get(); } 00113 00114 inline T* release() { 00115 T* result = get(); 00116 ::pthread_setspecific(_key, NULL); 00117 00118 return result; 00119 } 00120 00121 inline void reset(T* p = NULL) { 00122 T *data = get(); 00123 if (data != NULL) { 00124 delete data; 00125 } 00126 ::pthread_setspecific(_key, p); 00127 } 00128 }; 00129 00130 } 00131 } 00132 #endif