diff options
Diffstat (limited to 'cpp/src/qpid/sys/Thread.h')
-rw-r--r-- | cpp/src/qpid/sys/Thread.h | 42 |
1 files changed, 39 insertions, 3 deletions
diff --git a/cpp/src/qpid/sys/Thread.h b/cpp/src/qpid/sys/Thread.h index 2aad7c24d7..37f714dd6c 100644 --- a/cpp/src/qpid/sys/Thread.h +++ b/cpp/src/qpid/sys/Thread.h @@ -40,11 +40,17 @@ namespace sys { class Thread { public: + inline static Thread current(); + inline static void yield(); + inline Thread(); inline explicit Thread(qpid::sys::Runnable*); + inline explicit Thread(qpid::sys::Runnable&); + inline void join(); - inline static Thread current(); + inline long id(); + private: #ifdef USE_APR static void* APR_THREAD_FUNC runRunnable(apr_thread_t* thread, void *data); @@ -68,12 +74,21 @@ Thread::Thread(Runnable* runnable) { apr_thread_create(&thread, 0, runRunnable, runnable, APRPool::get())); } +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)); } +long Thread::id() { + return long(thread); +} + Thread::Thread(apr_thread_t* t) : thread(t) {} Thread Thread::current(){ @@ -83,15 +98,29 @@ Thread Thread::current(){ return Thread(thr); } +void Thread::yield() +{ + apr_thread_yield(); +} + + // POSIX ================================================================ #else Thread::Thread(Runnable* runnable) { - CHECK0(pthread_create(&thread, NULL, runRunnable, runnable)); + QPID_POSIX_THROW_IF(pthread_create(&thread, NULL, runRunnable, runnable)); +} + +Thread::Thread(Runnable& runnable) { + QPID_POSIX_THROW_IF(pthread_create(&thread, NULL, runRunnable, &runnable)); } void Thread::join(){ - if (thread != 0) CHECK0(pthread_join(thread, 0)); + QPID_POSIX_THROW_IF(pthread_join(thread, 0)); +} + +long Thread::id() { + return long(thread); } Thread::Thread(pthread_t thr) : thread(thr) {} @@ -99,6 +128,13 @@ Thread::Thread(pthread_t thr) : thread(thr) {} Thread Thread::current() { return Thread(pthread_self()); } + +void Thread::yield() +{ + QPID_POSIX_THROW_IF(pthread_yield()); +} + + #endif }} |