commit:     7cad3edd72d6b7d7b4849d1c594dbc0110c74993
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Tue Nov 18 07:47:16 2025 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Tue Nov 18 07:47:16 2025 +0000
URL:        https://gitweb.gentoo.org/proj/steve.git/commit/?id=7cad3edd

Initial process accounting

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

 steve.cxx | 24 +++++++++++++++++-------
 1 file changed, 17 insertions(+), 7 deletions(-)

diff --git a/steve.cxx b/steve.cxx
index 73425d2..6d632ce 100644
--- a/steve.cxx
+++ b/steve.cxx
@@ -14,6 +14,7 @@
 #include <cstdlib>
 #include <cerrno>
 #include <deque>
+#include <unordered_map>
 
 #include <unistd.h>
 
@@ -37,11 +38,16 @@ struct steve_read_waiter {
        uint64_t pid;
 };
 
+struct steve_process {
+       unsigned int tokens_held{0};
+};
+
 struct steve_state {
        bool verbose;
        unsigned int jobs;
        unsigned int tokens;
        std::deque<steve_read_waiter> read_waiters;
+       std::unordered_map<uint64_t, steve_process> processes;
 };
 
 enum steve_arg_keys {
@@ -155,9 +161,10 @@ static void steve_read(
        /* no need to support reading more than one token at a time */
        if (state->tokens > 0) {
                state->tokens--;
+               state->processes[fi->fh].tokens_held++;
                if (state->verbose)
-                       printf("Giving job token to PID %ld, %d left\n",
-                                       fi->fh, state->tokens);
+                       printf("Giving job token to PID %ld, %d left, %d tokens 
held by process\n",
+                                       fi->fh, state->tokens, 
state->processes[fi->fh].tokens_held);
                fuse_reply_buf(req, "+", 1);
                return;
        }
@@ -169,7 +176,8 @@ static void steve_read(
 
        state->read_waiters.emplace_back(steve_read_waiter{req, fi->fh});
        if (state->verbose)
-               printf("No free job token for PID %ld, waiting\n", fi->fh);
+               printf("No free job token for PID %ld, waiting, %d tokens held 
by process\n",
+                               fi->fh, state->processes[fi->fh].tokens_held);
        fuse_req_interrupt_func(req, steve_interrupt, state);
 }
 
@@ -179,9 +187,10 @@ static void steve_wake_waiters(steve_state *state)
                const steve_read_waiter *read_waiter = 
&state->read_waiters.front();
 
                state->tokens--;
+               state->processes[read_waiter->pid].tokens_held++;
                if (state->verbose)
-                       printf("Giving job token to PID %ld, %d left\n",
-                                       read_waiter->pid, state->tokens);
+                       printf("Giving job token to PID %ld, %d left, %d tokens 
held by process\n",
+                                       read_waiter->pid, state->tokens, 
state->processes[read_waiter->pid].tokens_held);
                fuse_reply_buf(read_waiter->req, "+", 1);
                state->read_waiters.pop_front();
        }
@@ -199,9 +208,10 @@ static void steve_write(
        }
 
        state->tokens += size;
+       state->processes[fi->fh].tokens_held -= size;
        if (state->verbose)
-               printf("PID %ld returned %zd tokens, %d available now\n",
-                               fi->fh, size, state->tokens);
+               printf("PID %ld returned %zd tokens, %d available now, %d 
tokens held by process\n",
+                               fi->fh, size, state->tokens, 
state->processes[fi->fh].tokens_held);
        fuse_reply_write(req, size);
 
        /* Since we have jobs now, see if anyone's waiting */

Reply via email to