You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2008/02/05 21:44:25 UTC
svn commit: r618770 - in /incubator/qpid/trunk/qpid/cpp/src:
qpid/broker/Timer.cpp qpid/broker/Timer.h qpid/client/LocalQueue.cpp
qpid/client/LocalQueue.h qpid/sys/BlockingQueue.h tests/BrokerFixture.h
tests/ClientSessionTest.cpp
Author: aconway
Date: Tue Feb 5 12:44:14 2008
New Revision: 618770
URL: http://svn.apache.org/viewvc?rev=618770&view=rev
Log:
Added testSendToSelf for https://bugzilla.redhat.com/show_bug.cgi?id=410551
M src/tests/ClientSessionTest.cpp
Disabled management for BrokerFixture - management singleton assumes
only one broker per process, causes shutdown races with fixtures.
M src/tests/BrokerFixture.h
Made Timer::stop() idempotent
M src/qpid/broker/Timer.cpp
M src/qpid/broker/Timer.h
Added STL-style size() and empty()
M src/qpid/sys/BlockingQueue.h
M src/qpid/client/LocalQueue.cpp
M src/qpid/client/LocalQueue.h
Modified:
incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Timer.cpp
incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Timer.h
incubator/qpid/trunk/qpid/cpp/src/qpid/client/LocalQueue.cpp
incubator/qpid/trunk/qpid/cpp/src/qpid/client/LocalQueue.h
incubator/qpid/trunk/qpid/cpp/src/qpid/sys/BlockingQueue.h
incubator/qpid/trunk/qpid/cpp/src/tests/BrokerFixture.h
incubator/qpid/trunk/qpid/cpp/src/tests/ClientSessionTest.cpp
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Timer.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Timer.cpp?rev=618770&r1=618769&r2=618770&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Timer.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Timer.cpp Tue Feb 5 12:44:14 2008
@@ -85,17 +85,13 @@
void Timer::stop()
{
- signalStop();
- runner.join();
-}
-
-void Timer::signalStop()
-{
- Monitor::ScopedLock l(monitor);
- if (active) {
+ {
+ Monitor::ScopedLock l(monitor);
+ if (!active) return;
active = false;
monitor.notifyAll();
}
+ runner.join();
}
bool Later::operator()(const intrusive_ptr<TimerTask>& a,
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Timer.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Timer.h?rev=618770&r1=618769&r2=618770&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Timer.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Timer.h Tue Feb 5 12:44:14 2008
@@ -59,7 +59,6 @@
bool active;
virtual void run();
- void signalStop();
public:
Timer();
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/client/LocalQueue.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/client/LocalQueue.cpp?rev=618770&r1=618769&r2=618770&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/client/LocalQueue.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/client/LocalQueue.cpp Tue Feb 5 12:44:14 2008
@@ -47,11 +47,18 @@
void LocalQueue::setAckPolicy(AckPolicy a) { autoAck=a; }
-bool LocalQueue::empty()
+bool LocalQueue::empty() const
{
if (!queue)
throw ClosedException();
- return queue->isEmpty();
+ return queue->empty();
+}
+
+size_t LocalQueue::size() const
+{
+ if (!queue)
+ throw ClosedException();
+ return queue->size();
}
}} // namespace qpid::client
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/client/LocalQueue.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/client/LocalQueue.h?rev=618770&r1=618769&r2=618770&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/client/LocalQueue.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/client/LocalQueue.h Tue Feb 5 12:44:14 2008
@@ -44,8 +44,8 @@
*@exception ClosedException if subscription has been closed.
*/
Message pop();
- bool empty();
-
+ bool empty() const;
+ size_t size() const;
void setAckPolicy(AckPolicy);
private:
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/sys/BlockingQueue.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/sys/BlockingQueue.h?rev=618770&r1=618769&r2=618770&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/sys/BlockingQueue.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/sys/BlockingQueue.h Tue Feb 5 12:44:14 2008
@@ -103,9 +103,13 @@
return closed;
}
- bool isEmpty() const {
+ bool empty() const {
Waitable::ScopedLock l(lock);
return queue.empty();
+ }
+ size_t size() const {
+ Waitable::ScopedLock l(lock);
+ return queue.size();
}
private:
Modified: incubator/qpid/trunk/qpid/cpp/src/tests/BrokerFixture.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/BrokerFixture.h?rev=618770&r1=618769&r2=618770&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/BrokerFixture.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/BrokerFixture.h Tue Feb 5 12:44:14 2008
@@ -43,6 +43,8 @@
BrokerFixture() {
Broker::Options opts;
opts.port=0;
+ // Management doesn't play well with multiple in-process brokers.
+ opts.enableMgmt=false;
opts.workerThreads=1;
broker = Broker::create(opts);
// TODO aconway 2007-12-05: At one point BrokerFixture
Modified: incubator/qpid/trunk/qpid/cpp/src/tests/ClientSessionTest.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/ClientSessionTest.cpp?rev=618770&r1=618769&r2=618770&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/ClientSessionTest.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/ClientSessionTest.cpp Tue Feb 5 12:44:14 2008
@@ -167,5 +167,22 @@
BOOST_CHECK_EQUAL(string("my-message"), msg->getContent());
}
+BOOST_FIXTURE_TEST_CASE(testSendToSelf, SessionFixture) {
+ // https://bugzilla.redhat.com/show_bug.cgi?id=410551
+ // Deadlock if SubscriptionManager run() concurrent with session ack.
+ LocalQueue myq;
+ session.queueDeclare(queue="myq", exclusive=true, autoDelete=true);
+ subs.subscribe(myq, "myq");
+ string data("msg");
+ Message msg(data, "myq");
+ const int count=100; // Verified with count=100000 in a loop.
+ for (int i = 0; i < count; ++i)
+ session.messageTransfer(content=msg);
+ for (int j = 0; j < count; ++j) {
+ Message m=myq.pop();
+ BOOST_CHECK_EQUAL(m.getData(), data);
+ }
+}
+
QPID_AUTO_TEST_SUITE_END()