summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Stitcher <astitcher@apache.org>2010-04-21 22:07:04 +0000
committerAndrew Stitcher <astitcher@apache.org>2010-04-21 22:07:04 +0000
commite20869eb4e1ed97f00c3f3e9843b14a00267d25b (patch)
treecfce5a61a9b46de37e8d486ab00ce7d22fed0737
parent1dfffd6555da0b05d88b8e25e4d21951337c4faf (diff)
downloadqpid-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.h8
-rw-r--r--qpid/cpp/src/qpid/cluster/Cluster.cpp6
-rw-r--r--qpid/cpp/src/qpid/sys/PollableQueue.h6
-rw-r--r--qpid/cpp/src/qpid/sys/posix/Thread.cpp26
-rwxr-xr-xqpid/cpp/src/qpid/sys/windows/Thread.cpp16
-rw-r--r--qpid/cpp/src/tests/SocketProxy.h2
-rw-r--r--qpid/cpp/src/tests/exception_test.cpp2
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();
}