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 2007/09/24 23:15:49 UTC

svn commit: r578975 - in /incubator/qpid/trunk/qpid: cpp/src/ cpp/src/qpid/broker/ cpp/src/tests/ specs/

Author: aconway
Date: Mon Sep 24 14:15:46 2007
New Revision: 578975

URL: http://svn.apache.org/viewvc?rev=578975&view=rev
Log:
2007-09-24  Alan Conway  <ac...@redhat.com>

	* cpp/src/qpid/broker/SessionManager.cpp: Manage suspended sessions.
	Replaces SuspendedSessions.
	* cpp/src/qpid/broker/SessionState.cpp: Work with SessionManager.
	* cpp/src/qpid/broker/SessionHandler.cpp: Owns SessionState.
	* cpp/src/qpid/broker/Connection.h, .cpp: Owns session handlers.
	* cpp/src/qpid/broker/Broker.h: Added SessionManager member.
	* cpp/src/Makefile.am: Added broker/SessionManager.cpp
	* amqp.0-10-preview.xml: Added session-busy and channel-busy constants.
	* cpp/src/tests/.valgrind.supp-default: Added suppresssions for F7.

Added:
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionManager.cpp
      - copied, changed from r578221, incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SuspendedSessions.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionManager.h
      - copied, changed from r578221, incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SuspendedSessions.h
Removed:
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SuspendedSessions.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SuspendedSessions.h
    incubator/qpid/trunk/qpid/cpp/src/tests/Session.cpp
Modified:
    incubator/qpid/trunk/qpid/cpp/src/Makefile.am
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Broker.h
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Connection.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Connection.h
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionHandler.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionHandler.h
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionState.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionState.h
    incubator/qpid/trunk/qpid/cpp/src/tests/.valgrind.supp-default
    incubator/qpid/trunk/qpid/cpp/src/tests/ClientSessionTest.cpp
    incubator/qpid/trunk/qpid/cpp/src/tests/run_test
    incubator/qpid/trunk/qpid/specs/amqp.0-10-preview.xml

Modified: incubator/qpid/trunk/qpid/cpp/src/Makefile.am
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/Makefile.am?rev=578975&r1=578974&r2=578975&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/Makefile.am (original)
+++ incubator/qpid/trunk/qpid/cpp/src/Makefile.am Mon Sep 24 14:15:46 2007
@@ -177,6 +177,8 @@
   qpid/broker/SemanticState.cpp \
   qpid/broker/SessionState.h \
   qpid/broker/SessionState.cpp \
+  qpid/broker/SessionManager.h \
+  qpid/broker/SessionManager.cpp \
   qpid/broker/SessionHandler.h \
   qpid/broker/SessionHandler.cpp \
   qpid/broker/SemanticHandler.cpp \

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Broker.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Broker.h?rev=578975&r1=578974&r2=578975&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Broker.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Broker.h Mon Sep 24 14:15:46 2007
@@ -29,6 +29,7 @@
 #include "ExchangeRegistry.h"
 #include "MessageStore.h"
 #include "QueueRegistry.h"
+#include "SessionManager.h"
 #include "qpid/Options.h"
 #include "qpid/Plugin.h"
 #include "qpid/Url.h"
@@ -103,6 +104,8 @@
     uint64_t getStagingThreshold() { return stagingThreshold; }
     DtxManager& getDtxManager() { return dtxManager; }
 
+    SessionManager& getSessionManager() { return sessionManager; }
+    
   private:
     sys::Acceptor& getAcceptor() const;
 
@@ -117,6 +120,7 @@
     ConnectionFactory factory;
     DtxManager dtxManager;
     HandlerUpdaters handlerUpdaters;
+    SessionManager sessionManager;
 
     static MessageStore* createStore(const Options& config);
 };

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Connection.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Connection.cpp?rev=578975&r1=578974&r2=578975&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Connection.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Connection.cpp Mon Sep 24 14:15:46 2007
@@ -94,13 +94,12 @@
 }
 
 SessionHandler& Connection::getChannel(ChannelId id) {
-    boost::optional<SessionHandler>& ch = channels[id];
-    if (!ch) {
-        ch = boost::in_place(boost::ref(*this), id); 
+    ChannelMap::iterator i=channels.find(id);
+    if (i == channels.end()) {
+        i = channels.insert(id, new SessionHandler(*this, id)).first;
     }
-    return *ch;
+    return *i;
 }
-
 
 }}
 

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Connection.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Connection.h?rev=578975&r1=578974&r2=578975&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Connection.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Connection.h Mon Sep 24 14:15:46 2007
@@ -38,7 +38,7 @@
 #include "ConnectionHandler.h"
 #include "SessionHandler.h"
 
