diff --git a/sortix/include/sortix/kernel/process.h b/sortix/include/sortix/kernel/process.h index 376e06b3..d74ba467 100644 --- a/sortix/include/sortix/kernel/process.h +++ b/sortix/include/sortix/kernel/process.h @@ -147,6 +147,8 @@ public: Timer alarm_timer; Clock execute_clock; Clock system_clock; + Clock child_execute_clock; + Clock child_system_clock; public: int Execute(const char* programname, const uint8_t* program, diff --git a/sortix/process.cpp b/sortix/process.cpp index 450b0687..84b67bd6 100644 --- a/sortix/process.cpp +++ b/sortix/process.cpp @@ -437,6 +437,11 @@ namespace Sortix thepid = zombie->pid; + // It is safe to access these clocks directly as the child process is no + // longer running at this point and the values are nicely frozen. + child_execute_clock.Advance(zombie->child_execute_clock.current_time); + child_system_clock.Advance(zombie->child_system_clock.current_time); + int exitstatus = zombie->exitstatus; if ( exitstatus < 0 ) exitstatus = W_EXITCODE(128 + SIGKILL, SIGKILL); diff --git a/sortix/time.cpp b/sortix/time.cpp index 090203b6..2d5864fd 100644 --- a/sortix/time.cpp +++ b/sortix/time.cpp @@ -83,8 +83,10 @@ void OnTick(struct timespec tick_period, bool system_mode) uptime_clock->Advance(tick_period); Process* process = CurrentProcess(); process->execute_clock.Advance(tick_period); + process->child_execute_clock.Advance(tick_period); if ( system_mode ) - process->system_clock.Advance(tick_period); + process->system_clock.Advance(tick_period), + process->child_system_clock.Advance(tick_period); } void Init() diff --git a/sortix/x86-family/time.cpp b/sortix/x86-family/time.cpp index 9596a4ae..182d77af 100644 --- a/sortix/x86-family/time.cpp +++ b/sortix/x86-family/time.cpp @@ -116,6 +116,10 @@ void InitializeProcessClocks(Process* process) process->execute_clock.Set(&nul_time, &tick_period); process->system_clock.SetCallableFromInterrupts(true); process->system_clock.Set(&nul_time, &tick_period); + process->child_execute_clock.Set(&nul_time, &tick_period); + process->child_execute_clock.SetCallableFromInterrupts(true); + process->child_system_clock.Set(&nul_time, &tick_period); + process->child_system_clock.SetCallableFromInterrupts(true); } void Start()