log4shib 2.0.0

OmniThreads.hh
Go to the documentation of this file.
1/*
2 * OmniThreads.hh
3 *
4 * Copyright 2002, LifeLine Networks BV (www.lifeline.nl). All rights reserved.
5 * Copyright 2002, Bastiaan Bakker. All rights reserved.
6 *
7 * See the COPYING file for the terms of usage and distribution.
8 */
9
10#ifndef _LOG4SHIB_THREADING_OMNITHREADS_HH
11#define _LOG4SHIB_THREADING_OMNITHREADS_HH
12
13#include <log4shib/Portability.hh>
14#include <omnithread.h>
15#include <stdio.h>
16#include <string>
17
18 namespace log4shib {
19 namespace threading {
25 std::string getThreadId();
26
31 typedef omni_mutex Mutex;
32
38 typedef omni_mutex_lock ScopedLock;
39
48 template<typename T> class ThreadLocalDataHolder {
49 public:
50 typedef T data_type;
51
52 inline ThreadLocalDataHolder() :
53 _key(omni_thread::allocate_key()) {};
54
55 inline ~ThreadLocalDataHolder() {};
56
62 inline T* get() const {
63 Holder* holder = dynamic_cast<Holder*>(
64 ::omni_thread::self()->get_value(_key));
65 return (holder) ? holder->data : NULL;
66 };
67
74 inline T* operator->() const { return get(); };
75
81 inline T& operator*() const { return *get(); };
82
89 inline T* release() {
90 T* result = NULL;
91 Holder* holder = dynamic_cast<Holder*>(
92 ::omni_thread::self()->get_value(_key));
93
94 if (holder) {
95 result = holder->data;
96 holder->data = NULL;
97 }
98
99 return result;
100 };
101
108 inline void reset(T* p = NULL) {
109 Holder* holder = dynamic_cast<Holder*>(
110 ::omni_thread::self()->get_value(_key));
111 if (holder) {
112 if (holder->data)
113 delete holder->data;
114
115 holder->data = p;
116 } else {
117 holder = new Holder(p);
118 ::omni_thread::self()->set_value(_key, holder);
119 }
120 };
121
122 private:
123 class Holder : public omni_thread::value_t {
124 public:
125 Holder(data_type* data) : data(data) {};
126 virtual ~Holder() { if (data) delete (data); };
127 data_type* data;
128 private:
129 Holder(const Holder& other);
130 Holder& operator=(const Holder& other);
131 };
132
133 omni_thread::key_t _key;
134 };
135 }
136}
137#endif
Portability.hh
log4shib::threading::ThreadLocalDataHolder::operator->
T * operator->() const
Obtains the Object held for the current thread.
Definition: OmniThreads.hh:74
log4shib::threading::ThreadLocalDataHolder::operator*
T & operator*() const
Obtains the Object held for the current thread.
Definition: OmniThreads.hh:81
log4shib::threading::ThreadLocalDataHolder::~ThreadLocalDataHolder
~ThreadLocalDataHolder()
Definition: OmniThreads.hh:55
log4shib::threading::ThreadLocalDataHolder::reset
void reset(T *p=NULL)
Sets a new Object to be held for the current thread.
Definition: OmniThreads.hh:108
log4shib::threading::ThreadLocalDataHolder::get
T * get() const
Obtains the Object held for the current thread.
Definition: OmniThreads.hh:62
log4shib::threading::ThreadLocalDataHolder::data_type
T data_type
Definition: OmniThreads.hh:50
log4shib::threading::ThreadLocalDataHolder::release
T * release()
Releases the Object held for the current thread.
Definition: OmniThreads.hh:89
log4shib::threading::ThreadLocalDataHolder::ThreadLocalDataHolder
ThreadLocalDataHolder()
Definition: OmniThreads.hh:52
log4shib::threading::getThreadId
static std::string getThreadId()
Return an identifier for the current thread.
Definition: BoostThreads.hh:22
log4shib::threading::Mutex
boost::mutex Mutex
Dummy type 'int' for Mutex.
Definition: BoostThreads.hh:27
log4shib::threading::ScopedLock
boost::mutex::scoped_lock ScopedLock
Dummy type 'int' defintion of ScopedLock;.
Definition: BoostThreads.hh:30
log4shib
The top level namespace for all 'Log for C++' types and classes.
Definition: AbortAppender.hh:16