You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by as...@apache.org on 2010/05/13 04:26:14 UTC

svn commit: r943770 - in /qpid/trunk/qpid/cpp/src/qpid/sys/rdma: rdma_exception.h rdma_wrap.h

Author: astitcher
Date: Thu May 13 02:26:14 2010
New Revision: 943770

URL: http://svn.apache.org/viewvc?rev=943770&view=rev
Log:
Allow rdma_disconnect() to fail with EINVAL as it appears
to be necessary to call rdma_disconnect() after receiving
a disconnection event in Infiniband, but it's not allowed
on iWarp as the disconnect event has already disconnected
the queue pair.

Modified:
    qpid/trunk/qpid/cpp/src/qpid/sys/rdma/rdma_exception.h
    qpid/trunk/qpid/cpp/src/qpid/sys/rdma/rdma_wrap.h

Modified: qpid/trunk/qpid/cpp/src/qpid/sys/rdma/rdma_exception.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/rdma/rdma_exception.h?rev=943770&r1=943769&r2=943770&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/rdma/rdma_exception.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/rdma/rdma_exception.h Thu May 13 02:26:14 2010
@@ -48,6 +48,10 @@ namespace Rdma {
             throw Rdma::Exception((rc == -1) ? errno : rc >0 ? rc : -rc);
     }
 
+    inline int GETERR(int rc) {
+        return (rc == -1) ? errno : rc > 0 ? rc : -rc;
+    }
+
     inline void CHECK_IBV(int rc) {
         if (rc != 0)
             throw Rdma::Exception(rc);

Modified: qpid/trunk/qpid/cpp/src/qpid/sys/rdma/rdma_wrap.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/rdma/rdma_wrap.h?rev=943770&r1=943769&r2=943770&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/rdma/rdma_wrap.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/rdma/rdma_wrap.h Thu May 13 02:26:14 2010
@@ -344,7 +344,7 @@ namespace Rdma {
             assert(id.get());
             ::rdma_cm_event* e;
             int rc = ::rdma_get_cm_event(id->channel, &e);
-            if (rc == -1 && errno == EAGAIN)
+            if (GETERR(rc) == EAGAIN)
                 return ConnectionEvent();
             CHECK(rc);
             return ConnectionEvent(e);
@@ -375,7 +375,13 @@ namespace Rdma {
 
         void disconnect() const {
             assert(id.get());
-            CHECK(::rdma_disconnect(id.get()));
+            int rc = ::rdma_disconnect(id.get());
+            // iWarp doesn't let you disconnect a disconnected connection
+            // but Infiniband can do so it's okay to call rdma_disconnect()
+            // in response to a disconnect event, but we may get an error
+            if (GETERR(rc) == EINVAL)
+	        return;
+            CHECK(rc);
         }
 
         // TODO: Currently you can only connect with the default connection parameters



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org