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()