00001
00002
00003
00004
00005
00006
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
00029 class Mutex {
00030
private:
00031 pthread_mutex_t mutex;
00032
00033
public:
00034 inline Mutex() {
00035 ::pthread_mutex_init(&mutex, NULL);
00036 }
00037
00038 inline void lock() {
00039 ::pthread_mutex_lock(&mutex);
00040 }
00041
00042 inline void unlock() {
00043 ::pthread_mutex_unlock(&mutex);
00044 }
00045
00046 inline ~Mutex() {
00047 ::pthread_mutex_destroy(&mutex);
00048 }
00049
00050 inline void operator=(
const Mutex &m) {
00051 mutex = m.
mutex;
00052 }
00053 };
00054
00058 class ScopedLock {
00059
private:
00060
Mutex _mutex;
00061
00062
public:
00063 inline ScopedLock(
const Mutex &mutex) {
00064 _mutex = mutex;
00065 _mutex.
lock();
00066 }
00067
00068 inline ~ScopedLock() {
00069 _mutex.
unlock();
00070 }
00071 };
00072
00076
template<
typename T>
class ThreadLocalDataHolder {
00077
private:
00078 pthread_key_t _key;
00079
00080
public:
00081 typedef T
data_type;
00082
00083 inline ThreadLocalDataHolder() {
00084 ::pthread_key_create(&_key,
freeHolder);
00085 }
00086
00087 inline static void freeHolder(
void *p) {
00088 assert(p != NULL);
00089
delete reinterpret_cast<T *>(p);
00090 }
00091
00092 inline ~ThreadLocalDataHolder() {
00093 T *data =
get();
00094
if (data != NULL) {
00095
delete data;
00096 }
00097 ::pthread_key_delete(_key);
00098 }
00099
00100 inline T*
get()
const {
00101
return reinterpret_cast<T *>(::pthread_getspecific(_key));
00102 }
00103
00104 inline T*
operator->()
const {
return get(); }
00105 inline T&
operator*()
const {
return *
get(); }
00106
00107 inline T*
release() {
00108 T* result =
get();
00109 ::pthread_setspecific(_key, NULL);
00110
00111
return result;
00112 }
00113
00114 inline void reset(T* p = NULL) {
00115 T *data =
get();
00116
if (data != NULL) {
00117
delete data;
00118 }
00119 ::pthread_setspecific(_key, p);
00120 }
00121 };
00122
00123 }
00124 }
00125
#endif