diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2021-10-27 12:59:09 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2021-11-15 08:56:53 +0100 |
commit | 240a1f79b1fcb58b9ae7bfc393e1f890e4492683 (patch) | |
tree | 92c47fa4899b2f0a8306e32bc18d66fbbf6b216f /cpukit/posix/src/pthreadcreate.c | |
parent | score: Do not shadow parameter (diff) | |
download | rtems-240a1f79b1fcb58b9ae7bfc393e1f890e4492683.tar.bz2 |
score: Introduce CPU budget operations
This patch set replaces the CPU budget algorithm enumeration with a set of CPU
budget operations which implement a particular CPU budget algorithm. This
helps to hide the CPU budget algorithm implementation details from the general
thread handling. The CPU budget callouts are turned into CPU budget
operations. This slightly reduces the size of the thread control block.
All schedulers used the default scheduler tick implementation. The tick
scheduler operation is removed and the CPU budget operations are directly used
in _Watchdog_Tick() if the executing thread uses a CPU budget algorithm. This
is performance improvement for all threads which do not use a CPU budget
algorithm (default behaviour).
Diffstat (limited to 'cpukit/posix/src/pthreadcreate.c')
-rw-r--r-- | cpukit/posix/src/pthreadcreate.c | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/cpukit/posix/src/pthreadcreate.c b/cpukit/posix/src/pthreadcreate.c index 9474d07032..093ad5cfe1 100644 --- a/cpukit/posix/src/pthreadcreate.c +++ b/cpukit/posix/src/pthreadcreate.c @@ -34,9 +34,11 @@ #include <rtems/posix/pthreadimpl.h> #include <rtems/posix/pthreadattrimpl.h> #include <rtems/score/assert.h> +#include <rtems/score/threadcpubudget.h> #include <rtems/score/threadimpl.h> #include <rtems/score/apimutex.h> #include <rtems/score/stackimpl.h> +#include <rtems/score/statesimpl.h> #include <rtems/score/schedulerimpl.h> #include <rtems/score/userextimpl.h> #include <rtems/sysinit.h> @@ -348,7 +350,9 @@ void _POSIX_Threads_Sporadic_timer( Watchdog_Control *watchdog ) _Thread_Priority_update( &queue_context ); } -void _POSIX_Threads_Sporadic_budget_callout( Thread_Control *the_thread ) +static void _POSIX_Threads_Sporadic_budget_callout( + Thread_Control *the_thread +) { POSIX_API_Control *api; Thread_queue_Context queue_context; @@ -363,7 +367,7 @@ void _POSIX_Threads_Sporadic_budget_callout( Thread_Control *the_thread ) * This will prevent the thread from consuming its entire "budget" * while at low priority. */ - the_thread->cpu_time_budget = UINT32_MAX; + the_thread->CPU_budget.available = UINT32_MAX; if ( !_Priority_Node_is_active( &api->Sporadic.Low_priority ) ) { _Thread_Priority_add( @@ -382,6 +386,34 @@ void _POSIX_Threads_Sporadic_budget_callout( Thread_Control *the_thread ) _Thread_Priority_update( &queue_context ); } +static void _POSIX_Threads_Sporadic_budget_at_tick( Thread_Control *the_thread ) +{ + uint32_t budget_available; + + if ( !the_thread->is_preemptible ) { + return; + } + + if ( !_States_Is_ready( the_thread->current_state ) ) { + return; + } + + budget_available = the_thread->CPU_budget.available; + + if ( budget_available == 1 ) { + the_thread->CPU_budget.available = 0; + _POSIX_Threads_Sporadic_budget_callout ( the_thread ); + } else { + the_thread->CPU_budget.available = budget_available - 1; + } +} + +const Thread_CPU_budget_operations _POSIX_Threads_Sporadic_budget = { + .at_tick = _POSIX_Threads_Sporadic_budget_at_tick, + .at_context_switch = _Thread_CPU_budget_do_nothing, + .initialize = _Thread_CPU_budget_do_nothing +}; + static bool _POSIX_Threads_Create_extension( Thread_Control *executing, Thread_Control *created |