diff options
| author | Alan Conway <aconway@apache.org> | 2006-11-09 21:55:34 +0000 |
|---|---|---|
| committer | Alan Conway <aconway@apache.org> | 2006-11-09 21:55:34 +0000 |
| commit | c33f3d8550b9b4455ad6ca8a2327a7bd9d6f7db1 (patch) | |
| tree | bb5d68281986eb1664c227d15f303664a65d5e03 /cpp/src/qpid/sys/Thread.h | |
| parent | 76fb78a8495b6cd48c633e8b6219b29761133d82 (diff) | |
| download | qpid-python-c33f3d8550b9b4455ad6ca8a2327a7bd9d6f7db1.tar.gz | |
Added POSIX equivalents to APR classes used by clients, inlined trivial calls.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@473087 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/sys/Thread.h')
| -rw-r--r-- | cpp/src/qpid/sys/Thread.h | 80 |
1 files changed, 78 insertions, 2 deletions
diff --git a/cpp/src/qpid/sys/Thread.h b/cpp/src/qpid/sys/Thread.h index d884add776..0cd7a5b2eb 100644 --- a/cpp/src/qpid/sys/Thread.h +++ b/cpp/src/qpid/sys/Thread.h @@ -19,9 +19,85 @@ * */ -#include <qpid/sys/platform.h> -#include QPID_PLATFORM_H(Thread.h) +#include <qpid/sys/Runnable.h> +#ifdef USE_APR +# include <apr-1/apr_thread_proc.h> +# include <apr-1/apr_portable.h> +# include <qpid/apr/APRPool.h> +# include <qpid/apr/APRBase.h> +#else +# include <qpid/posix/check.h> +# include <pthread.h> +#endif +namespace qpid { +namespace sys { + +class Thread +{ + public: + inline Thread(); + inline explicit Thread(qpid::sys::Runnable*); + inline void join(); + inline static Thread current(); + + private: +#ifdef USE_APR + static void* APR_THREAD_FUNC runRunnable(apr_thread_t* thread, void *data); + inline Thread(apr_thread_t* t); + apr_thread_t* thread; +#else + static void* runRunnable(void* runnable); + inline Thread(pthread_t); + pthread_t thread; +#endif +}; + + +Thread::Thread() : thread(0) {} + +// APR ================================================================ +#ifdef USE_APR + +Thread::Thread(Runnable* runnable) { + CHECK_APR_SUCCESS( + apr_thread_create(&thread, 0, runRunnable, runnable, APRPool::get())); +} + +void Thread::join(){ + apr_status_t status; + if (thread != 0) + CHECK_APR_SUCCESS(apr_thread_join(&status, thread)); +} + +Thread::Thread(apr_thread_t* t) : thread(t) {} + +Thread Thread::current(){ + apr_thread_t* thr; + apr_os_thread_t osthr = apr_os_thread_current(); + CHECK_APR_SUCCESS(apr_os_thread_put(&thr, &osthr, APRPool::get())); + return Thread(thr); +} + +// POSIX ================================================================ +#else + +Thread::Thread(Runnable* runnable) { + CHECK(pthread_create(&thread, NULL, runRunnable, runnable)); +} + +void Thread::join(){ + if (thread != 0) CHECK(pthread_join(thread, 0)); +} + +Thread::Thread(pthread_t thr) : thread(thr) {} + +Thread Thread::current() { + return Thread(pthread_self()); +} +#endif + +}} #endif /*!_sys_Thread_h*/ |
