diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-05-03 09:59:50 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-05-04 07:24:31 +0200 |
commit | a0dee7c7bfff0305e9f5efc83b97b35d25d4ad19 (patch) | |
tree | c1c2be7e0a3f487dd42a32c279c40dd7675c5b5f /cpukit/rtems/src | |
parent | rtems: Return status in _Event_Surrender() (diff) | |
download | rtems-a0dee7c7bfff0305e9f5efc83b97b35d25d4ad19.tar.bz2 |
score: Simplify _Thread_Get_interrupt_disable()
Remove the object location parameter.
Diffstat (limited to 'cpukit/rtems/src')
-rw-r--r-- | cpukit/rtems/src/eventmp.c | 89 | ||||
-rw-r--r-- | cpukit/rtems/src/eventsend.c | 43 | ||||
-rw-r--r-- | cpukit/rtems/src/systemeventsend.c | 46 |
3 files changed, 81 insertions, 97 deletions
diff --git a/cpukit/rtems/src/eventmp.c b/cpukit/rtems/src/eventmp.c index 74fe1ff585..83e1384f84 100644 --- a/cpukit/rtems/src/eventmp.c +++ b/cpukit/rtems/src/eventmp.c @@ -19,66 +19,67 @@ #endif #include <rtems/rtems/eventimpl.h> -#include <rtems/score/objectimpl.h> +#include <rtems/score/threadimpl.h> #include <rtems/score/statesimpl.h> +/** + * The following enumerated type defines the list of + * remote event operations. + */ +typedef enum { + EVENT_MP_SEND_REQUEST = 0, + EVENT_MP_SEND_RESPONSE = 1 +} Event_MP_Remote_operations; + +/** + * The following data structure defines the packet used to perform + * remote event operations. + */ +typedef struct { + rtems_packet_prefix Prefix; + Event_MP_Remote_operations operation; + rtems_event_set event_in; +} Event_MP_Packet; + RTEMS_STATIC_ASSERT( sizeof(Event_MP_Packet) <= MP_PACKET_MINIMUM_PACKET_SIZE, Event_MP_Packet ); -static Event_MP_Packet *_Event_MP_Get_packet( void ) +static Event_MP_Packet *_Event_MP_Get_packet( Objects_Id id ) { + if ( !_Thread_MP_Is_remote( id ) ) { + return NULL; + } + return (Event_MP_Packet *) _MPCI_Get_packet(); } -/* - * _Event_MP_Send_process_packet - * - * This subprogram is not needed since there are no process - * packets to be sent by this manager. - * - */ - -rtems_status_code _Event_MP_Send_request_packet ( - Event_MP_Remote_operations operation, - Objects_Id event_id, - rtems_event_set event_in +rtems_status_code _Event_MP_Send( + rtems_id id, + rtems_event_set event_in ) { Event_MP_Packet *the_packet; - switch ( operation ) { - - case EVENT_MP_SEND_REQUEST: - - the_packet = _Event_MP_Get_packet(); - the_packet->Prefix.the_class = MP_PACKET_EVENT; - the_packet->Prefix.length = sizeof ( Event_MP_Packet ); - the_packet->Prefix.to_convert = sizeof ( Event_MP_Packet ); - the_packet->operation = operation; - the_packet->Prefix.id = event_id; - the_packet->event_in = event_in; - - return (rtems_status_code) - _MPCI_Send_request_packet( - _Objects_Get_node( event_id ), - &the_packet->Prefix, - STATES_READY, - RTEMS_TIMEOUT - ); - - break; - - case EVENT_MP_SEND_RESPONSE: - break; - + the_packet = _Event_MP_Get_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; + + the_packet->Prefix.the_class = MP_PACKET_EVENT; + the_packet->Prefix.length = sizeof ( *the_packet ); + the_packet->Prefix.to_convert = sizeof ( *the_packet ); + the_packet->operation = EVENT_MP_SEND_REQUEST; + the_packet->Prefix.id = id; + the_packet->event_in = event_in; + + return (rtems_status_code) _MPCI_Send_request_packet( + _Objects_Get_node( id ), + &the_packet->Prefix, + STATES_READY, + RTEMS_TIMEOUT + ); } static void _Event_MP_Send_response_packet ( diff --git a/cpukit/rtems/src/eventsend.c b/cpukit/rtems/src/eventsend.c index a6476a2da0..087ebb864f 100644 --- a/cpukit/rtems/src/eventsend.c +++ b/cpukit/rtems/src/eventsend.c @@ -27,37 +27,26 @@ rtems_status_code rtems_event_send( rtems_event_set event_in ) { - rtems_status_code sc; - Thread_Control *thread; - Objects_Locations location; + Thread_Control *the_thread; RTEMS_API_Control *api; ISR_lock_Context lock_context; - thread = _Thread_Get_interrupt_disable( id, &location, &lock_context ); - switch ( location ) { - case OBJECTS_LOCAL: - api = thread->API_Extensions[ THREAD_API_RTEMS ]; - sc = _Event_Surrender( - thread, - event_in, - &api->Event, - THREAD_WAIT_CLASS_EVENT, - &lock_context - ); - break; -#ifdef RTEMS_MULTIPROCESSING - case OBJECTS_REMOTE: - sc = _Event_MP_Send_request_packet( - EVENT_MP_SEND_REQUEST, - id, - event_in - ); - break; + the_thread = _Thread_Get_interrupt_disable( id, &lock_context ); + + if ( the_thread == NULL ) { +#if defined(RTEMS_MULTIPROCESSING) + return _Event_MP_Send( id, event_in ); +#else + return RTEMS_INVALID_ID; #endif - default: - sc = RTEMS_INVALID_ID; - break; } - return sc; + api = the_thread->API_Extensions[ THREAD_API_RTEMS ]; + return _Event_Surrender( + the_thread, + event_in, + &api->Event, + THREAD_WAIT_CLASS_EVENT, + &lock_context + ); } diff --git a/cpukit/rtems/src/systemeventsend.c b/cpukit/rtems/src/systemeventsend.c index 5b2116c403..97bcabd488 100644 --- a/cpukit/rtems/src/systemeventsend.c +++ b/cpukit/rtems/src/systemeventsend.c @@ -7,10 +7,10 @@ */ /* - * Copyright (c) 2012 embedded brains GmbH. All rights reserved. + * Copyright (c) 2012, 2016 embedded brains GmbH. All rights reserved. * * embedded brains GmbH - * Obere Lagerstr. 30 + * Dornierstr. 4 * 82178 Puchheim * Germany * <rtems@embedded-brains.de> @@ -33,34 +33,28 @@ rtems_status_code rtems_event_system_send( rtems_event_set event_in ) { - rtems_status_code sc; - Thread_Control *thread; - Objects_Locations location; + Thread_Control *the_thread; RTEMS_API_Control *api; ISR_lock_Context lock_context; - thread = _Thread_Get_interrupt_disable( id, &location, &lock_context ); - switch ( location ) { - case OBJECTS_LOCAL: - api = thread->API_Extensions[ THREAD_API_RTEMS ]; - sc = _Event_Surrender( - thread, - event_in, - &api->System_event, - THREAD_WAIT_CLASS_SYSTEM_EVENT, - &lock_context - ); - break; -#ifdef RTEMS_MULTIPROCESSING - case OBJECTS_REMOTE: - _Thread_Dispatch(); - sc = RTEMS_ILLEGAL_ON_REMOTE_OBJECT; - break; + the_thread = _Thread_Get_interrupt_disable( id, &lock_context ); + + if ( the_thread == NULL ) { +#if defined(RTEMS_MULTIPROCESSING) + if ( _Thread_MP_Is_remote( id ) ) { + return RTEMS_ILLEGAL_ON_REMOTE_OBJECT; + } #endif - default: - sc = RTEMS_INVALID_ID; - break; + + return RTEMS_INVALID_ID; } - return sc; + api = the_thread->API_Extensions[ THREAD_API_RTEMS ]; + return _Event_Surrender( + the_thread, + event_in, + &api->System_event, + THREAD_WAIT_CLASS_SYSTEM_EVENT, + &lock_context + ); } |