4
* Copyright 2002, LifeLine Networks BV (www.lifeline.nl). All rights reserved.
5
* Copyright 2002, Bastiaan Bakker. All rights reserved.
7
* See the COPYING file for the terms of usage and distribution.
10
#ifndef _LOG4SHIB_THREADING_OMNITHREADS_HH
11
#define _LOG4SHIB_THREADING_OMNITHREADS_HH
13
#include <log4shib/Portability.hh>
14
#include <omnithread.h>
21
* Return an identifier for the current thread. What these
22
* identifiers look like is completely up to the underlying
23
* thread library. OmniThreads returns the POSIX thread Id.
25
std::string getThreadId();
28
* A simple, non recursive Mutex.
29
* Equivalent to Boost.Threads boost::mutex
31
typedef omni_mutex Mutex;
34
* A simple "resource acquisition is initialization" idiom type lock
36
* Equivalent to Boost.Threads boost::scoped_lock.
38
typedef omni_mutex_lock ScopedLock;
41
* This class holds Thread local data of type T, i.e. for each
42
* thread a ThreadLocalDataHolder holds 0 or 1 instance of T.
43
* The held object must be heap allocated and will be deleted
44
* upon termination of the thread to wich it belongs.
45
* This is an omni_threads based equivalent of Boost.Threads
46
* thread_specific_ptr<T> class.
48
template<typename T> class ThreadLocalDataHolder {
52
inline ThreadLocalDataHolder() :
53
_key(omni_thread::allocate_key()) {};
55
inline ~ThreadLocalDataHolder() {};
58
* Obtains the Object held for the current thread.
59
* @return a pointer to the held Object or NULL if no
60
* Object has been set for the current thread.
62
inline T* get() const {
63
Holder* holder = dynamic_cast<Holder*>(
64
::omni_thread::self()->get_value(_key));
65
return (holder) ? holder->data : NULL;
69
* Obtains the Object held for the current thread.
70
* Initially each thread holds NULL.
71
* @return a pointer to the held Object or NULL if no
72
* Object has been set for the current thread.
74
inline T* operator->() const { return get(); };
77
* Obtains the Object held for the current thread.
79
* @return a reference to the held Object.
81
inline T& operator*() const { return *get(); };
84
* Releases the Object held for the current thread.
86
* @return a pointer to the Object thas was held for
87
* the current thread or NULL if no Object was held.
91
Holder* holder = dynamic_cast<Holder*>(
92
::omni_thread::self()->get_value(_key));
95
result = holder->data;
103
* Sets a new Object to be held for the current thread. A
104
* previously set Object will be deleted.
105
* @param p the new object to hold.
108
inline void reset(T* p = NULL) {
109
Holder* holder = dynamic_cast<Holder*>(
110
::omni_thread::self()->get_value(_key));
117
holder = new Holder(p);
118
::omni_thread::self()->set_value(_key, holder);
123
class Holder : public omni_thread::value_t {
125
Holder(data_type* data) : data(data) {};
126
virtual ~Holder() { if (data) delete (data); };
129
Holder(const Holder& other);
130
Holder& operator=(const Holder& other);
133
omni_thread::key_t _key;