From 2d2352bab92c51c2fd857b9555242545bd08c95e Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Wed, 5 Jun 2013 11:48:57 +0200 Subject: score: Add and use _Objects_Put() Add and use _Objects_Put_without_thread_dispatch(). These two functions pair with the _Objects_Get() function. This helps to introduce object specific SMP locks to avoid lock contention. --- cpukit/score/src/corerwlocktimeout.c | 2 +- cpukit/score/src/mpci.c | 2 +- cpukit/score/src/objectgetnameasstring.c | 2 +- cpukit/score/src/objectidtoname.c | 2 +- cpukit/score/src/schedulercbsattachthread.c | 42 +++++++++++++---------- cpukit/score/src/schedulercbsdetachthread.c | 28 +++++++-------- cpukit/score/src/schedulercbsgetexecutiontime.c | 2 +- cpukit/score/src/schedulercbsgetremainingbudget.c | 2 +- cpukit/score/src/threaddelayended.c | 2 +- cpukit/score/src/threadqtimeout.c | 2 +- 10 files changed, 45 insertions(+), 41 deletions(-) (limited to 'cpukit/score/src') diff --git a/cpukit/score/src/corerwlocktimeout.c b/cpukit/score/src/corerwlocktimeout.c index 73e93f8eb0..3b20364e10 100644 --- a/cpukit/score/src/corerwlocktimeout.c +++ b/cpukit/score/src/corerwlocktimeout.c @@ -39,7 +39,7 @@ void _CORE_RWLock_Timeout( break; case OBJECTS_LOCAL: _Thread_queue_Process_timeout( the_thread ); - _Thread_Unnest_dispatch(); + _Objects_Put_without_thread_dispatch( &the_thread->Object ); break; } } diff --git a/cpukit/score/src/mpci.c b/cpukit/score/src/mpci.c index 98b99c7a7e..e3e7eb81f9 100644 --- a/cpukit/score/src/mpci.c +++ b/cpukit/score/src/mpci.c @@ -267,7 +267,7 @@ Thread_Control *_MPCI_Process_response ( case OBJECTS_LOCAL: _Thread_queue_Extract( &_MPCI_Remote_blocked_threads, the_thread ); the_thread->Wait.return_code = the_packet->return_code; - _Thread_Unnest_dispatch(); + _Objects_Put_without_thread_dispatch( &the_thread->Object ); break; } diff --git a/cpukit/score/src/objectgetnameasstring.c b/cpukit/score/src/objectgetnameasstring.c index d818f72396..ceb6c43b24 100644 --- a/cpukit/score/src/objectgetnameasstring.c +++ b/cpukit/score/src/objectgetnameasstring.c @@ -95,7 +95,7 @@ char *_Objects_Get_name_as_string( } *d = '\0'; - _Thread_Enable_dispatch(); + _Objects_Put( the_object ); return name; } return NULL; /* unreachable path */ diff --git a/cpukit/score/src/objectidtoname.c b/cpukit/score/src/objectidtoname.c index 1c0d926838..d3f05e3df4 100644 --- a/cpukit/score/src/objectidtoname.c +++ b/cpukit/score/src/objectidtoname.c @@ -63,6 +63,6 @@ Objects_Name_or_id_lookup_errors _Objects_Id_to_name ( return OBJECTS_INVALID_ID; *name = the_object->name; - _Thread_Enable_dispatch(); + _Objects_Put( the_object ); return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL; } diff --git a/cpukit/score/src/schedulercbsattachthread.c b/cpukit/score/src/schedulercbsattachthread.c index 5a9ba04721..5192bc0779 100644 --- a/cpukit/score/src/schedulercbsattachthread.c +++ b/cpukit/score/src/schedulercbsattachthread.c @@ -32,24 +32,10 @@ int _Scheduler_CBS_Attach_thread ( { Objects_Locations location; Thread_Control *the_thread; - Scheduler_CBS_Per_thread *sched_info; if ( server_id >= _Scheduler_CBS_Maximum_servers ) return SCHEDULER_CBS_ERROR_INVALID_PARAMETER; - the_thread = _Thread_Get(task_id, &location); - /* The routine _Thread_Get may disable dispatch and not enable again. */ - if ( the_thread ) - _Thread_Enable_dispatch(); - if ( !the_thread ) - return SCHEDULER_CBS_ERROR_INVALID_PARAMETER; - - sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info; - - /* Thread is already attached to a server. */ - if ( sched_info->cbs_server ) - return SCHEDULER_CBS_ERROR_FULL; - /* Server is not valid. */ if ( !_Scheduler_CBS_Server_list[server_id] ) return SCHEDULER_CBS_ERROR_NOSERVER; @@ -58,12 +44,30 @@ int _Scheduler_CBS_Attach_thread ( if ( _Scheduler_CBS_Server_list[server_id]->task_id != -1 ) return SCHEDULER_CBS_ERROR_FULL; - _Scheduler_CBS_Server_list[server_id]->task_id = task_id; - sched_info->cbs_server = (void *) _Scheduler_CBS_Server_list[server_id]; + the_thread = _Thread_Get(task_id, &location); + /* The routine _Thread_Get may disable dispatch and not enable again. */ + if ( the_thread ) { + Scheduler_CBS_Per_thread *sched_info; + + sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info; + + /* Thread is already attached to a server. */ + if ( sched_info->cbs_server ) { + _Objects_Put( &the_thread->Object ); + return SCHEDULER_CBS_ERROR_FULL; + } - the_thread->budget_callout = _Scheduler_CBS_Budget_callout; - the_thread->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT; - the_thread->is_preemptible = true; + _Scheduler_CBS_Server_list[server_id]->task_id = task_id; + sched_info->cbs_server = (void *) _Scheduler_CBS_Server_list[server_id]; + + the_thread->budget_callout = _Scheduler_CBS_Budget_callout; + the_thread->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT; + the_thread->is_preemptible = true; + + _Objects_Put( &the_thread->Object ); + } else { + return SCHEDULER_CBS_ERROR_INVALID_PARAMETER; + } return SCHEDULER_CBS_OK; } diff --git a/cpukit/score/src/schedulercbsdetachthread.c b/cpukit/score/src/schedulercbsdetachthread.c index f4ce6029cc..cbc37eb195 100644 --- a/cpukit/score/src/schedulercbsdetachthread.c +++ b/cpukit/score/src/schedulercbsdetachthread.c @@ -34,16 +34,8 @@ int _Scheduler_CBS_Detach_thread ( Thread_Control *the_thread; Scheduler_CBS_Per_thread *sched_info; - the_thread = _Thread_Get(task_id, &location); - /* The routine _Thread_Get may disable dispatch and not enable again. */ - if ( the_thread ) { - _Thread_Enable_dispatch(); - } - if ( server_id >= _Scheduler_CBS_Maximum_servers ) return SCHEDULER_CBS_ERROR_INVALID_PARAMETER; - if ( !the_thread ) - return SCHEDULER_CBS_ERROR_INVALID_PARAMETER; /* Server is not valid. */ if ( !_Scheduler_CBS_Server_list[server_id] ) return SCHEDULER_CBS_ERROR_NOSERVER; @@ -51,13 +43,21 @@ int _Scheduler_CBS_Detach_thread ( if ( _Scheduler_CBS_Server_list[server_id]->task_id != task_id ) return SCHEDULER_CBS_ERROR_INVALID_PARAMETER; - _Scheduler_CBS_Server_list[server_id]->task_id = -1; - sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info; - sched_info->cbs_server = NULL; + the_thread = _Thread_Get(task_id, &location); + /* The routine _Thread_Get may disable dispatch and not enable again. */ + if ( the_thread ) { + _Scheduler_CBS_Server_list[server_id]->task_id = -1; + sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info; + sched_info->cbs_server = NULL; - the_thread->budget_algorithm = the_thread->Start.budget_algorithm; - the_thread->budget_callout = the_thread->Start.budget_callout; - the_thread->is_preemptible = the_thread->Start.is_preemptible; + the_thread->budget_algorithm = the_thread->Start.budget_algorithm; + the_thread->budget_callout = the_thread->Start.budget_callout; + the_thread->is_preemptible = the_thread->Start.is_preemptible; + + _Objects_Put( &the_thread->Object ); + } else { + return SCHEDULER_CBS_ERROR_INVALID_PARAMETER; + } return SCHEDULER_CBS_OK; } diff --git a/cpukit/score/src/schedulercbsgetexecutiontime.c b/cpukit/score/src/schedulercbsgetexecutiontime.c index 005cd325ad..e54cb44141 100644 --- a/cpukit/score/src/schedulercbsgetexecutiontime.c +++ b/cpukit/score/src/schedulercbsgetexecutiontime.c @@ -49,9 +49,9 @@ int _Scheduler_CBS_Get_execution_time ( ); /* The routine _Thread_Get may disable dispatch and not enable again. */ if ( the_thread ) { - _Thread_Enable_dispatch(); *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; diff --git a/cpukit/score/src/schedulercbsgetremainingbudget.c b/cpukit/score/src/schedulercbsgetremainingbudget.c index 892c371d0f..2ab0941c9f 100644 --- a/cpukit/score/src/schedulercbsgetremainingbudget.c +++ b/cpukit/score/src/schedulercbsgetremainingbudget.c @@ -47,8 +47,8 @@ int _Scheduler_CBS_Get_remaining_budget ( ); /* The routine _Thread_Get may disable dispatch and not enable again. */ if ( the_thread ) { - _Thread_Enable_dispatch(); *remaining_budget = the_thread->cpu_time_budget; + _Objects_Put( &the_thread->Object ); } else { *remaining_budget = 0; diff --git a/cpukit/score/src/threaddelayended.c b/cpukit/score/src/threaddelayended.c index 2750fb7788..dc8ccb4248 100644 --- a/cpukit/score/src/threaddelayended.c +++ b/cpukit/score/src/threaddelayended.c @@ -54,7 +54,7 @@ void _Thread_Delay_ended( | STATES_WAITING_FOR_TIME | STATES_INTERRUPTIBLE_BY_SIGNAL ); - _Thread_Unnest_dispatch(); + _Objects_Put_without_thread_dispatch( &the_thread->Object ); break; } } diff --git a/cpukit/score/src/threadqtimeout.c b/cpukit/score/src/threadqtimeout.c index 4792666cf8..c310551f9e 100644 --- a/cpukit/score/src/threadqtimeout.c +++ b/cpukit/score/src/threadqtimeout.c @@ -45,7 +45,7 @@ void _Thread_queue_Timeout( break; case OBJECTS_LOCAL: _Thread_queue_Process_timeout( the_thread ); - _Thread_Unnest_dispatch(); + _Objects_Put_without_thread_dispatch( &the_thread->Object ); break; } } -- cgit v1.2.3