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);
}
}