summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src/schedulercbsgetexecutiontime.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-05-04 11:28:12 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-05-06 08:17:05 +0200
commitf65f803a269784f6f05658054dd1709497ca5049 (patch)
treef82ea374a9dc184e2a9f6e58f6f36a9094f14852 /cpukit/score/src/schedulercbsgetexecutiontime.c
parentposix: Avoid Giant lock in pthread_equal() (diff)
downloadrtems-f65f803a269784f6f05658054dd1709497ca5049.tar.bz2
score: Avoid Giant lock for CBS scheduler
Update #2555.
Diffstat (limited to 'cpukit/score/src/schedulercbsgetexecutiontime.c')
-rw-r--r--cpukit/score/src/schedulercbsgetexecutiontime.c37
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;
}