From f65f803a269784f6f05658054dd1709497ca5049 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Wed, 4 May 2016 11:28:12 +0200 Subject: score: Avoid Giant lock for CBS scheduler Update #2555. --- cpukit/score/src/schedulercbsgetexecutiontime.c | 37 +++++++++++++------------ 1 file changed, 20 insertions(+), 17 deletions(-) (limited to 'cpukit/score/src/schedulercbsgetexecutiontime.c') diff --git a/cpukit/score/src/schedulercbsgetexecutiontime.c b/cpukit/score/src/schedulercbsgetexecutiontime.c index ee139e640d..a16d297b48 100644 --- a/cpukit/score/src/schedulercbsgetexecutiontime.c +++ b/cpukit/score/src/schedulercbsgetexecutiontime.c @@ -28,30 +28,33 @@ int _Scheduler_CBS_Get_execution_time ( time_t *abs_time ) { - Objects_Locations location; - Thread_Control *the_thread; + Scheduler_CBS_Server *server; + ISR_lock_Context lock_context; + Thread_Control *the_thread; - if ( server_id >= _Scheduler_CBS_Maximum_servers ) + if ( server_id >= _Scheduler_CBS_Maximum_servers ) { return SCHEDULER_CBS_ERROR_INVALID_PARAMETER; - if ( !_Scheduler_CBS_Server_list[server_id].initialized ) + } + + server = &_Scheduler_CBS_Server_list[ server_id ]; + + if ( !server->initialized ) { return SCHEDULER_CBS_ERROR_NOSERVER; - if ( _Scheduler_CBS_Server_list[server_id].task_id == -1 ) { + } + + if ( server->task_id == -1 ) { *exec_time = 0; return SCHEDULER_CBS_OK; } - the_thread = _Thread_Get( - _Scheduler_CBS_Server_list[server_id].task_id, - &location - ); - /* The routine _Thread_Get may disable dispatch and not enable again. */ - if ( the_thread ) { - *exec_time = _Scheduler_CBS_Server_list[server_id].parameters.budget - - the_thread->cpu_time_budget; - _Objects_Put( &the_thread->Object ); - } - else { - *exec_time = _Scheduler_CBS_Server_list[server_id].parameters.budget; + the_thread = _Thread_Get_interrupt_disable( server->task_id, &lock_context ); + + if ( the_thread != NULL ) { + *exec_time = server->parameters.budget - the_thread->cpu_time_budget; + _ISR_lock_ISR_enable( &lock_context ); + } else { + *exec_time = server->parameters.budget; } + return SCHEDULER_CBS_OK; } -- cgit v1.2.3