From d0e63556c4fd10cf3627b6e5c292a1f178a5578f Mon Sep 17 00:00:00 2001 From: Flavio Cruz Date: Fri, 16 Feb 2024 13:26:29 -0500 Subject: Add proc_getchildren_rusage RPC and track rusage for children and descendants Message-ID: <20240216182630.5770-2-flaviocruz@gmail.com> --- hurd/process.defs | 6 ++++++ proc/info.c | 8 ++++++++ proc/proc.h | 4 +++- proc/wait.c | 2 ++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/hurd/process.defs b/hurd/process.defs index 9a8b3a1b..007aa2b2 100644 --- a/hurd/process.defs +++ b/hurd/process.defs @@ -466,3 +466,9 @@ simpleroutine proc_reauthenticate_reassign ( that the user has received from auth_user_authenticate call. */ simpleroutine proc_reauthenticate_complete ( process: process_t); + +/* Returns the rusage information for the children that were waited + * for plus all their descendants. */ +routine proc_getchildren_rusage ( + process: process_t; + out children_rusage: rusage_t); diff --git a/proc/info.c b/proc/info.c index 2d85662d..e5b0f472 100644 --- a/proc/info.c +++ b/proc/info.c @@ -1093,3 +1093,11 @@ S_proc_get_exe (struct proc *callerp, return 0; } +kern_return_t +S_proc_getchildren_rusage (struct proc *p, struct rusage *ru) +{ + if (!p) + return EOPNOTSUPP; + *ru = p->p_child_rusage; + return 0; +} diff --git a/proc/proc.h b/proc/proc.h index a83a5090..bbba0958 100644 --- a/proc/proc.h +++ b/proc/proc.h @@ -76,7 +76,9 @@ struct proc int p_sigcode; struct rusage p_rusage; /* my usage if I'm dead, to return via wait */ - struct rusage p_child_rusage; /* accumulates p_rusage of all dead children */ + /* Accumulates p_rusage of all dead children, including + * grandchildren and their descendants. */ + struct rusage p_child_rusage; unsigned int p_exec:1; /* has called proc_mark_exec */ unsigned int p_stopped:1; /* has called proc_mark_stop */ diff --git a/proc/wait.c b/proc/wait.c index 4551d289..a31b0e73 100644 --- a/proc/wait.c +++ b/proc/wait.c @@ -156,6 +156,8 @@ alert_parent (struct proc *p) { /* We accumulate the aggregate usage stats of all our dead children. */ rusage_add (&p->p_parent->p_child_rusage, &p->p_rusage); + /* ... and descendants. */ + rusage_add (&p->p_parent->p_child_rusage, &p->p_child_rusage); send_signal (p->p_parent->p_msgport, SIGCHLD, CLD_EXITED, p->p_parent->p_task); -- cgit v1.2.3