00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
#ifndef _LOG4CPP_THREADING_OMNITHREADS_HH
00011
#define _LOG4CPP_THREADING_OMNITHREADS_HH
00012
00013
#include <log4cpp/Portability.hh>
00014
#include <omnithread.h>
00015
#include <stdio.h>
00016
#include <string>
00017
00018
namespace log4cpp {
00019
namespace threading {
00025 std::string
getThreadId();
00026
00031
typedef omni_mutex
Mutex;
00032
00038
typedef omni_mutex_lock
ScopedLock;
00039
00048
template<
typename T>
class ThreadLocalDataHolder {
00049
public:
00050 typedef T
data_type;
00051
00052 inline ThreadLocalDataHolder() :
00053 _key(omni_thread::allocate_key()) {};
00054
00055 inline ~ThreadLocalDataHolder() {};
00056
00062 inline T*
get()
const {
00063 Holder* holder = dynamic_cast<Holder*>(
00064 ::omni_thread::self()->get_value(_key));
00065
return (holder) ? holder->data : NULL;
00066 };
00067
00074 inline T*
operator->()
const {
return get(); };
00075
00081 inline T&
operator*()
const {
return *
get(); };
00082
00089 inline T*
release() {
00090 T* result = NULL;
00091 Holder* holder = dynamic_cast<Holder*>(
00092 ::omni_thread::self()->get_value(_key));
00093
00094
if (holder) {
00095 result = holder->data;
00096 holder->data = NULL;
00097 }
00098
00099
return result;
00100 };
00101
00108 inline void reset(T* p = NULL) {
00109 Holder* holder = dynamic_cast<Holder*>(
00110 ::omni_thread::self()->get_value(_key));
00111
if (holder) {
00112
if (holder->data)
00113
delete holder->data;
00114
00115 holder->data = p;
00116 }
else {
00117 holder =
new Holder(p);
00118 ::omni_thread::self()->set_value(_key, holder);
00119 }
00120 };
00121
00122
private:
00123
class Holder :
public omni_thread::value_t {
00124
public:
00125 Holder(data_type* data) : data(data) {};
00126
virtual ~Holder() {
if (data)
delete (data); };
00127 data_type* data;
00128
private:
00129 Holder(
const Holder& other);
00130 Holder& operator=(
const Holder& other);
00131 };
00132
00133 omni_thread::key_t _key;
00134 };
00135 }
00136 }
00137
#endif