From 5a51c2ae068e7c4cfc0ca29ba2c1bbfb76595aa9 Mon Sep 17 00:00:00 2001 From: Sean Hefty Date: Tue, 26 Jun 2012 17:47:35 -0700 Subject: [PATCH] Refresh of shut_wr --- src/rsocket.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/rsocket.c b/src/rsocket.c index 4ed646b5..581ecd8a 100644 --- a/src/rsocket.c +++ b/src/rsocket.c @@ -167,7 +167,7 @@ struct rsocket { uint64_t so_opts; uint64_t tcp_opts; uint64_t ipv6_opts; - enum rs_state state; + int state; int cq_armed; int retries; int err; @@ -757,6 +757,14 @@ int rconnect(int socket, const struct sockaddr *addr, socklen_t addrlen) return rs_do_connect(rs); } +static int rs_shutdown_state(struct rsocket *rs, int state) +{ + rs->state &= ~state; + if (rs->state == rs_connected) + rs->state = rs_disconnected; + return rs->state == rs_disconnected; +} + static int rs_post_write(struct rsocket *rs, uint64_t wr_id, struct ibv_sge *sgl, int nsge, uint32_t imm_data, int flags, @@ -889,7 +897,8 @@ static int rs_poll_cq(struct rsocket *rs) rs->state = rs_disconnected; return ERR(ECONNRESET); } else if (rs_msg_data(imm_data) == RS_CTRL_SHUTDOWN) { - rs->state &= ~rs_connect_rd; + if (rs_shutdown_state(rs, rs_connect_rd)) + return ERR(ECONNRESET); } break; default: @@ -1702,9 +1711,7 @@ int rshutdown(int socket, int how) rs = idm_at(&idm, socket); if (how == SHUT_RD) { - rs->state &= ~rs_connect_rd; - if (rs->state == rs_connected) - rs->state = rs_disconnected; + rs_shutdown_state(rs, rs_connect_rd); return 0; } @@ -1716,8 +1723,8 @@ int rshutdown(int socket, int how) ctrl = RS_CTRL_DISCONNECT; rs->state = rs_disconnected; } else { - ctrl = RS_CTRL_SHUTDOWN; - rs->state &= ~rs_connect_wr; + ctrl = rs_shutdown_state(rs, rs_connect_wr) ? + RS_CTRL_DISCONNECT : RS_CTRL_SHUTDOWN; } if (!rs_can_send_ctrl(rs)) { ret = rs_process_cq(rs, 0, rs_can_send_ctrl); -- 2.45.2