summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2013-06-05 11:48:57 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-06-07 17:06:43 +0200
commit2d2352bab92c51c2fd857b9555242545bd08c95e (patch)
treede11a05e5b361a161e93c98866aa704ed24ed3ae /cpukit/score/src
parentscore: Add _Objects_Put_for_get_isr_disable() (diff)
downloadrtems-2d2352bab92c51c2fd857b9555242545bd08c95e.tar.bz2
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.
Diffstat (limited to 'cpukit/score/src')
-rw-r--r--cpukit/score/src/corerwlocktimeout.c2
-rw-r--r--cpukit/score/src/mpci.c2
-rw-r--r--cpukit/score/src/objectgetnameasstring.c2
-rw-r--r--cpukit/score/src/objectidtoname.c2
-rw-r--r--cpukit/score/src/schedulercbsattachthread.c42
-rw-r--r--cpukit/score/src/schedulercbsdetachthread.c28
-rw-r--r--cpukit/score/src/schedulercbsgetexecutiontime.c2
-rw-r--r--cpukit/score/src/schedulercbsgetremainingbudget.c2
-rw-r--r--cpukit/score/src/threaddelayended.c2
-rw-r--r--cpukit/score/src/threadqtimeout.c2
10 files changed, 45 insertions, 41 deletions
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;
}
}