+++ /dev/null
-Bottom: 9c6317e02ea13b4c7c116bc0ca8be00c54af4ed4
-Top: 05a5cd3651f670e432b95b931b9a56acfd6820c7
-Author: Sean Hefty <sean.hefty@intel.com>
-Date: 2012-06-26 16:49:57 -0700
-
-Refresh of shut_wr
-
----
-
-diff --git a/src/rsocket.c b/src/rsocket.c
-index a25c31a..5fc5404 100644
---- a/src/rsocket.c
-+++ b/src/rsocket.c
-@@ -147,6 +147,7 @@ enum rs_state {
- rs_connected = 0x0100,
- rs_connect_wr = rs_connected | 0x0200,
- rs_connect_rd = rs_connected | 0x0400,
-+ rs_connect_rdwr = rs_connect_rd | rs_connect_wr,
- rs_connect_error = 0x0800,
- rs_disconnected = 0x1000,
- rs_error = 0x2000,
-@@ -632,7 +633,7 @@ int raccept(int socket, struct sockaddr *addr, socklen_t *addrlen)
- rs_set_conn_data(new_rs, ¶m, &cresp);
- ret = rdma_accept(new_rs->cm_id, ¶m);
- if (!ret)
-- new_rs->state = rs_connected;
-+ new_rs->state = rs_connect_rdwr;
- else if (errno == EAGAIN || errno == EWOULDBLOCK)
- new_rs->state = rs_accepting;
- else
-@@ -719,7 +720,7 @@ connected:
- }
-
- rs_save_conn_data(rs, cresp);
-- rs->state = rs_connected;
-+ rs->state = rs_connect_rdwr;
- break;
- case rs_accepting:
- if (!(rs->fd_flags & O_NONBLOCK))
-@@ -729,7 +730,7 @@ connected:
- if (ret)
- break;
-
-- rs->state = rs_connected;
-+ rs->state = rs_connect_rdwr;
- break;
- default:
- ret = ERR(EINVAL);
-@@ -1728,7 +1729,7 @@ int rshutdown(int socket, int how)
- 0, 0, 0);
- }
-
-- if (!rs_all_sends_done(rs) && rs->state != rs_error)
-+ if (!rs_all_sends_done(rs) && !(rs->state & rs_error))
- rs_process_cq(rs, 0, rs_all_sends_done);
-
- if ((rs->fd_flags & O_NONBLOCK) && (how == SHUT_WR))
Bottom: 47c055283ab722851373ec3c7f8affac14e1f08b
-Top: 9c6317e02ea13b4c7c116bc0ca8be00c54af4ed4
+Top: 05a5cd3651f670e432b95b931b9a56acfd6820c7
Author: Sean Hefty <sean.hefty@intel.com>
Date: 2012-06-25 14:19:54 -0700
---
diff --git a/src/rsocket.c b/src/rsocket.c
-index c833d46..a25c31a 100644
+index c833d46..5fc5404 100644
--- a/src/rsocket.c
+++ b/src/rsocket.c
@@ -96,7 +96,8 @@ enum {
};
struct rs_msg {
-@@ -136,16 +137,19 @@ union rs_wr_id {
+@@ -136,16 +137,20 @@ union rs_wr_id {
*/
enum rs_state {
rs_init,
+ rs_connected = 0x0100,
+ rs_connect_wr = rs_connected | 0x0200,
+ rs_connect_rd = rs_connected | 0x0400,
++ rs_connect_rdwr = rs_connect_rd | rs_connect_wr,
+ rs_connect_error = 0x0800,
+ rs_disconnected = 0x1000,
+ rs_error = 0x2000,
};
#define RS_OPT_SWAP_SGL 1
-@@ -321,7 +325,7 @@ static int rs_set_nonblocking(struct rsocket *rs, long arg)
+@@ -321,7 +326,7 @@ static int rs_set_nonblocking(struct rsocket *rs, long arg)
if (rs->cm_id->recv_cq_channel)
ret = fcntl(rs->cm_id->recv_cq_channel->fd, F_SETFL, arg);
ret = fcntl(rs->cm_id->channel->fd, F_SETFL, arg);
return ret;
-@@ -852,7 +856,7 @@ static int rs_give_credits(struct rsocket *rs)
+@@ -628,7 +633,7 @@ int raccept(int socket, struct sockaddr *addr, socklen_t *addrlen)
+ rs_set_conn_data(new_rs, ¶m, &cresp);
+ ret = rdma_accept(new_rs->cm_id, ¶m);
+ if (!ret)
+- new_rs->state = rs_connected;
++ new_rs->state = rs_connect_rdwr;
+ else if (errno == EAGAIN || errno == EWOULDBLOCK)
+ new_rs->state = rs_accepting;
+ else
+@@ -715,7 +720,7 @@ connected:
+ }
+
+ rs_save_conn_data(rs, cresp);
+- rs->state = rs_connected;
++ rs->state = rs_connect_rdwr;
+ break;
+ case rs_accepting:
+ if (!(rs->fd_flags & O_NONBLOCK))
+@@ -725,7 +730,7 @@ connected:
+ if (ret)
+ break;
+
+- rs->state = rs_connected;
++ rs->state = rs_connect_rdwr;
+ break;
+ default:
+ ret = ERR(EINVAL);
+@@ -852,7 +857,7 @@ static int rs_give_credits(struct rsocket *rs)
{
return ((rs->rbuf_bytes_avail >= (rs->rbuf_size >> 1)) ||
((short) ((short) rs->rseq_no - (short) rs->rseq_comp) >= 0)) &&
}
static void rs_update_credits(struct rsocket *rs)
-@@ -900,14 +904,14 @@ static int rs_poll_cq(struct rsocket *rs)
+@@ -900,14 +905,14 @@ static int rs_poll_cq(struct rsocket *rs)
} else {
rs->ctrl_avail++;
}
while (!ret && rcnt--)
ret = rdma_post_recvv(rs->cm_id, NULL, NULL, 0);
-@@ -932,7 +936,7 @@ static int rs_get_cq_event(struct rsocket *rs)
+@@ -932,7 +937,7 @@ static int rs_get_cq_event(struct rsocket *rs)
if (!ret) {
ibv_ack_cq_events(rs->cm_id->recv_cq, 1);
rs->cq_armed = 0;
rs->state = rs_error;
}
-@@ -1043,7 +1047,7 @@ static int rs_can_send(struct rsocket *rs)
+@@ -1043,7 +1048,7 @@ static int rs_can_send(struct rsocket *rs)
static int rs_conn_can_send(struct rsocket *rs)
{
}
static int rs_can_send_ctrl(struct rsocket *rs)
-@@ -1058,7 +1062,7 @@ static int rs_have_rdata(struct rsocket *rs)
+@@ -1058,7 +1063,7 @@ static int rs_have_rdata(struct rsocket *rs)
static int rs_conn_have_rdata(struct rsocket *rs)
{
}
static int rs_all_sends_done(struct rsocket *rs)
-@@ -1111,7 +1115,7 @@ ssize_t rrecv(int socket, void *buf, size_t len, int flags)
+@@ -1111,7 +1116,7 @@ ssize_t rrecv(int socket, void *buf, size_t len, int flags)
int ret;
rs = idm_at(&idm, socket);
ret = rs_do_connect(rs);
if (ret) {
if (errno == EINPROGRESS)
-@@ -1213,7 +1217,7 @@ ssize_t rsend(int socket, const void *buf, size_t len, int flags)
+@@ -1213,7 +1218,7 @@ ssize_t rsend(int socket, const void *buf, size_t len, int flags)
int ret = 0;
rs = idm_at(&idm, socket);
ret = rs_do_connect(rs);
if (ret) {
if (errno == EINPROGRESS)
-@@ -1229,7 +1233,7 @@ ssize_t rsend(int socket, const void *buf, size_t len, int flags)
+@@ -1229,7 +1234,7 @@ ssize_t rsend(int socket, const void *buf, size_t len, int flags)
rs_conn_can_send);
if (ret)
break;
ret = ERR(ECONNRESET);
break;
}
-@@ -1322,7 +1326,7 @@ static ssize_t rsendv(int socket, const struct iovec *iov, int iovcnt, int flags
+@@ -1322,7 +1327,7 @@ static ssize_t rsendv(int socket, const struct iovec *iov, int iovcnt, int flags
int i, ret = 0;
rs = idm_at(&idm, socket);
ret = rs_do_connect(rs);
if (ret) {
if (errno == EINPROGRESS)
-@@ -1343,7 +1347,7 @@ static ssize_t rsendv(int socket, const struct iovec *iov, int iovcnt, int flags
+@@ -1343,7 +1348,7 @@ static ssize_t rsendv(int socket, const struct iovec *iov, int iovcnt, int flags
rs_conn_can_send);
if (ret)
break;
ret = ERR(ECONNRESET);
break;
}
-@@ -1435,17 +1439,35 @@ static int rs_poll_rs(struct rsocket *rs, int events,
+@@ -1435,17 +1440,35 @@ static int rs_poll_rs(struct rsocket *rs, int events,
short revents;
int ret;
ret = rs_do_connect(rs);
if (ret) {
if (errno == EINPROGRESS) {
-@@ -1455,28 +1477,13 @@ static int rs_poll_rs(struct rsocket *rs, int events,
+@@ -1455,28 +1478,13 @@ static int rs_poll_rs(struct rsocket *rs, int events,
return POLLOUT;
}
}
}
static int rs_poll_check(struct pollfd *fds, nfds_t nfds)
-@@ -1688,14 +1695,27 @@ int rselect(int nfds, fd_set *readfds, fd_set *writefds,
+@@ -1688,14 +1696,27 @@ int rselect(int nfds, fd_set *readfds, fd_set *writefds,
int rshutdown(int socket, int how)
{
struct rsocket *rs;
if (!rs_can_send_ctrl(rs)) {
ret = rs_process_cq(rs, 0, rs_can_send_ctrl);
if (ret)
-@@ -1704,13 +1724,16 @@ int rshutdown(int socket, int how)
+@@ -1704,13 +1725,16 @@ int rshutdown(int socket, int how)
rs->ctrl_avail--;
ret = rs_post_write(rs, 0, NULL, 0,
0, 0, 0);
}
- if (!rs_all_sends_done(rs) && rs->state != rs_error)
+- if (!rs_all_sends_done(rs) && rs->state != rs_error)
++ if (!rs_all_sends_done(rs) && !(rs->state & rs_error))
rs_process_cq(rs, 0, rs_all_sends_done);
+ if ((rs->fd_flags & O_NONBLOCK) && (how == SHUT_WR))
return 0;
}
-@@ -1719,7 +1742,7 @@ int rclose(int socket)
+@@ -1719,7 +1743,7 @@ int rclose(int socket)
struct rsocket *rs;
rs = idm_at(&idm, socket);
rshutdown(socket, SHUT_RDWR);
rs_free(rs);
-@@ -1830,8 +1853,9 @@ int rsetsockopt(int socket, int level, int optname,
+@@ -1830,8 +1854,9 @@ int rsetsockopt(int socket, int level, int optname,
default:
break;
}