commit: 9738e8e0d2f9a84ee341f55d371aa7297b08e0d6
Author: Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Mon Dec 8 12:54:53 2025 +0000
Commit: Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Mon Dec 8 12:54:53 2025 +0000
URL: https://gitweb.gentoo.org/proj/steve.git/commit/?id=9738e8e0
Trigger a recheck when load is exceeded
Signed-off-by: Michał Górny <mgorny <AT> gentoo.org>
steve.cxx | 26 +++++++++++++++++++++++++-
1 file changed, 25 insertions(+), 1 deletion(-)
diff --git a/steve.cxx b/steve.cxx
index 812657b..cf0c063 100644
--- a/steve.cxx
+++ b/steve.cxx
@@ -95,6 +95,8 @@ struct steve_state {
std::unordered_map<uint64_t, steve_process> processes;
struct event_base *evb;
int loadavg_fd{-2};
+ bool recheck_triggered{false};
+ std::unique_ptr<struct event, std::function<void(struct event*)>>
recheck_event{nullptr, event_free};
/* to workaround lack of fuse_buf_free(), keep a global buffer */
/* https://github.com/libfuse/libfuse/issues/1373 */
@@ -171,8 +173,17 @@ static steve_token_availability
steve_can_give_token(steve_state *state, uint64_
if (state->jobs < state->min_jobs + state->tokens)
return steve_token_availability::available;
steve_get_load(state);
- if (state->load_avg > state->max_load_avg)
+ if (state->load_avg > state->max_load_avg) {
+ /* trigger a recheck if we don't have one now */
+ if (!state->recheck_triggered) {
+ /* TODO: make this configurable? */
+ struct timeval tv = { 3, 0 };
+ if (evtimer_add(state->recheck_event.get(),
&tv) == -1)
+ std::print(stderr, "failed to enable
recheck timer\n");
+ }
+
return steve_token_availability::load_exceeded;
+ }
}
return steve_token_availability::available;
@@ -651,6 +662,11 @@ static void steve_handle_cuse(evutil_socket_t, short, void
*userdata) {
fuse_session_process_buf(state->session, &state->buf);
}
+static void steve_handle_recheck(evutil_socket_t, short, void *userdata) {
+ steve_state *state = static_cast<steve_state *>(userdata);
+ steve_wake_waiters(state);
+}
+
static constexpr char steve_usage[] =
"usage: {} [options]\n"
"\n"
@@ -748,6 +764,14 @@ int main(int argc, char **argv)
}
state.evb = evb.get();
+ state.recheck_event.reset(
+ evtimer_new(state.evb, steve_handle_recheck, &state)
+ );
+ if (!state.recheck_event) {
+ std::print(stderr, "failed to initialize timer recheck event");
+ return 1;
+ }
+
int cuse_fd = open("/dev/cuse", O_RDWR);
if (cuse_fd == -1) {
perror("unable to open /dev/cuse");