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

Reply via email to