summaryrefslogtreecommitdiffstats
path: root/cpukit/rtems/src/taskmp.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-05-11 10:21:57 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-05-12 13:24:40 +0200
commit4d76300ae524f798bf665f6c28dca420fd23a59c (patch)
treeae47fefc2924fac943537ed2854279ead765ef63 /cpukit/rtems/src/taskmp.c
parentrtems: Use thread state lock for signals (diff)
downloadrtems-4d76300ae524f798bf665f6c28dca420fd23a59c.tar.bz2
rtems: Avoid Giant lock for some task operations
Avoid Giant lock for rtems_task_set_priority(), rtems_task_suspend() and rtems_task_resume(). Update #2555.
Diffstat (limited to 'cpukit/rtems/src/taskmp.c')
-rw-r--r--cpukit/rtems/src/taskmp.c120
1 files changed, 83 insertions, 37 deletions
diff --git a/cpukit/rtems/src/taskmp.c b/cpukit/rtems/src/taskmp.c
index bca241fc5d..d59db2e313 100644
--- a/cpukit/rtems/src/taskmp.c
+++ b/cpukit/rtems/src/taskmp.c
@@ -24,6 +24,17 @@
#include <rtems/score/threadimpl.h>
#include <rtems/score/threadqimpl.h>
+/**
+ * The following data structure defines the packet used to perform
+ * remote task operations.
+ */
+typedef struct {
+ rtems_packet_prefix Prefix;
+ RTEMS_tasks_MP_Remote_operations operation;
+ rtems_name name;
+ rtems_task_priority the_priority;
+} RTEMS_tasks_MP_Packet;
+
RTEMS_STATIC_ASSERT(
sizeof(RTEMS_tasks_MP_Packet) <= MP_PACKET_MINIMUM_PACKET_SIZE,
RTEMS_tasks_MP_Packet
@@ -34,6 +45,17 @@ static RTEMS_tasks_MP_Packet *_RTEMS_tasks_MP_Get_packet( void )
return (RTEMS_tasks_MP_Packet *) _MPCI_Get_packet();
}
+static RTEMS_tasks_MP_Packet *_RTEMS_tasks_MP_Get_request_packet(
+ Objects_Id id
+)
+{
+ if ( !_Thread_MP_Is_remote( id ) ) {
+ return NULL;
+ }
+
+ return _RTEMS_tasks_MP_Get_packet();
+}
+
/*
* _RTEMS_tasks_MP_Send_process_packet
*
@@ -73,54 +95,78 @@ void _RTEMS_tasks_MP_Send_process_packet (
}
}
-/*
- * _RTEMS_tasks_MP_Send_request_packet
- *
- */
+static rtems_status_code _RTEMS_tasks_MP_Send_request_packet(
+ RTEMS_tasks_MP_Packet *the_packet,
+ Objects_Id id,
+ RTEMS_tasks_MP_Remote_operations operation
+)
+{
+ the_packet->Prefix.the_class = MP_PACKET_TASKS;
+ the_packet->Prefix.length = sizeof( *the_packet );
+ the_packet->Prefix.to_convert = sizeof( *the_packet );
+ the_packet->Prefix.id = id;
+ the_packet->operation = operation;
+
+ return _MPCI_Send_request_packet(
+ _Objects_Get_node( id ),
+ &the_packet->Prefix,
+ STATES_READY, /* Not used */
+ RTEMS_TIMEOUT
+ );
+}
-rtems_status_code _RTEMS_tasks_MP_Send_request_packet (
- RTEMS_tasks_MP_Remote_operations operation,
- Objects_Id task_id,
- rtems_task_priority new_priority
+rtems_status_code _RTEMS_tasks_MP_Set_priority(
+ rtems_id id,
+ rtems_task_priority new_priority,
+ rtems_task_priority *old_priority
)
{
RTEMS_tasks_MP_Packet *the_packet;
- switch ( operation ) {
+ the_packet = _RTEMS_tasks_MP_Get_request_packet( id );
+ if ( the_packet == NULL ) {
+ return RTEMS_INVALID_ID;
+ }
- case RTEMS_TASKS_MP_SUSPEND_REQUEST:
- case RTEMS_TASKS_MP_RESUME_REQUEST:
- case RTEMS_TASKS_MP_SET_PRIORITY_REQUEST:
+ the_packet->the_priority = new_priority;
+ _Thread_Executing->Wait.return_argument = old_priority;
+ return _RTEMS_tasks_MP_Send_request_packet(
+ the_packet,
+ id,
+ RTEMS_TASKS_MP_SET_PRIORITY_REQUEST
+ );
+}
- the_packet = _RTEMS_tasks_MP_Get_packet();
- the_packet->Prefix.the_class = MP_PACKET_TASKS;
- the_packet->Prefix.length = sizeof ( RTEMS_tasks_MP_Packet );
- the_packet->Prefix.to_convert = sizeof ( RTEMS_tasks_MP_Packet );
- the_packet->operation = operation;
- the_packet->Prefix.id = task_id;
- the_packet->the_priority = new_priority;
+rtems_status_code _RTEMS_tasks_MP_Suspend( rtems_id id )
+{
+ RTEMS_tasks_MP_Packet *the_packet;
- return _MPCI_Send_request_packet(
- _Objects_Get_node( task_id ),
- &the_packet->Prefix,
- STATES_READY, /* Not used */
- RTEMS_TIMEOUT
- );
- break;
+ the_packet = _RTEMS_tasks_MP_Get_request_packet( id );
+ if ( the_packet == NULL ) {
+ return RTEMS_INVALID_ID;
+ }
- case RTEMS_TASKS_MP_ANNOUNCE_CREATE:
- case RTEMS_TASKS_MP_ANNOUNCE_DELETE:
- case RTEMS_TASKS_MP_SUSPEND_RESPONSE:
- case RTEMS_TASKS_MP_RESUME_RESPONSE:
- case RTEMS_TASKS_MP_SET_PRIORITY_RESPONSE:
- break;
+ return _RTEMS_tasks_MP_Send_request_packet(
+ the_packet,
+ id,
+ RTEMS_TASKS_MP_SUSPEND_REQUEST
+ );
+}
+rtems_status_code _RTEMS_tasks_MP_Resume( rtems_id id )
+{
+ RTEMS_tasks_MP_Packet *the_packet;
+
+ the_packet = _RTEMS_tasks_MP_Get_request_packet( id );
+ if ( the_packet == NULL ) {
+ return RTEMS_INVALID_ID;
}
- /*
- * The following line is included to satisfy compilers which
- * produce warnings when a function does not end with a return.
- */
- return RTEMS_SUCCESSFUL;
+
+ return _RTEMS_tasks_MP_Send_request_packet(
+ the_packet,
+ id,
+ RTEMS_TASKS_MP_RESUME_REQUEST
+ );
}
/*