From: Martin Wilck <mwi...@suse.com>

Currently the uxlsnr handles each client request (receive requset -
handle request - respond) in a single loop iteration. This has
severe disadvantages. In particular, the code may wait in poll()
called from read_all(), or wait for the vecs lock, while other
clients are ready to be serviced or signals to be handled.

This patch adds some fields to "struct client" which will be used
by later patches to change this into a state machine that basically
waits only in place, the ppoll() call in uxsock_listen().

For now, we just introduce and initialize the fields.

Signed-off-by: Martin Wilck <mwi...@suse.com>
---
 multipathd/uxlsnr.c | 27 +++++++++++++++++++++++++--
 1 file changed, 25 insertions(+), 2 deletions(-)

diff --git a/multipathd/uxlsnr.c b/multipathd/uxlsnr.c
index 98a9f71..e701a1c 100644
--- a/multipathd/uxlsnr.c
+++ b/multipathd/uxlsnr.c
@@ -40,10 +40,30 @@
 #include "main.h"
 #include "cli.h"
 #include "uxlsnr.h"
+#include "strbuf.h"
+
+/* state of client connection */
+enum {
+       CLT_RECV,
+       CLT_PARSE,
+       CLT_WAIT_LOCK,
+       CLT_WORK,
+       CLT_SEND,
+};
 
 struct client {
        struct list_head node;
+       struct timespec expires;
+       int state;
        int fd;
+       vector cmdvec;
+       /* NUL byte at end */
+       char cmd[_MAX_CMD_LEN + 1];
+       struct strbuf reply;
+       struct handler *handler;
+       size_t cmd_len, len;
+       int error;
+       bool is_root;
 };
 
 /* Indices for array of poll fds */
@@ -104,14 +124,14 @@ static void new_client(int ux_sock)
        if (fd == -1)
                return;
 
-       c = (struct client *)MALLOC(sizeof(*c));
+       c = calloc(1, sizeof(*c));
        if (!c) {
                close(fd);
                return;
        }
-       memset(c, 0, sizeof(*c));
        INIT_LIST_HEAD(&c->node);
        c->fd = fd;
+       c->state = CLT_RECV;
 
        /* put it in our linked list */
        pthread_mutex_lock(&client_lock);
@@ -127,6 +147,9 @@ static void _dead_client(struct client *c)
        int fd = c->fd;
        list_del_init(&c->node);
        c->fd = -1;
+       reset_strbuf(&c->reply);
+       if (c->cmdvec)
+               free_keys(c->cmdvec);
        FREE(c);
        close(fd);
 }
-- 
2.33.0


--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel

Reply via email to