From: Sean Hefty Date: Sat, 26 May 2012 00:28:44 +0000 (-0700) Subject: rsockets: Simplify state checks X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=4f1e1a0f9774bec1ce86499234e166ca461e0644;p=~shefty%2Flibrdmacm.git rsockets: Simplify state checks Signed-off-by: Sean Hefty --- diff --git a/src/rsocket.c b/src/rsocket.c index e591116e..8cbd4252 100644 --- a/src/rsocket.c +++ b/src/rsocket.c @@ -121,6 +121,9 @@ struct rs_conn_data { struct rs_sge data_buf; }; +/* + * rsocket states are ordered as passive, connecting, connected, disconnected. + */ enum rs_state { rs_init, rs_bound, @@ -129,9 +132,9 @@ enum rs_state { rs_resolving_route, rs_connecting, rs_accepting, + rs_connect_error, rs_connected, rs_disconnected, - rs_connect_error, rs_error }; @@ -994,9 +997,7 @@ ssize_t rrecv(int socket, void *buf, size_t len, int flags) int ret; rs = idm_at(&idm, socket); - if (rs->state != rs_connected && - (rs->state == rs_resolving_addr || rs->state == rs_resolving_route || - rs->state == rs_connecting || rs->state == rs_accepting)) { + if (rs->state < rs_connected) { ret = rs_do_connect(rs); if (ret) { if (errno == EINPROGRESS) @@ -1098,7 +1099,7 @@ ssize_t rsend(int socket, const void *buf, size_t len, int flags) int ret = 0; rs = idm_at(&idm, socket); - if (rs->state != rs_connected) { + if (rs->state < rs_connected) { ret = rs_do_connect(rs); if (ret) { if (errno == EINPROGRESS) @@ -1190,7 +1191,7 @@ static ssize_t rsendv(int socket, const struct iovec *iov, int iovcnt, int flags int i, ret = 0; rs = idm_at(&idm, socket); - if (rs->state != rs_connected) { + if (rs->state < rs_connected) { ret = rs_do_connect(rs); if (ret) { if (errno == EINPROGRESS) @@ -1319,7 +1320,7 @@ static int rs_poll_rs(struct rsocket *rs, int events, revents |= POLLOUT; if (rs->state == rs_disconnected) revents |= POLLHUP; - if (rs->state == rs_error) + else if (rs->state == rs_error) revents |= POLLERR; return revents; @@ -1360,16 +1361,11 @@ static int rs_poll_arm(struct pollfd *rfds, struct pollfd *fds, nfds_t nfds) if (fds[i].revents) return 1; - switch (rs->state) { - case rs_connected: - case rs_disconnected: - case rs_error: + if (rs->state >= rs_connected) rfds[i].fd = rs->cm_id->recv_cq_channel->fd; - break; - default: + else rfds[i].fd = rs->cm_id->channel->fd; - break; - } + rfds[i].events = POLLIN; } else { rfds[i].fd = fds[i].fd;