diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-05-11 10:21:57 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-05-12 13:24:40 +0200 |
commit | 4d76300ae524f798bf665f6c28dca420fd23a59c (patch) | |
tree | ae47fefc2924fac943537ed2854279ead765ef63 /cpukit/rtems/src/taskmp.c | |
parent | rtems: Use thread state lock for signals (diff) | |
download | rtems-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.c | 120 |
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 + ); } /* |