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:
parent
1be7a80c2d
commit
1153b8c5c4
@ -69,14 +69,12 @@ struct spdk_jsonrpc_server_conn {
|
|||||||
uint32_t outstanding_requests;
|
uint32_t outstanding_requests;
|
||||||
struct spdk_ring *send_queue;
|
struct spdk_ring *send_queue;
|
||||||
struct spdk_jsonrpc_request *send_request;
|
struct spdk_jsonrpc_request *send_request;
|
||||||
struct pollfd *pfd;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct spdk_jsonrpc_server {
|
struct spdk_jsonrpc_server {
|
||||||
int sockfd;
|
int sockfd;
|
||||||
spdk_jsonrpc_handle_request_fn handle_request;
|
spdk_jsonrpc_handle_request_fn handle_request;
|
||||||
struct spdk_jsonrpc_server_conn conns[SPDK_JSONRPC_MAX_CONNS];
|
struct spdk_jsonrpc_server_conn conns[SPDK_JSONRPC_MAX_CONNS];
|
||||||
struct pollfd pollfds[SPDK_JSONRPC_MAX_CONNS + 1];
|
|
||||||
int num_conns;
|
int num_conns;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -86,10 +86,6 @@ spdk_jsonrpc_server_listen(int domain, int protocol,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Put listen socket in pollfds[0] */
|
|
||||||
server->pollfds[0].fd = server->sockfd;
|
|
||||||
server->pollfds[0].events = POLLIN;
|
|
||||||
|
|
||||||
return server;
|
return server;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -112,9 +108,6 @@ spdk_jsonrpc_server_conn_close(struct spdk_jsonrpc_server_conn *conn)
|
|||||||
{
|
{
|
||||||
conn->closed = true;
|
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) {
|
if (conn->sockfd >= 0) {
|
||||||
close(conn->sockfd);
|
close(conn->sockfd);
|
||||||
conn->sockfd = -1;
|
conn->sockfd = -1;
|
||||||
@ -140,7 +133,6 @@ static int
|
|||||||
spdk_jsonrpc_server_accept(struct spdk_jsonrpc_server *server)
|
spdk_jsonrpc_server_accept(struct spdk_jsonrpc_server *server)
|
||||||
{
|
{
|
||||||
struct spdk_jsonrpc_server_conn *conn;
|
struct spdk_jsonrpc_server_conn *conn;
|
||||||
struct pollfd *pfd;
|
|
||||||
int rc, conn_idx, nonblock;
|
int rc, conn_idx, nonblock;
|
||||||
|
|
||||||
rc = accept(server->sockfd, NULL, NULL);
|
rc = accept(server->sockfd, NULL, NULL);
|
||||||
@ -169,13 +161,6 @@ spdk_jsonrpc_server_accept(struct spdk_jsonrpc_server *server)
|
|||||||
return -1;
|
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++;
|
server->num_conns++;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -333,7 +318,6 @@ int
|
|||||||
spdk_jsonrpc_server_poll(struct spdk_jsonrpc_server *server)
|
spdk_jsonrpc_server_poll(struct spdk_jsonrpc_server *server)
|
||||||
{
|
{
|
||||||
int rc, i;
|
int rc, i;
|
||||||
struct pollfd *pfd;
|
|
||||||
struct spdk_jsonrpc_server_conn *conn;
|
struct spdk_jsonrpc_server_conn *conn;
|
||||||
|
|
||||||
for (i = 0; i < server->num_conns; i++) {
|
for (i = 0; i < server->num_conns; i++) {
|
||||||
@ -365,61 +349,29 @@ 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 */
|
/* Check listen socket */
|
||||||
if (server->num_conns < SPDK_JSONRPC_MAX_CONNS) {
|
if (server->num_conns < SPDK_JSONRPC_MAX_CONNS) {
|
||||||
pfd = &server->pollfds[0];
|
spdk_jsonrpc_server_accept(server);
|
||||||
if (pfd->revents) {
|
|
||||||
spdk_jsonrpc_server_accept(server);
|
|
||||||
}
|
|
||||||
pfd->revents = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < server->num_conns; i++) {
|
for (i = 0; i < server->num_conns; i++) {
|
||||||
pfd = &server->pollfds[i + 1];
|
|
||||||
conn = &server->conns[i];
|
conn = &server->conns[i];
|
||||||
|
|
||||||
if (pfd->revents & POLLOUT) {
|
if (conn->closed) {
|
||||||
rc = spdk_jsonrpc_server_conn_send(conn);
|
continue;
|
||||||
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_send(conn);
|
||||||
rc = spdk_jsonrpc_server_conn_recv(conn);
|
if (rc != 0) {
|
||||||
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);
|
spdk_jsonrpc_server_conn_close(conn);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
pfd->revents = 0;
|
rc = spdk_jsonrpc_server_conn_recv(conn);
|
||||||
|
if (rc != 0) {
|
||||||
|
spdk_jsonrpc_server_conn_close(conn);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user