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