commit:     79cacac1b4ada65ffb62118a78b0fe584294b7b2
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Mon Nov 17 20:08:12 2025 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Mon Nov 17 20:08:12 2025 +0000
URL:        https://gitweb.gentoo.org/proj/steve.git/commit/?id=79cacac1

Use std::deque

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

 meson.build |  3 +--
 steve.cxx   | 46 +++++++++++-----------------------------------
 2 files changed, 12 insertions(+), 37 deletions(-)

diff --git a/meson.build b/meson.build
index d5b4328..5001192 100644
--- a/meson.build
+++ b/meson.build
@@ -1,7 +1,6 @@
 project('steve', 'cpp')
 
 fuse3 = dependency('fuse3')
-libbsd = dependency('libbsd')
 
 executable('steve', ['steve.cxx'],
-           dependencies: [fuse3, libbsd])
+           dependencies: [fuse3])

diff --git a/steve.cxx b/steve.cxx
index efbd0ea..5f264d9 100644
--- a/steve.cxx
+++ b/steve.cxx
@@ -13,8 +13,8 @@
 #include <cstdio>
 #include <cstdlib>
 #include <cerrno>
+#include <deque>
 
-#include <sys/queue.h>
 #include <unistd.h>
 
 #include <cuse_lowlevel.h>
@@ -36,16 +36,13 @@ static const char *usage =
 struct steve_read_waiter {
        fuse_req_t req;
        pid_t pid;
-       STAILQ_ENTRY(steve_read_waiter) waiters;
 };
 
-STAILQ_HEAD(steve_read_waiters_head, steve_read_waiter);
-
 struct steve_state {
        bool verbose;
        unsigned int jobs;
        unsigned int tokens;
-       steve_read_waiters_head read_waiters;
+       std::deque<steve_read_waiter> read_waiters;
 };
 
 enum steve_arg_keys {
@@ -95,7 +92,6 @@ static void steve_init(void *userdata, struct fuse_conn_info 
*conn)
        conn->no_interrupt = 1;
 
        state->tokens = state->jobs;
-       STAILQ_INIT(&state->read_waiters);
 
        fprintf(stderr, "steve running on /dev/steve for %d jobs\n", 
state->jobs);
 }
@@ -104,12 +100,7 @@ static void steve_destroy(void *userdata)
 {
        steve_state *state = static_cast<steve_state *>(userdata);
 
-       while (!STAILQ_EMPTY(&state->read_waiters)) {
-               steve_read_waiter *read_waiter = 
STAILQ_FIRST(&state->read_waiters);
-               STAILQ_REMOVE_HEAD(&state->read_waiters, waiters);
-               delete read_waiter;
-       }
-       STAILQ_INIT(&state->read_waiters);
+       state->read_waiters.clear();
 }
 
 static void steve_open(fuse_req_t req, struct fuse_file_info *fi)
@@ -120,21 +111,16 @@ static void steve_open(fuse_req_t req, struct 
fuse_file_info *fi)
 static void steve_interrupt(fuse_req_t req, void *userdata)
 {
        steve_state *state = static_cast<steve_state *>(userdata);
-       steve_read_waiter *it, *read_waiter;
 
        fuse_reply_err(req, EINTR);
-       STAILQ_FOREACH(it, &state->read_waiters, waiters) {
+       for (auto it = state->read_waiters.begin(); it != 
state->read_waiters.end(); ++it) {
                if (it->req == req) {
-                       read_waiter = it;
+                       if (state->verbose)
+                               printf("Passed EINTR to PID %d\n", it->pid);
+                       state->read_waiters.erase(it);
                        break;
                }
        }
-       /* TODO: can this ever trigger? */
-       if (read_waiter) {
-               if (state->verbose)
-                       printf("Passed EINTR to PID %d\n", read_waiter->pid);
-               STAILQ_REMOVE(&state->read_waiters, read_waiter, 
steve_read_waiter, waiters);
-       }
 }
 
 static void steve_read(
@@ -142,7 +128,6 @@ static void steve_read(
 {
        const struct fuse_ctx *context = fuse_req_ctx(req);
        steve_state *state = static_cast<steve_state *>(fuse_req_userdata(req));
-       steve_read_waiter *read_waiter;
 
        if (off != 0) {
                fuse_reply_err(req, EIO);
@@ -168,15 +153,7 @@ static void steve_read(
                return;
        }
 
-       read_waiter = new steve_read_waiter();
-       if (!read_waiter) {
-               fuse_reply_err(req, ENOMEM);
-               return;
-       }
-
-       read_waiter->req = req;
-       read_waiter->pid = context->pid;
-       STAILQ_INSERT_TAIL(&state->read_waiters, read_waiter, waiters);
+       state->read_waiters.emplace_back(steve_read_waiter{req, context->pid});
        if (state->verbose)
                printf("No free job token for PID %d, waiting\n", context->pid);
        fuse_req_interrupt_func(req, steve_interrupt, state);
@@ -184,16 +161,15 @@ static void steve_read(
 
 static void steve_wake_waiters(steve_state *state)
 {
-       while (state->tokens > 0 && !STAILQ_EMPTY(&state->read_waiters)) {
-               steve_read_waiter *read_waiter = STAILQ_FIRST(
-                               &state->read_waiters);
+       while (state->tokens > 0 && !state->read_waiters.empty()) {
+               const steve_read_waiter *read_waiter = 
&state->read_waiters.front();
 
                state->tokens--;
                if (state->verbose)
                        printf("Giving job token to PID %d, %d left\n",
                                        read_waiter->pid, state->tokens);
                fuse_reply_buf(read_waiter->req, "+", 1);
-               STAILQ_REMOVE_HEAD(&state->read_waiters, waiters);
+               state->read_waiters.pop_front();
        }
 }
 

Reply via email to