diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2012-10-30 16:18:36 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2012-10-30 18:00:33 +0100 |
commit | 990575c57f82b8b8ad5c2b8abc53796830fee59a (patch) | |
tree | 70f48369e6882c4ca231534e4143b80d2994cef5 /cpukit/rtems/src/eventreceive.c | |
parent | rtems: Remove unused event_condition member (diff) | |
download | rtems-990575c57f82b8b8ad5c2b8abc53796830fee59a.tar.bz2 |
rtems: Reusable event implementation
Change event implementation to enable reuse for system events.
Diffstat (limited to 'cpukit/rtems/src/eventreceive.c')
-rw-r--r-- | cpukit/rtems/src/eventreceive.c | 69 |
1 files changed, 30 insertions, 39 deletions
diff --git a/cpukit/rtems/src/eventreceive.c b/cpukit/rtems/src/eventreceive.c index 48568ebccd..0361d2c56b 100644 --- a/cpukit/rtems/src/eventreceive.c +++ b/cpukit/rtems/src/eventreceive.c @@ -10,36 +10,12 @@ */ #if HAVE_CONFIG_H -#include "config.h" + #include "config.h" #endif -#include <rtems/system.h> -#include <rtems/rtems/status.h> #include <rtems/rtems/event.h> -#include <rtems/score/isr.h> -#include <rtems/score/object.h> -#include <rtems/rtems/options.h> -#include <rtems/score/states.h> -#include <rtems/score/thread.h> #include <rtems/rtems/tasks.h> -/* - * rtems_event_receive - * - * This directive allows a thread to receive a set of events. - * - * Input parameters: - * event_in - input event condition - * option_set - options - * ticks - number of ticks to wait (0 means wait forever) - * event_out - pointer to output event set - * - * Output parameters: - * event out - event set - * RTEMS_SUCCESSFUL - if successful - * error code - if unsuccessful - */ - rtems_status_code rtems_event_receive( rtems_event_set event_in, rtems_option option_set, @@ -47,20 +23,35 @@ rtems_status_code rtems_event_receive( rtems_event_set *event_out ) { - RTEMS_API_Control *api; - - if ( !event_out ) - return RTEMS_INVALID_ADDRESS; - - api = _Thread_Executing->API_Extensions[ THREAD_API_RTEMS ]; - - if ( _Event_sets_Is_empty( event_in ) ) { - *event_out = api->pending_events; - return RTEMS_SUCCESSFUL; + rtems_status_code sc; + + if ( event_out != NULL ) { + Thread_Control *executing = _Thread_Executing; + RTEMS_API_Control *api = executing->API_Extensions[ THREAD_API_RTEMS ]; + Event_Control *event = &api->Event; + + if ( !_Event_sets_Is_empty( event_in ) ) { + _Thread_Disable_dispatch(); + _Event_Seize( + event_in, + option_set, + ticks, + event_out, + executing, + event, + &_Event_Sync_state, + STATES_WAITING_FOR_EVENT + ); + _Thread_Enable_dispatch(); + + sc = executing->Wait.return_code; + } else { + *event_out = event->pending_events; + sc = RTEMS_SUCCESSFUL; + } + } else { + sc = RTEMS_INVALID_ADDRESS; } - _Thread_Disable_dispatch(); - _Event_Seize( event_in, option_set, ticks, event_out ); - _Thread_Enable_dispatch(); - return( _Thread_Executing->Wait.return_code ); + return sc; } |