-#include <boost/optional.hpp>
+#include <boost/ptr_container/ptr_map.hpp>
 
 namespace qpid {
 namespace broker {
@@ -82,9 +82,7 @@
     void closeChannel(framing::ChannelId channel);
 
   private:
-
-    // Use boost::optional to allow default-constructed uninitialized entries in the map.
-    typedef std::map<framing::ChannelId, boost::optional<SessionHandler> >ChannelMap;
+    typedef boost::ptr_map<framing::ChannelId, SessionHandler> ChannelMap;
     typedef std::vector<Queue::shared_ptr>::iterator queue_iterator;
 
     framing::ProtocolVersion version;

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionHandler.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionHandler.cpp?rev=578975&r1=578974&r2=578975&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionHandler.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionHandler.cpp Mon Sep 24 14:15:46 2007
@@ -35,7 +35,7 @@
       connection(c), channel(ch), proxy(out),
       ignoring(false) {}
 
-SessionHandler::~SessionHandler() {}
+SessionHandler::~SessionHandler() { }
 
 namespace {
 ClassId classId(AMQMethodBody* m) { return m ? m->amqpMethodId() : 0; }
@@ -53,7 +53,7 @@
     try {
         if (m && m->invoke(this))
             return;
-        else if (session)
+        else if (session.get())
             session->in(f);
         else if (!ignoring)
             throw ChannelErrorException(
@@ -76,7 +76,7 @@
 }
 
 void SessionHandler::assertOpen(const char* method) {
-    if (!session)
+     if (!session.get())
         throw ChannelErrorException(
             QPID_MSG(""<<method<<" failed: No session for channel "
                      << getChannel()));
@@ -85,7 +85,7 @@
 void SessionHandler::assertClosed(const char* method) {
     // FIXME aconway 2007-08-31: Should raise channel-busy, need
     // to update spec.
-    if (session)
+    if (session.get())
         throw PreconditionFailedException(
             QPID_MSG(""<<method<<" failed: "
                      << channel << " already open on channel "
@@ -94,7 +94,9 @@
 
 void  SessionHandler::open(uint32_t detachedLifetime) {
     assertClosed("open");
-    session.reset(new SessionState(*this, detachedLifetime));
+    std::auto_ptr<SessionState> state(
+        connection.broker.getSessionManager().open(*this, detachedLifetime));
+    session.reset(state.release());
     getProxy().getSession().attached(session->getId(), session->getTimeout());
 }
 

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionHandler.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionHandler.h?rev=578975&r1=578974&r2=578975&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionHandler.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionHandler.h Mon Sep 24 14:15:46 2007
@@ -27,6 +27,8 @@
 #include "qpid/framing/AMQP_ClientProxy.h"
 #include "qpid/framing/amqp_types.h"
 
+#include <boost/noncopyable.hpp>
+
 namespace qpid {
 namespace broker {
 
@@ -37,11 +39,10 @@
  * A SessionHandler is associated with each active channel. It
  * receives incoming frames, handles session commands and manages the
  * association between the channel and a session.
- *
- * SessionHandlers can be stored in a map by value.
  */
 class SessionHandler : public framing::FrameHandler::InOutHandler,
-                       private framing::AMQP_ServerOperations::SessionHandler
+                       private framing::AMQP_ServerOperations::SessionHandler,
+                       private boost::noncopyable
 {
   public:
     SessionHandler(Connection&, framing::ChannelId);
@@ -84,8 +85,8 @@
     Connection& connection;
     const framing::ChannelId channel;
     framing::AMQP_ClientProxy proxy;
-    shared_ptr<SessionState> session;
     bool ignoring;
+    std::auto_ptr<SessionState> session;
 };
 
 }} // namespace qpid::broker

Copied: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionManager.cpp (from r578221, incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SuspendedSessions.cpp)
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionManager.cpp?p2=incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionManager.cpp&p1=incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SuspendedSessions.cpp&r1=578221&r2=578975&rev=578975&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SuspendedSessions.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionManager.cpp Mon Sep 24 14:15:46 2007
@@ -18,43 +18,67 @@
  * under the License.
  *
  */
-#include "SuspendedSessions.h"
+
+#include "SessionManager.h"
+#include "SessionState.h"
+#include "qpid/framing/reply_exceptions.h"
+#include "qpid/memory.h"
+
 #include <boost/bind.hpp>
 
+#include <algorithm>
+#include <functional>
+
 namespace qpid {
 namespace broker {
 
-using namespace framing;
 using namespace sys;
-using namespace boost;
-typedef Mutex::ScopedLock Lock;
+using namespace framing;
+using std::make_pair;
 
-void SuspendedSessions::suspend(SessionState& s) {
-    Lock l(lock);
-    assert(s.state == SessionState::ACTIVE);
-    if (s.timeout == 0) 
-        s.state = SessionState::CLOSED;
-    else {
-        AbsTime expires(now(), Duration(s.timeout*TIME_SEC));
-        suspended.insert(std::make_pair(expires, s));
-        s.state = SessionState::SUSPENDED;
-    }
-}
+SessionManager::SessionManager() {}
+
+SessionManager::~SessionManager() {}
 
-SessionState SuspendedSessions::resume(const Uuid& id)
+std::auto_ptr<SessionState>  SessionManager::open(
+    SessionHandler& h, uint32_t timeout_)
 {
-    Lock l(lock);
-    Map::iterator notExpired = suspended.lower_bound(now());
-    suspended.erase(suspended.begin(), notExpired);
-    Map::iterator i = suspended.begin();
-    while (i != suspended.end() && i->second.getId() != id)
-        ++i;
-    if (i == suspended.end())
-        throw Exception(QPID_MSG("Session timed out or invalid ID: " << id));
-    return i->second;
+    Mutex::ScopedLock l(lock);
+    std::auto_ptr<SessionState> session(new SessionState(*this, h, timeout_));
+    active.insert(session->getId());
+    return session;
 }
 
-}} // namespace qpid::broker
+void  SessionManager::suspend(std::auto_ptr<SessionState> session) {
+    Mutex::ScopedLock l(lock);
+    session->expiry = AbsTime(now(),session->getTimeout());
+    suspended.push_back(session.release()); // In expiry order
+    eraseExpired();
+}
 
+std::auto_ptr<SessionState>  SessionManager::resume(const Uuid& id) {
+    Mutex::ScopedLock l(lock);
+    eraseExpired();
+    if (active.find(id) != active.end()) 
+        throw SessionBusyException(
+            QPID_MSG("Session already active: " << id));
+    Suspended::iterator i = std::find_if(
+        suspended.begin(), suspended.end(),
+        boost::bind(std::equal_to<Uuid>(), id, boost::bind(&SessionState::getId, _1))
+    );
+    if (i == suspended.end())
+        throw InvalidArgumentException(
+            QPID_MSG("No suspended session with id=" << id));
+    active.insert(id);
+    return make_auto_ptr(suspended.release(i).release());
+}
 
+void SessionManager::eraseExpired() {
+    // Called with lock held.
+    Suspended::iterator i = std::lower_bound(
+        suspended.begin(), suspended.end(), now(), 
+        boost::bind(std::less<AbsTime>(), boost::bind(&SessionState::expiry, _1), _2));
+    suspended.erase(suspended.begin(), i);
+}
 
+}} // namespace qpid::broker

Copied: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionManager.h (from r578221, incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SuspendedSessions.h)
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionManager.h?p2=incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionManager.h&p1=incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SuspendedSessions.h&r1=578221&r2=578975&rev=578975&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SuspendedSessions.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionManager.h Mon Sep 24 14:15:46 2007
@@ -1,5 +1,5 @@
-#ifndef QPID_BROKER_SUSPENDEDSESSIONS_H
-#define QPID_BROKER_SUSPENDEDSESSIONS_H
+#ifndef QPID_BROKER_SESSIONMANAGER_H
+#define QPID_BROKER_SESSIONMANAGER_H
 
 /*
  *
@@ -22,40 +22,62 @@
  *
  */
 
-#include "qpid/broker/SessionState.h"
-#include "qpid/sys/Time.h"
-#include "qpid/sys/Mutex.h"
-
-#include <map>
+#include <qpid/framing/Uuid.h>
+#include <qpid/sys/Time.h>
+#include <qpid/sys/Mutex.h>
+
+#include <boost/noncopyable.hpp>
+#include <boost/ptr_container/ptr_vector.hpp>
+
+#include <set>
+#include <vector>
+#include <memory>
 
 namespace qpid {
 namespace broker {
 
+class SessionState;
+class SessionHandler;
+
 /**
- * Thread safe collection of suspended sessions.
- * Every session is owned either by a connection's SessionHandler
- * or by the SuspendedSessions.
+ * Create and manage SessionState objects.
  */
-class SuspendedSessions {
-    typedef std::multimap<sys::AbsTime,SessionState> Map;
-
-    sys::Mutex lock;
-    Map suspended;
-        
+class SessionManager : private boost::noncopyable {
   public:
-    /** Suspend a session, start it's timeout counter.*/
-    void suspend(SessionState& session);
+    SessionManager();
+    ~SessionManager();
+    /** Open a new active session, caller takes ownership */
+    std::auto_ptr<SessionState> open(
+        SessionHandler& h, uint32_t timeout_);
+    
+    /** Suspend a session, start it's timeout counter.
+     * The factory takes ownership.
+     */
+    void suspend(std::auto_ptr<SessionState> session);
         
     /** Resume a suspended session.
      *@throw Exception if timed out or non-existant.
      */
-    SessionState resume(const framing::Uuid& id);
+    std::auto_ptr<SessionState> resume(const framing::Uuid& id);
+
+  private:
+    typedef boost::ptr_vector<SessionState> Suspended;
+    typedef std::set<framing::Uuid> Active;
+
+    sys::Mutex lock;
+    Suspended suspended;
+    Active active;
+
+    void eraseExpired();             
+  friend class SessionState; // removes deleted sessions from active set. 
 };
-    
+
 
 
 }} // namespace qpid::broker
 
 
 
-#endif  /*!QPID_BROKER_SUSPENDEDSESSIONS_H*/
+
+
+#endif  /*!QPID_BROKER_SESSIONMANAGER_H*/

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionState.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionState.cpp?rev=578975&r1=578974&r2=578975&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionState.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionState.cpp Mon Sep 24 14:15:46 2007
@@ -19,18 +19,20 @@
  *
  */
 #include "SessionState.h"
+#include "SessionManager.h"
 #include "SessionHandler.h"
 #include "Connection.h"
 #include "Broker.h"
 #include "SemanticHandler.h"
+#include "qpid/framing/reply_exceptions.h"
 
 namespace qpid {
 namespace broker {
 
 using namespace framing;
 
-SessionState::SessionState(SessionHandler& h, uint32_t timeout_) 
-    : handler(&h), id(true), timeout(timeout_),
+SessionState::SessionState(SessionManager& f, SessionHandler& h, uint32_t timeout_) 
+    : factory(f), handler(&h), id(true), timeout(timeout_),
       broker(h.getConnection().broker),
       version(h.getConnection().getVersion())
 {
@@ -45,6 +47,11 @@
     broker.update(handler->getChannel(), *this);       
 }
 
+SessionState::~SessionState() {
+    // Remove ID from active session list.
+    factory.active.erase(getId());
+}
+
 SessionHandler& SessionState::getHandler() {
     assert(isAttached());
     return *handler;
@@ -53,9 +60,7 @@
 AMQP_ClientProxy& SessionState::getProxy() {
     return getHandler().getProxy();
 }
-    /** Convenience for: getHandler()->getConnection()
-     *@pre getHandler() != 0
-     */
+
 Connection& SessionState::getConnection() {
     return getHandler().getConnection();
 }

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionState.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionState.h?rev=578975&r1=578974&r2=578975&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionState.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SessionState.h Mon Sep 24 14:15:46 2007
@@ -25,10 +25,13 @@
 #include "qpid/framing/Uuid.h"
 #include "qpid/framing/FrameHandler.h"
 #include "qpid/framing/ProtocolVersion.h"
+#include "qpid/sys/Time.h"
 
 #include <boost/ptr_container/ptr_vector.hpp>
 #include <boost/noncopyable.hpp>
 
+#include <set>
+#include <vector>
 
 namespace qpid {
 
@@ -39,6 +42,7 @@
 namespace broker {
 
 class SessionHandler;
+class SessionManager;
 class Broker;
 class Connection;
 
@@ -59,9 +63,7 @@
                      private boost::noncopyable
 {
   public:
-    /** SessionState for a newly opened connection. */
-    SessionState(SessionHandler& h, uint32_t timeout_);
-
+    ~SessionState();
     bool isAttached() { return handler; }
 
     /** @pre isAttached() */
@@ -77,19 +79,21 @@
     uint32_t getTimeout() const { return timeout; }
     Broker& getBroker() { return broker; }
     framing::ProtocolVersion getVersion() const { return version; }
-    
 
   private:
-  friend class SessionHandler;  // Only SessionHandler can attach/detach
-    void detach() { handler=0; }
-    void attach(SessionHandler& h) { handler = &h; }
+    /** Only SessionManager can open sessions */
+    SessionState(SessionManager& f, SessionHandler& h, uint32_t timeout_);
 
+    SessionManager& factory;
     SessionHandler* handler;    
     framing::Uuid id;
     uint32_t timeout;
+    sys::AbsTime expiry;        // Used by SessionManager.
     Broker& broker;
     boost::ptr_vector<framing::FrameHandler> chain;
     framing::ProtocolVersion version;
+
+  friend class SessionManager;
 };
 
 }} // namespace qpid::broker

Modified: incubator/qpid/trunk/qpid/cpp/src/tests/.valgrind.supp-default
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/.valgrind.supp-default?rev=578975&r1=578974&r2=578975&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/.valgrind.supp-default (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/.valgrind.supp-default Mon Sep 24 14:15:46 2007
@@ -42,4 +42,22 @@
    fun:pthread_create@GLIBC_2.0
    fun:_ZN4qpid3sys16AsynchIOAcceptor3runEPNS0_29ConnectionInputHandlerFactoryE
 }
+ 
+{
+   Bogus error appearing on Fedora 7.
+   Memcheck:Cond
+   fun:_dl_relocate_object
+   fun:dl_main
+   fun:_dl_sysdep_start
+   fun:_dl_start
+   obj:/lib/ld-2.6.so
+}
 
+{
+   Bogus error appearing on Fedora 7.
+   Memcheck:Cond
+   fun:_dl_relocate_object
+   fun:dl_open_worker
+   fun:_dl_catch_error
+   fun:_dl_open
+}

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=578975&r1=578974&r2=578975&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/ClientSessionTest.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/ClientSessionTest.cpp Mon Sep 24 14:15:46 2007
@@ -137,6 +137,9 @@
         listener.messages.pop_front();
 
     }
+
+    void testSuspendResume() {
+    }
 };
 
 // Make this test suite a plugin.

Modified: incubator/qpid/trunk/qpid/cpp/src/tests/run_test
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/run_test?rev=578975&r1=578974&r2=578975&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/run_test (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/run_test Mon Sep 24 14:15:46 2007
@@ -36,6 +36,7 @@
     test -n "$VALGRIND" && vg_check
 else
     # This is a non-libtool shell script, just execute it.
+    export VALGRIND srcdir
     exec "$@"
 fi
 

Modified: incubator/qpid/trunk/qpid/specs/amqp.0-10-preview.xml
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/specs/amqp.0-10-preview.xml?rev=578975&r1=578974&r2=578975&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/specs/amqp.0-10-preview.xml (original)
+++ incubator/qpid/trunk/qpid/specs/amqp.0-10-preview.xml Mon Sep 24 14:15:46 2007
@@ -231,6 +231,12 @@
     </doc>
   </constant>
 
+  <constant name="session-busy" value="407" class="soft-error">
+    <doc>
+      A session.resume was attempted for a session already attached to another channel.
+    </doc>
+  </constant>
+
   <constant name="frame-error" value="501" class="hard-error">
     <doc>
       The client sent a malformed frame that the server could not decode. This strongly implies a
@@ -291,6 +297,12 @@
   <constant name="invalid-argument" value="542" class="hard-error">
     <doc>
       An invalid or illegal argument was passed to a method, and the operation could not proceed.
+    </doc>
+  </constant>
+
+  <constant name="channel-busy" value="543" class="hard-error">
+    <doc>
+      A session.open was sent on a channel that was already attached to a session.
     </doc>
   </constant>