OmniThreads.hh
Go to the documentation of this file.
00001 /*
00002  * OmniThreads.hh
00003  *
00004  * Copyright 2002, LifeLine Networks BV (www.lifeline.nl). All rights reserved.
00005  * Copyright 2002, Bastiaan Bakker. All rights reserved.
00006  *
00007  * See the COPYING file for the terms of usage and distribution.
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         
00035             char* getThreadId(char* buffer);
00036 
00041         typedef omni_mutex Mutex;
00042 
00048         typedef omni_mutex_lock ScopedLock;
00049 
00058         template<typename T> class ThreadLocalDataHolder {
00059             public:
00060             typedef T data_type;
00061 
00062             inline ThreadLocalDataHolder() :
00063                 _key(omni_thread::allocate_key()) {};
00064 
00065             inline ~ThreadLocalDataHolder() {};
00066             
00072             inline T* get() const {
00073                 Holder* holder = dynamic_cast<Holder*>(
00074                     ::omni_thread::self()->get_value(_key));
00075                 return (holder) ? holder->data : NULL;
00076             };
00077 
00084             inline T* operator->() const { return get(); };
00085 
00091             inline T& operator*() const { return *get(); };
00092 
00099             inline T* release() {
00100                 T* result = NULL;
00101                 Holder* holder = dynamic_cast<Holder*>(
00102                     ::omni_thread::self()->get_value(_key));
00103               
00104                 if (holder) {
00105                     result = holder->data;
00106                     holder->data = NULL;
00107                 }
00108 
00109                 return result;
00110             };
00111 
00118             inline void reset(T* p = NULL) {
00119                 Holder* holder = dynamic_cast<Holder*>(
00120                     ::omni_thread::self()->get_value(_key));
00121                 if (holder) {
00122                     if (holder->data)
00123                         delete holder->data;
00124 
00125                     holder->data = p;
00126                 } else {
00127                     holder = new Holder(p);
00128                     ::omni_thread::self()->set_value(_key, holder);
00129                 }
00130             };
00131 
00132             private:            
00133             class Holder : public omni_thread::value_t {
00134                 public:
00135                 Holder(data_type* data) : data(data) {};
00136                 virtual ~Holder() { if (data) delete (data); };
00137                 data_type* data;
00138                 private:
00139                 Holder(const Holder& other);
00140                 Holder& operator=(const Holder& other);
00141             };
00142 
00143             omni_thread::key_t _key;            
00144         };
00145     }
00146 }
00147 #endif


log4cpp
Author(s): Stephen Roderick, Bastiaan Bakker, Cedric Le Goater, Steve Ostlind, Marcel Harkema, Walter Stroebel, Glenn Scott and Tony Cheung.
autogenerated on Thu Jan 2 2014 11:35:02