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 */