summaryrefslogtreecommitdiffstats
path: root/cpukit/rtems/src/eventreceive.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2012-10-30 16:18:36 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2012-10-30 18:00:33 +0100
commit990575c57f82b8b8ad5c2b8abc53796830fee59a (patch)
tree70f48369e6882c4ca231534e4143b80d2994cef5 /cpukit/rtems/src/eventreceive.c
parentrtems: Remove unused event_condition member (diff)
downloadrtems-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.c69
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;
}