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/eventseize.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/eventseize.c')
-rw-r--r-- | cpukit/rtems/src/eventseize.c | 71 |
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 ); } |