diff options
Diffstat (limited to 'cpukit/score/src/schedulercbsgetexecutiontime.c')
-rw-r--r-- | cpukit/score/src/schedulercbsgetexecutiontime.c | 37 |
1 files changed, 20 insertions, 17 deletions
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; } |