commit:     9c79a9124c482d98d50d408f56f86540e0157311
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Sun Nov 16 20:01:45 2025 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Sun Nov 16 20:05:31 2025 +0000
URL:        https://gitweb.gentoo.org/proj/steve.git/commit/?id=9c79a912

Use a tail queue to make read waiters a FIFO

Signed-off-by: Michał Górny <mgorny <AT> gentoo.org>

 steve.c | 27 +++++++++++++--------------
 1 file changed, 13 insertions(+), 14 deletions(-)

diff --git a/steve.c b/steve.c
index 20ae4af..dd72df4 100644
--- a/steve.c
+++ b/steve.c
@@ -36,10 +36,10 @@ static const char *usage =
 struct steve_read_waiter {
        fuse_req_t req;
        pid_t pid;
-       SLIST_ENTRY(steve_read_waiter) waiters;
+       STAILQ_ENTRY(steve_read_waiter) waiters;
 };
 
-SLIST_HEAD(steve_read_waiters_head, steve_read_waiter);
+STAILQ_HEAD(steve_read_waiters_head, steve_read_waiter);
 
 struct steve_state {
        bool verbose;
@@ -95,7 +95,7 @@ static void steve_init(void *userdata, struct fuse_conn_info 
*conn)
        conn->no_interrupt = 1;
 
        state->tokens = state->jobs;
-       SLIST_INIT(&state->read_waiters);
+       STAILQ_INIT(&state->read_waiters);
 
        fprintf(stderr, "steve running on /dev/steve for %d jobs\n", 
state->jobs);
 }
@@ -104,12 +104,12 @@ static void steve_destroy(void *userdata)
 {
        struct steve_state *state = userdata;
 
-       while (!SLIST_EMPTY(&state->read_waiters)) {
-               struct steve_read_waiter *read_waiter = 
SLIST_FIRST(&state->read_waiters);
-               SLIST_REMOVE_HEAD(&state->read_waiters, waiters);
+       while (!STAILQ_EMPTY(&state->read_waiters)) {
+               struct steve_read_waiter *read_waiter = 
STAILQ_FIRST(&state->read_waiters);
+               STAILQ_REMOVE_HEAD(&state->read_waiters, waiters);
                free(read_waiter);
        }
-       SLIST_INIT(&state->read_waiters);
+       STAILQ_INIT(&state->read_waiters);
 }
 
 static void steve_open(fuse_req_t req, struct fuse_file_info *fi)
@@ -123,7 +123,7 @@ static void steve_interrupt(fuse_req_t req, void *userdata)
        struct steve_read_waiter *it, *read_waiter;
 
        fuse_reply_err(req, EINTR);
-       SLIST_FOREACH(it, &state->read_waiters, waiters) {
+       STAILQ_FOREACH(it, &state->read_waiters, waiters) {
                if (it->req == req) {
                        read_waiter = it;
                        break;
@@ -133,7 +133,7 @@ static void steve_interrupt(fuse_req_t req, void *userdata)
        if (read_waiter) {
                if (state->verbose)
                        printf("Passed EINTR to PID %d\n", read_waiter->pid);
-               SLIST_REMOVE(&state->read_waiters, read_waiter, 
steve_read_waiter, waiters);
+               STAILQ_REMOVE(&state->read_waiters, read_waiter, 
steve_read_waiter, waiters);
        }
 }
 
@@ -176,8 +176,7 @@ static void steve_read(
 
        read_waiter->req = req;
        read_waiter->pid = context->pid;
-       /* TODO: append to end to make it FIFO */
-       SLIST_INSERT_HEAD(&state->read_waiters, read_waiter, waiters);
+       STAILQ_INSERT_TAIL(&state->read_waiters, read_waiter, waiters);
        if (state->verbose)
                printf("No free job token for PID %d, waiting\n", context->pid);
        fuse_req_interrupt_func(req, steve_interrupt, state);
@@ -185,8 +184,8 @@ static void steve_read(
 
 static void steve_wake_waiters(struct steve_state *state)
 {
-       while (state->tokens > 0 && !SLIST_EMPTY(&state->read_waiters)) {
-               struct steve_read_waiter *read_waiter = SLIST_FIRST(
+       while (state->tokens > 0 && !STAILQ_EMPTY(&state->read_waiters)) {
+               struct steve_read_waiter *read_waiter = STAILQ_FIRST(
                                &state->read_waiters);
 
                state->tokens--;
@@ -194,7 +193,7 @@ static void steve_wake_waiters(struct steve_state *state)
                        printf("Giving job token to PID %d, %d left\n",
                                        read_waiter->pid, state->tokens);
                fuse_reply_buf(read_waiter->req, "+", 1);
-               SLIST_REMOVE_HEAD(&state->read_waiters, waiters);
+               STAILQ_REMOVE_HEAD(&state->read_waiters, waiters);
        }
 }
 

Reply via email to