summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/sys/Thread.h
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/qpid/sys/Thread.h')
-rw-r--r--cpp/src/qpid/sys/Thread.h80
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*/