Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

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         
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

Generated on Mon Oct 28 23:41:43 2002 for log4cpp by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002