summaryrefslogtreecommitdiffstats
path: root/cpukit/rtems/src/eventseize.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/eventseize.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/eventseize.c')
-rw-r--r--cpukit/rtems/src/eventseize.c71
1 files changed, 24 insertions, 47 deletions
diff --git a/cpukit/rtems/src/eventseize.c b/cpukit/rtems/src/eventseize.c
index b1ad80d1cc..175639ff58 100644
--- a/cpukit/rtems/src/eventseize.c
+++ b/cpukit/rtems/src/eventseize.c
@@ -10,34 +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>
/*
- * _Event_Seize
- *
- * This routine attempts to satisfy the requested event condition
- * for the running thread.
- *
- * Input parameters:
- * event_in - the event condition to satisfy
- * option_set - acquire event options
- * ticks - interval to wait
- * event_out - pointer to event set output area
- *
- * Output parameters: NONE
- * *event_out - event set output area filled in
- *
* INTERRUPT LATENCY:
* available
* wait
@@ -45,31 +23,30 @@
*/
void _Event_Seize(
- rtems_event_set event_in,
- rtems_option option_set,
- rtems_interval ticks,
- rtems_event_set *event_out
+ rtems_event_set event_in,
+ rtems_option option_set,
+ rtems_interval ticks,
+ rtems_event_set *event_out,
+ Thread_Control *executing,
+ Event_Control *event,
+ Thread_blocking_operation_States *sync_state,
+ States_Control wait_state
)
{
- Thread_Control *executing;
- rtems_event_set seized_events;
- rtems_event_set pending_events;
- ISR_Level level;
- RTEMS_API_Control *api;
- Thread_blocking_operation_States sync_state;
-
- executing = _Thread_Executing;
- executing->Wait.return_code = RTEMS_SUCCESSFUL;
+ rtems_event_set seized_events;
+ rtems_event_set pending_events;
+ ISR_Level level;
+ Thread_blocking_operation_States current_sync_state;
- api = executing->API_Extensions[ THREAD_API_RTEMS ];
+ executing->Wait.return_code = RTEMS_SUCCESSFUL;
_ISR_Disable( level );
- pending_events = api->pending_events;
+ pending_events = event->pending_events;
seized_events = _Event_sets_Get( pending_events, event_in );
if ( !_Event_sets_Is_empty( seized_events ) &&
(seized_events == event_in || _Options_Is_any( option_set )) ) {
- api->pending_events =
+ event->pending_events =
_Event_sets_Clear( pending_events, seized_events );
_ISR_Enable( level );
*event_out = seized_events;
@@ -91,11 +68,11 @@ void _Event_Seize(
* NOTE: Since interrupts are disabled, this isn't that much of an
* issue but better safe than sorry.
*/
- executing->Wait.option = (uint32_t) option_set;
- executing->Wait.count = (uint32_t) event_in;
+ executing->Wait.option = option_set;
+ executing->Wait.count = event_in;
executing->Wait.return_argument = event_out;
- _Event_Sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
+ *sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
_ISR_Enable( level );
@@ -109,13 +86,13 @@ void _Event_Seize(
_Watchdog_Insert_ticks( &executing->Timer, ticks );
}
- _Thread_Set_state( executing, STATES_WAITING_FOR_EVENT );
+ _Thread_Set_state( executing, wait_state );
_ISR_Disable( level );
- sync_state = _Event_Sync_state;
- _Event_Sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
- if ( sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) {
+ current_sync_state = *sync_state;
+ *sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
+ if ( current_sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) {
_ISR_Enable( level );
return;
}
@@ -127,5 +104,5 @@ void _Event_Seize(
* WARNING! Entering with interrupts disabled and returning with interrupts
* enabled!
*/
- _Thread_blocking_operation_Cancel( sync_state, executing, level );
+ _Thread_blocking_operation_Cancel( current_sync_state, executing, level );
}