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