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