[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 2/2] tools/xenstore: simplify xenstored main loop
Hi Juergen, On 14/05/2021 12:56, Juergen Gross wrote: The main loop of xenstored is rather complicated due to different handling of socket and ring-page interfaces. Unify that handling by introducing interface type specific functions can_read() and can_write(). Signed-off-by: Juergen Gross <jgross@xxxxxxxx> --- V2: - split off function vector introduction (Julien Grall) --- tools/xenstore/xenstored_core.c | 77 +++++++++++++++---------------- tools/xenstore/xenstored_core.h | 2 + tools/xenstore/xenstored_domain.c | 2 + 3 files changed, 41 insertions(+), 40 deletions(-) diff --git a/tools/xenstore/xenstored_core.c b/tools/xenstore/xenstored_core.c index 856f518075..883a1a582a 100644 --- a/tools/xenstore/xenstored_core.c +++ b/tools/xenstore/xenstored_core.c @@ -1659,9 +1659,34 @@ static int readfd(struct connection *conn, void *data, unsigned int len) return rc; }+static bool socket_can_process(struct connection *conn, int mask)+{ + if (conn->pollfd_idx == -1) + return false; + + if (fds[conn->pollfd_idx].revents & ~(POLLIN | POLLOUT)) { + talloc_free(conn); + return false; + } + + return (fds[conn->pollfd_idx].revents & mask) && !conn->is_ignored; +} + +static bool socket_can_write(struct connection *conn) +{ + return socket_can_process(conn, POLLOUT); +} + +static bool socket_can_read(struct connection *conn) +{ + return socket_can_process(conn, POLLIN); +} + const struct interface_funcs socket_funcs = { .write = writefd, .read = readfd, + .can_write = socket_can_write, + .can_read = socket_can_read, };static void accept_connection(int sock)@@ -2296,47 +2321,19 @@ int main(int argc, char *argv[]) if (&next->list != &connections) talloc_increase_ref_count(next);- if (conn->domain) {- if (domain_can_read(conn)) - handle_input(conn); - if (talloc_free(conn) == 0) - continue; - - talloc_increase_ref_count(conn); - if (domain_can_write(conn) && - !list_empty(&conn->out_list)) AFAICT, the check "!list_empty(&conn->out_list)" can be safely removed because write_messages() will check if the list is empty (list_top() returns NULL in this case). Is that correct? Cheers, -- Julien Grall
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |