diff options
author | Andrew Stitcher <astitcher@apache.org> | 2008-08-06 20:56:19 +0000 |
---|---|---|
committer | Andrew Stitcher <astitcher@apache.org> | 2008-08-06 20:56:19 +0000 |
commit | 31b2f1436808fc07f636dc02416386e44b23071c (patch) | |
tree | 2e15eae70757abc73ce1360787acf8293566ef0f /cpp/src | |
parent | 8451864c21e9424b880c61104108e8c76864b7cb (diff) | |
download | qpid-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.h | 33 | ||||
-rw-r--r-- | cpp/src/qpid/sys/posix/Thread.cpp | 50 | ||||
-rw-r--r-- | cpp/src/qpid/sys/posix/Thread.h | 88 |
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*/ |