[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



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.