jsonrpc: simplify by removing use of poll()

Change-Id: Ib756212d227fb71b9ef3d486223740e4cb152815
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
Reviewed-on: https://review.gerrithub.io/370200
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Daniel Verkamp 2017-07-18 11:34:01 -07:00
parent 1be7a80c2d
commit 1153b8c5c4
2 changed files with 10 additions and 60 deletions

View File

@ -69,14 +69,12 @@ struct spdk_jsonrpc_server_conn {
uint32_t outstanding_requests;
struct spdk_ring *send_queue;
struct spdk_jsonrpc_request *send_request;
struct pollfd *pfd;
};
struct spdk_jsonrpc_server {
int sockfd;
spdk_jsonrpc_handle_request_fn handle_request;
struct spdk_jsonrpc_server_conn conns[SPDK_JSONRPC_MAX_CONNS];
struct pollfd pollfds[SPDK_JSONRPC_MAX_CONNS + 1];
int num_conns;
};

View File

@ -86,10 +86,6 @@ spdk_jsonrpc_server_listen(int domain, int protocol,
return NULL;
}
/* Put listen socket in pollfds[0] */
server->pollfds[0].fd = server->sockfd;
server->pollfds[0].events = POLLIN;
return server;
}
@ -112,9 +108,6 @@ spdk_jsonrpc_server_conn_close(struct spdk_jsonrpc_server_conn *conn)
{
conn->closed = true;
/* Set the pollfd fd to a negative value so it is ignored by poll() */
conn->pfd->fd = -1;
if (conn->sockfd >= 0) {
close(conn->sockfd);
conn->sockfd = -1;
@ -140,7 +133,6 @@ static int
spdk_jsonrpc_server_accept(struct spdk_jsonrpc_server *server)
{
struct spdk_jsonrpc_server_conn *conn;
struct pollfd *pfd;
int rc, conn_idx, nonblock;
rc = accept(server->sockfd, NULL, NULL);
@ -169,13 +161,6 @@ spdk_jsonrpc_server_accept(struct spdk_jsonrpc_server *server)
return -1;
}
/* Add connection to pollfds */
pfd = &server->pollfds[conn_idx + 1];
pfd->fd = conn->sockfd;
pfd->events = POLLIN | POLLOUT;
pfd->revents = 0;
conn->pfd = pfd;
server->num_conns++;
return 0;
@ -333,7 +318,6 @@ int
spdk_jsonrpc_server_poll(struct spdk_jsonrpc_server *server)
{
int rc, i;
struct pollfd *pfd;
struct spdk_jsonrpc_server_conn *conn;
for (i = 0; i < server->num_conns; i++) {
@ -365,62 +349,30 @@ spdk_jsonrpc_server_poll(struct spdk_jsonrpc_server *server)
}
}
rc = poll(server->pollfds, server->num_conns + 1, 0);
if (rc < 0) {
if (errno == EINTR) {
return 0;
}
SPDK_ERRLOG("jsonrpc poll() failed\n");
return -1;
}
if (rc == 0) {
/* No sockets are ready */
return 0;
}
/* Check listen socket */
if (server->num_conns < SPDK_JSONRPC_MAX_CONNS) {
pfd = &server->pollfds[0];
if (pfd->revents) {
spdk_jsonrpc_server_accept(server);
}
pfd->revents = 0;
}
for (i = 0; i < server->num_conns; i++) {
pfd = &server->pollfds[i + 1];
conn = &server->conns[i];
if (pfd->revents & POLLOUT) {
if (conn->closed) {
continue;
}
rc = spdk_jsonrpc_server_conn_send(conn);
if (rc != 0) {
SPDK_TRACELOG(SPDK_TRACE_RPC, "closing conn due to send failure\n");
spdk_jsonrpc_server_conn_close(conn);
continue;
}
}
if (pfd->revents & POLLIN) {
rc = spdk_jsonrpc_server_conn_recv(conn);
if (rc != 0) {
SPDK_TRACELOG(SPDK_TRACE_RPC, "closing conn due to recv failure\n");
spdk_jsonrpc_server_conn_close(conn);
continue;
}
}
if (pfd->revents & (POLLERR | POLLNVAL)) {
SPDK_TRACELOG(SPDK_TRACE_RPC, "closing conn due to poll() flag %d\n",
(int)pfd->revents);
spdk_jsonrpc_server_conn_close(conn);
continue;
}
pfd->revents = 0;
}
return 0;
}