Commit 1153b8c5 authored by Daniel Verkamp's avatar Daniel Verkamp
Browse files

jsonrpc: simplify by removing use of poll()



Change-Id: Ib756212d227fb71b9ef3d486223740e4cb152815
Signed-off-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
Reviewed-on: https://review.gerrithub.io/370200


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
parent 1be7a80c
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -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;
};

+9 −57
Original line number Diff line number Diff line
@@ -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,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 */
	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) {
			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);
		if (conn->closed) {
			continue;
		}
		}

		if (pfd->revents & POLLIN) {
			rc = spdk_jsonrpc_server_conn_recv(conn);
		rc = spdk_jsonrpc_server_conn_send(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);
		rc = spdk_jsonrpc_server_conn_recv(conn);
		if (rc != 0) {
			spdk_jsonrpc_server_conn_close(conn);
			continue;
		}

		pfd->revents = 0;
	}

	return 0;