summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/client/CompletionTracker.cpp
diff options
context:
space:
mode:
authorAlan Conway <aconway@apache.org>2007-12-07 19:13:09 +0000
committerAlan Conway <aconway@apache.org>2007-12-07 19:13:09 +0000
commit7bc8f20e59e8f18926119a4bc5fdb5be262c500c (patch)
tree5112c5428872273dd26092cb5c8bdc3af3beb00e /cpp/src/qpid/client/CompletionTracker.cpp
parent237c3437a5a4b68c483af77c5d1346104ca404a0 (diff)
downloadqpid-python-7bc8f20e59e8f18926119a4bc5fdb5be262c500c.tar.gz
Summary:
- Replaced InProcessBroker with BrokerFixture, uses a full loopback broker for more realistic tests. - Extracted non-generated parts of Session_0_10 into SessionBase. - Sundry small fixes. src/tests/BrokerFixture.h - in process broker with loopback connections. - tests can force a disorderly disconnect. src/qpid/client/Connector.h - back door to private members for BrokerFixture. - close() in destructor to avoid leaks. src/qpid/client/ConnectionImpl.h,cpp: - close() in destructor, to fix hang when destroyed without being closed. src/qpid/client/CompletionTracker.h,.cpp: - Fixed race in close/add. src/qpid/client/SessionBase.h,cpp: - Extracted all non-generated code from Session_0_10 into SessionBase - Added sync() src/tests/exception_test.cpp: Converted to boost & BrokerFixture src/tests/ClientChannelTest.cpp, ClientSessionTest.cpp: Use BrokerFixture git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@602182 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/client/CompletionTracker.cpp')
-rw-r--r--cpp/src/qpid/client/CompletionTracker.cpp9
1 files changed, 5 insertions, 4 deletions
diff --git a/cpp/src/qpid/client/CompletionTracker.cpp b/cpp/src/qpid/client/CompletionTracker.cpp
index 46a7384ac2..4c6e59f1b8 100644
--- a/cpp/src/qpid/client/CompletionTracker.cpp
+++ b/cpp/src/qpid/client/CompletionTracker.cpp
@@ -31,12 +31,13 @@ namespace
const std::string empty;
}
-CompletionTracker::CompletionTracker() {}
+CompletionTracker::CompletionTracker() : closed(false) {}
CompletionTracker::CompletionTracker(const SequenceNumber& m) : mark(m) {}
void CompletionTracker::close()
{
sys::Mutex::ScopedLock l(lock);
+ closed=true;
while (!listeners.empty()) {
Record r(listeners.front());
{
@@ -47,17 +48,18 @@ void CompletionTracker::close()
}
}
+
void CompletionTracker::completed(const SequenceNumber& _mark)
{
sys::Mutex::ScopedLock l(lock);
mark = _mark;
while (!listeners.empty() && !(listeners.front().id > mark)) {
Record r(listeners.front());
+ listeners.pop_front();
{
sys::Mutex::ScopedUnlock u(lock);
r.completed();
}
- listeners.pop_front();
}
}
@@ -88,14 +90,13 @@ void CompletionTracker::listenForResult(const SequenceNumber& point, ResultListe
bool CompletionTracker::add(const Record& record)
{
sys::Mutex::ScopedLock l(lock);
- if (record.id < mark) {
+ if (record.id < mark || closed) {
return false;
} else {
//insert at the correct position
Listeners::iterator i = seek(record.id);
if (i == listeners.end()) i = listeners.begin();
listeners.insert(i, record);
-
return true;
}
}