diff --git a/kernel/include/sortix/kernel/thread.h b/kernel/include/sortix/kernel/thread.h index 05f52ef6..4df3b78d 100644 --- a/kernel/include/sortix/kernel/thread.h +++ b/kernel/include/sortix/kernel/thread.h @@ -32,6 +32,7 @@ #include #include +#include #include #include #include @@ -83,6 +84,8 @@ public: bool kernelstackmalloced; bool pledged_destruction; bool force_no_signals; + Clock execute_clock; + Clock system_clock; public: void HandleSignal(struct interrupt_context* intctx); diff --git a/kernel/include/sortix/kernel/time.h b/kernel/include/sortix/kernel/time.h index f6e06e61..42f15050 100644 --- a/kernel/include/sortix/kernel/time.h +++ b/kernel/include/sortix/kernel/time.h @@ -33,6 +33,7 @@ namespace Sortix { class Clock; class Process; +class Thread; } // namespace Sortix namespace Sortix { @@ -42,6 +43,7 @@ void Init(); void Start(); void OnTick(struct timespec tick_period, bool system_mode); void InitializeProcessClocks(Process* process); +void InitializeThreadClocks(Thread* thread); struct timespec Get(clockid_t clock); Clock* GetClock(clockid_t clock); diff --git a/kernel/process.cpp b/kernel/process.cpp index 88a15fd6..d64ecf2a 100644 --- a/kernel/process.cpp +++ b/kernel/process.cpp @@ -157,7 +157,6 @@ Process::Process() // alarm_timer initialized in member constructor. // execute_clock initialized in member constructor. // system_clock initialized in member constructor. - // execute_clock initialized in member constructor. // child_execute_clock initialized in member constructor. // child_system_clock initialized in member constructor. Time::InitializeProcessClocks(this); diff --git a/kernel/thread.cpp b/kernel/thread.cpp index d37c2a83..aeca3547 100644 --- a/kernel/thread.cpp +++ b/kernel/thread.cpp @@ -97,6 +97,9 @@ Thread::Thread() sigemptyset(&signal_mask); memset(&signal_stack, 0, sizeof(signal_stack)); signal_stack.ss_flags = SS_DISABLE; + // execute_clock initialized in member constructor. + // system_clock initialized in member constructor. + Time::InitializeThreadClocks(this); } Thread::~Thread() diff --git a/kernel/time.cpp b/kernel/time.cpp index 1e354ab3..10a430c5 100644 --- a/kernel/time.cpp +++ b/kernel/time.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include namespace Sortix { @@ -59,6 +60,8 @@ Clock* GetClock(clockid_t clock) case CLOCK_PROCESS_SYSTIME_ID: return &CurrentProcess()->system_clock; case CLOCK_CHILD_CPUTIME_ID: return &CurrentProcess()->child_execute_clock; case CLOCK_CHILD_SYSTIME_ID: return &CurrentProcess()->child_system_clock; + case CLOCK_THREAD_CPUTIME_ID: return &CurrentThread()->execute_clock; + case CLOCK_THREAD_SYSTIME_ID: return &CurrentThread()->system_clock; default: return errno = ENOTSUP, (Clock*) NULL; } } @@ -79,12 +82,17 @@ void OnTick(struct timespec tick_period, bool system_mode) { realtime_clock->Advance(tick_period); uptime_clock->Advance(tick_period); - Process* process = CurrentProcess(); + Thread* thread = CurrentThread(); + Process* process = thread->process; + thread->execute_clock.Advance(tick_period); process->execute_clock.Advance(tick_period); process->child_execute_clock.Advance(tick_period); if ( system_mode ) - process->system_clock.Advance(tick_period), + { + thread->system_clock.Advance(tick_period); + process->system_clock.Advance(tick_period); process->child_system_clock.Advance(tick_period); + } } void Init() diff --git a/kernel/x86-family/time.cpp b/kernel/x86-family/time.cpp index f70edb94..985fb14a 100644 --- a/kernel/x86-family/time.cpp +++ b/kernel/x86-family/time.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include namespace Sortix { @@ -125,6 +126,15 @@ void InitializeProcessClocks(Process* process) process->child_system_clock.SetCallableFromInterrupts(true); } +void InitializeThreadClocks(Thread* thread) +{ + struct timespec nul_time = timespec_nul(); + thread->execute_clock.SetCallableFromInterrupts(true); + thread->execute_clock.Set(&nul_time, &tick_period); + thread->system_clock.SetCallableFromInterrupts(true); + thread->system_clock.Set(&nul_time, &tick_period); +} + void Start() { // Handle timer interrupts if they arrive.