summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorAndrew Stitcher <astitcher@apache.org>2008-08-06 20:56:19 +0000
committerAndrew Stitcher <astitcher@apache.org>2008-08-06 20:56:19 +0000
commit31b2f1436808fc07f636dc02416386e44b23071c (patch)
tree2e15eae70757abc73ce1360787acf8293566ef0f /cpp/src
parent8451864c21e9424b880c61104108e8c76864b7cb (diff)
downloadqpid-python-31b2f1436808fc07f636dc02416386e44b23071c.tar.gz
Refactor Thread platform code so that the implementation is completely
decoupled from its interface git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@683402 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/qpid/sys/Thread.h33
-rw-r--r--cpp/src/qpid/sys/posix/Thread.cpp50
-rw-r--r--cpp/src/qpid/sys/posix/Thread.h88
3 files changed, 76 insertions, 95 deletions
diff --git a/cpp/src/qpid/sys/Thread.h b/cpp/src/qpid/sys/Thread.h
index fd9be5617e..3188e45341 100644
--- a/cpp/src/qpid/sys/Thread.h
+++ b/cpp/src/qpid/sys/Thread.h
@@ -21,11 +21,34 @@
* under the License.
*
*/
+#include <boost/shared_ptr.hpp>
-#ifdef USE_APR_PLATFORM
-#include "apr/Thread.h"
-#else
-#include "posix/Thread.h"
-#endif
+namespace qpid {
+namespace sys {
+class Runnable;
+class ThreadPrivate;
+
+class Thread
+{
+ boost::shared_ptr<ThreadPrivate> impl;
+
+ public:
+ Thread();
+ explicit Thread(qpid::sys::Runnable*);
+ explicit Thread(qpid::sys::Runnable&);
+
+ void join();
+
+ unsigned long id();
+
+ static Thread current();
+
+ /** ID of current thread for logging.
+ * Workaround for broken Thread::current() in APR
+ */
+ static unsigned long logId() { return current().id(); }
+};
+
+}}
#endif /*!_sys_Thread_h*/
diff --git a/cpp/src/qpid/sys/posix/Thread.cpp b/cpp/src/qpid/sys/posix/Thread.cpp
index dc9b21448f..bb5641bc53 100644
--- a/cpp/src/qpid/sys/posix/Thread.cpp
+++ b/cpp/src/qpid/sys/posix/Thread.cpp
@@ -19,11 +19,57 @@
*
*/
-#include "Thread.h"
+#include "qpid/sys/Thread.h"
+
#include "qpid/sys/Runnable.h"
+#include "check.h"
+
+#include <pthread.h>
-void* qpid::sys::Thread::runRunnable(void* p)
+namespace qpid {
+namespace sys {
+
+namespace {
+void* runRunnable(void* p)
{
static_cast<Runnable*>(p)->run();
return 0;
}
+}
+
+struct ThreadPrivate {
+ pthread_t thread;
+
+ ThreadPrivate(Runnable* runnable) {
+ QPID_POSIX_ASSERT_THROW_IF(::pthread_create(&thread, NULL, runRunnable, runnable));
+ }
+
+ ThreadPrivate() : thread(::pthread_self()) {}
+};
+
+Thread::Thread() {}
+
+Thread::Thread(Runnable* runnable) : impl(new ThreadPrivate(runnable)) {}
+
+Thread::Thread(Runnable& runnable) : impl(new ThreadPrivate(&runnable)) {}
+
+void Thread::join(){
+ if (impl) {
+ QPID_POSIX_ASSERT_THROW_IF(::pthread_join(impl->thread, 0));
+ }
+}
+
+unsigned long Thread::id() {
+ if (impl)
+ return impl->thread;
+ else
+ return 0;
+}
+
+Thread Thread::current() {
+ Thread t;
+ t.impl.reset(new ThreadPrivate());
+ return t;
+}
+
+}}
diff --git a/cpp/src/qpid/sys/posix/Thread.h b/cpp/src/qpid/sys/posix/Thread.h
deleted file mode 100644
index dae2b5ca11..0000000000
--- a/cpp/src/qpid/sys/posix/Thread.h
+++ /dev/null
@@ -1,88 +0,0 @@
-#ifndef _sys_posix_Thread_h
-#define _sys_posix_Thread_h
-
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "check.h"
-#include <pthread.h>
-
-namespace qpid {
-namespace sys {
-
-class Runnable;
-
-class Thread
-{
- public:
- inline static Thread current();
-
- /** ID of current thread for logging.
- * Workaround for broken Thread::current() in APR
- */
- static unsigned long logId() { return current().id(); }
-
- inline Thread();
- inline explicit Thread(qpid::sys::Runnable*);
- inline explicit Thread(qpid::sys::Runnable&);
-
- inline void join();
-
- inline unsigned long id();
-
- private:
- static void* runRunnable(void* runnable);
- inline Thread(pthread_t);
- pthread_t thread;
-};
-
-
-Thread::Thread() : thread(0) {}
-
-Thread::Thread(Runnable* runnable) {
- QPID_POSIX_ASSERT_THROW_IF(pthread_create(&thread, NULL, runRunnable, runnable));
-}
-
-Thread::Thread(Runnable& runnable) {
- QPID_POSIX_ASSERT_THROW_IF(pthread_create(&thread, NULL, runRunnable, &runnable));
-}
-
-void Thread::join(){
- if (thread != 0)
- QPID_POSIX_ASSERT_THROW_IF(pthread_join(thread, 0));
-}
-
-unsigned long Thread::id() {
- return thread;
-}
-
-Thread::Thread(pthread_t thr) : thread(thr) {}
-
-Thread Thread::current() {
- return Thread(pthread_self());
-}
-
-}}
-#endif /*!_sys_posix_Thread_h*/