summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src/schedulercbsdetachthread.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/schedulercbsdetachthread.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/schedulercbsdetachthread.c')
-rw-r--r--cpukit/score/src/schedulercbsdetachthread.c46
1 files changed, 26 insertions, 20 deletions
diff --git a/cpukit/score/src/schedulercbsdetachthread.c b/cpukit/score/src/schedulercbsdetachthread.c
index 97ce1ad024..872d4b8df8 100644
--- a/cpukit/score/src/schedulercbsdetachthread.c
+++ b/cpukit/score/src/schedulercbsdetachthread.c
@@ -27,34 +27,40 @@ int _Scheduler_CBS_Detach_thread (
rtems_id task_id
)
{
- Objects_Locations location;
- Thread_Control *the_thread;
+ Scheduler_CBS_Server *server;
+ ISR_lock_Context lock_context;
+ Thread_Control *the_thread;
+ Scheduler_CBS_Node *node;
- if ( server_id >= _Scheduler_CBS_Maximum_servers )
- return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
- /* Server is not valid. */
- if ( !_Scheduler_CBS_Server_list[server_id].initialized )
- return SCHEDULER_CBS_ERROR_NOSERVER;
- /* Thread and server are not attached. */
- if ( _Scheduler_CBS_Server_list[server_id].task_id != task_id )
+ 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 ) {
- Scheduler_CBS_Node *node = _Scheduler_CBS_Thread_get_node( the_thread );
+ server = &_Scheduler_CBS_Server_list[ server_id ];
- _Scheduler_CBS_Server_list[server_id].task_id = -1;
- node->cbs_server = NULL;
+ if ( !server->initialized ) {
+ return SCHEDULER_CBS_ERROR_NOSERVER;
+ }
- 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;
+ if ( server->task_id != task_id ) {
+ return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
+ }
+
+ the_thread = _Thread_Get_interrupt_disable( task_id, &lock_context );
- _Objects_Put( &the_thread->Object );
- } else {
+ if ( the_thread == NULL ) {
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
}
+ node = _Scheduler_CBS_Thread_get_node( the_thread );
+ node->cbs_server = NULL;
+
+ server->task_id = -1;
+
+ 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;
+
+ _ISR_lock_ISR_enable( &lock_context );
return SCHEDULER_CBS_OK;
}