diff options
author | Andrew Stitcher <astitcher@apache.org> | 2010-04-21 22:07:04 +0000 |
---|---|---|
committer | Andrew Stitcher <astitcher@apache.org> | 2010-04-21 22:07:04 +0000 |
commit | e20869eb4e1ed97f00c3f3e9843b14a00267d25b (patch) | |
tree | cfce5a61a9b46de37e8d486ab00ce7d22fed0737 | |
parent | 1dfffd6555da0b05d88b8e25e4d21951337c4faf (diff) | |
download | qpid-python-e20869eb4e1ed97f00c3f3e9843b14a00267d25b.tar.gz |
QPID-2527: Remove Thread::id member as its uses are better implemented by comparison
operators.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@936537 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | qpid/cpp/include/qpid/sys/Thread.h | 8 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/cluster/Cluster.cpp | 6 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/sys/PollableQueue.h | 6 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/sys/posix/Thread.cpp | 26 | ||||
-rwxr-xr-x | qpid/cpp/src/qpid/sys/windows/Thread.cpp | 16 | ||||
-rw-r--r-- | qpid/cpp/src/tests/SocketProxy.h | 2 | ||||
-rw-r--r-- | qpid/cpp/src/tests/exception_test.cpp | 2 |
7 files changed, 46 insertions, 20 deletions
diff --git a/qpid/cpp/include/qpid/sys/Thread.h b/qpid/cpp/include/qpid/sys/Thread.h index bfea4b4944..45a39e796f 100644 --- a/qpid/cpp/include/qpid/sys/Thread.h +++ b/qpid/cpp/include/qpid/sys/Thread.h @@ -49,16 +49,18 @@ class Thread QPID_COMMON_EXTERN explicit Thread(qpid::sys::Runnable*); QPID_COMMON_EXTERN explicit Thread(qpid::sys::Runnable&); - QPID_COMMON_EXTERN void join(); + QPID_COMMON_EXTERN operator bool(); + QPID_COMMON_EXTERN bool operator==(const Thread&) const; + QPID_COMMON_EXTERN bool operator!=(const Thread&) const; - QPID_COMMON_EXTERN unsigned long id(); + QPID_COMMON_EXTERN void join(); QPID_COMMON_EXTERN static Thread current(); /** ID of current thread for logging. * Workaround for broken Thread::current() in APR */ - static unsigned long logId() { return current().id(); } + QPID_COMMON_EXTERN static unsigned long logId(); }; }} diff --git a/qpid/cpp/src/qpid/cluster/Cluster.cpp b/qpid/cpp/src/qpid/cluster/Cluster.cpp index b1afeb6c7c..924297fcba 100644 --- a/qpid/cpp/src/qpid/cluster/Cluster.cpp +++ b/qpid/cpp/src/qpid/cluster/Cluster.cpp @@ -308,7 +308,7 @@ Cluster::Cluster(const ClusterSettings& set, broker::Broker& b) : Cluster::~Cluster() { broker.setClusterTimer(std::auto_ptr<sys::Timer>(0)); // Delete cluster timer - if (updateThread.id()) updateThread.join(); // Join the previous updatethread. + if (updateThread) updateThread.join(); // Join the previous updatethread. } void Cluster::initialize() { @@ -831,7 +831,7 @@ void Cluster::retractOffer(const MemberId& updater, uint64_t updateeInt, Lock& l if (updater == self) { assert(state == OFFER); if (url) { // My offer was first. - if (updateThread.id()) + if (updateThread) updateThread.join(); // Join the previous updateThread to avoid leaks. updateThread = Thread(new RetractClient(*url, connectionSettings(settings))); } @@ -848,7 +848,7 @@ void Cluster::updateStart(const MemberId& updatee, const Url& url, Lock& l) { assert(state == OFFER); state = UPDATER; QPID_LOG(notice, *this << " sending update to " << updatee << " at " << url); - if (updateThread.id()) + if (updateThread) updateThread.join(); // Join the previous updateThread to avoid leaks. updateThread = Thread( new UpdateClient(self, updatee, url, broker, map, *expiryPolicy, diff --git a/qpid/cpp/src/qpid/sys/PollableQueue.h b/qpid/cpp/src/qpid/sys/PollableQueue.h index cb8c126fe6..81c2301c1e 100644 --- a/qpid/cpp/src/qpid/sys/PollableQueue.h +++ b/qpid/cpp/src/qpid/sys/PollableQueue.h @@ -132,7 +132,7 @@ template <class T> void PollableQueue<T>::push(const T& t) { template <class T> void PollableQueue<T>::dispatch(PollableCondition& cond) { ScopedLock l(lock); - assert(dispatcher.id() == 0); + assert(!dispatcher); dispatcher = Thread::current(); process(); dispatcher = Thread(); @@ -167,8 +167,8 @@ template <class T> void PollableQueue<T>::stop() { condition.clear(); stopped = true; // Avoid deadlock if stop is called from the dispatch thread - if (dispatcher.id() != Thread::current().id()) - while (dispatcher.id()) lock.wait(); + if (dispatcher && dispatcher != Thread::current()) + while (dispatcher) lock.wait(); } }} // namespace qpid::sys diff --git a/qpid/cpp/src/qpid/sys/posix/Thread.cpp b/qpid/cpp/src/qpid/sys/posix/Thread.cpp index a784e63195..b466733260 100644 --- a/qpid/cpp/src/qpid/sys/posix/Thread.cpp +++ b/qpid/cpp/src/qpid/sys/posix/Thread.cpp @@ -39,11 +39,11 @@ void* runRunnable(void* p) struct ThreadPrivate { pthread_t thread; - + ThreadPrivate(Runnable* runnable) { QPID_POSIX_ASSERT_THROW_IF(::pthread_create(&thread, NULL, runRunnable, runnable)); } - + ThreadPrivate() : thread(::pthread_self()) {} }; @@ -53,17 +53,29 @@ Thread::Thread(Runnable* runnable) : impl(new ThreadPrivate(runnable)) {} Thread::Thread(Runnable& runnable) : impl(new ThreadPrivate(&runnable)) {} +Thread::operator bool() { + return impl; +} + +bool Thread::operator==(const Thread& t) const { + return ::pthread_equal(impl->thread, t.impl->thread) != 0; +} + +bool Thread::operator!=(const Thread& t) const { + return !(*this==t); +} + 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; +unsigned long Thread::logId() { + // This does need to be the C cast operator as + // pthread_t could be either a pointer or an integer + // and so we can't know static_cast<> or reinterpret_cast<> + return (unsigned long) ::pthread_self(); } Thread Thread::current() { diff --git a/qpid/cpp/src/qpid/sys/windows/Thread.cpp b/qpid/cpp/src/qpid/sys/windows/Thread.cpp index fed82e4d54..583a9613a3 100755 --- a/qpid/cpp/src/qpid/sys/windows/Thread.cpp +++ b/qpid/cpp/src/qpid/sys/windows/Thread.cpp @@ -65,6 +65,18 @@ Thread::Thread(Runnable* runnable) : impl(new ThreadPrivate(runnable)) {} Thread::Thread(Runnable& runnable) : impl(new ThreadPrivate(&runnable)) {} +Thread::operator bool() { + return impl; +} + +bool Thread::operator==(const Thread& t) const { + return impl->threadId == t.impl->threadId; +} + +bool Thread::operator!=(const Thread& t) const { + return !(*this==t); +} + void Thread::join() { if (impl) { DWORD status = WaitForSingleObject (impl->threadHandle, INFINITE); @@ -74,8 +86,8 @@ void Thread::join() { } } -unsigned long Thread::id() { - return impl ? impl->threadId : 0; +unsigned long Thread::logId() { + return GetCurrentThreadId(); } /* static */ diff --git a/qpid/cpp/src/tests/SocketProxy.h b/qpid/cpp/src/tests/SocketProxy.h index 4582dc36fd..0c6f39d62e 100644 --- a/qpid/cpp/src/tests/SocketProxy.h +++ b/qpid/cpp/src/tests/SocketProxy.h @@ -76,7 +76,7 @@ class SocketProxy : private qpid::sys::Runnable if (closed) { return; } closed=true; } - if (thread.id() != qpid::sys::Thread::current().id()) { + if (thread && thread != qpid::sys::Thread::current()) { thread.join(); joined = true; } diff --git a/qpid/cpp/src/tests/exception_test.cpp b/qpid/cpp/src/tests/exception_test.cpp index 4dac8ee965..3536ffddbe 100644 --- a/qpid/cpp/src/tests/exception_test.cpp +++ b/qpid/cpp/src/tests/exception_test.cpp @@ -74,7 +74,7 @@ struct Catcher : public Runnable { } bool join() { - if (thread.id()) { + if (thread) { thread.join(); thread=Thread(); } |