summaryrefslogtreecommitdiffstats
path: root/cpukit/rtems/src
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
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')
-rw-r--r--cpukit/rtems/src/eventreceive.c69
-rw-r--r--cpukit/rtems/src/eventseize.c71
-rw-r--r--cpukit/rtems/src/eventsend.c71
-rw-r--r--cpukit/rtems/src/eventsurrender.c63
-rw-r--r--cpukit/rtems/src/tasks.c4
5 files changed, 110 insertions, 168 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;
}
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 );
}
diff --git a/cpukit/rtems/src/eventsend.c b/cpukit/rtems/src/eventsend.c
index cc06cfaca1..8f0b027ecf 100644
--- a/cpukit/rtems/src/eventsend.c
+++ b/cpukit/rtems/src/eventsend.c
@@ -10,66 +10,49 @@
*/
#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_send
- *
- * This directive allows a thread send an event set to another thread.
- *
- * Input parameters:
- * id - thread id
- * event - event set
- *
- * Output parameters:
- * RTEMS_SUCCESSFUL - if successful
- * error code - if unsuccessful
- */
-
rtems_status_code rtems_event_send(
- rtems_id id,
- rtems_event_set event_in
+ rtems_id id,
+ rtems_event_set event_in
)
{
- register Thread_Control *the_thread;
- Objects_Locations location;
- RTEMS_API_Control *api;
+ rtems_status_code sc;
+ Thread_Control *thread;
+ Objects_Locations location;
+ RTEMS_API_Control *api;
- the_thread = _Thread_Get( id, &location );
+ thread = _Thread_Get( id, &location );
switch ( location ) {
-
case OBJECTS_LOCAL:
- api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
- _Event_sets_Post( event_in, &api->pending_events );
- _Event_Surrender( the_thread );
+ api = thread->API_Extensions[ THREAD_API_RTEMS ];
+ _Event_Surrender(
+ thread,
+ event_in,
+ &api->Event,
+ &_Event_Sync_state,
+ STATES_WAITING_FOR_EVENT
+ );
_Thread_Enable_dispatch();
- return RTEMS_SUCCESSFUL;
-
-#if defined(RTEMS_MULTIPROCESSING)
+ sc = RTEMS_SUCCESSFUL;
+ break;
+#ifdef RTEMS_MULTIPROCESSING
case OBJECTS_REMOTE:
- return(
- _Event_MP_Send_request_packet(
- EVENT_MP_SEND_REQUEST,
- id,
- event_in
- )
+ sc = _Event_MP_Send_request_packet(
+ EVENT_MP_SEND_REQUEST,
+ id,
+ event_in
);
+ break;
#endif
-
- case OBJECTS_ERROR:
+ default:
+ sc = RTEMS_INVALID_ID;
break;
}
- return RTEMS_INVALID_ID;
+ return sc;
}
diff --git a/cpukit/rtems/src/eventsurrender.c b/cpukit/rtems/src/eventsurrender.c
index 9761c782e8..07e7b529e3 100644
--- a/cpukit/rtems/src/eventsurrender.c
+++ b/cpukit/rtems/src/eventsurrender.c
@@ -10,29 +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_Surrender
- *
- * This routines remove a thread from the specified threadq.
- *
- * Input parameters:
- * the_thread - pointer to thread to be dequeued
- *
- * Output parameters: NONE
- *
* INTERRUPT LATENCY:
* before flash
* after flash
@@ -40,23 +23,25 @@
*/
void _Event_Surrender(
- Thread_Control *the_thread
+ Thread_Control *the_thread,
+ rtems_event_set event_in,
+ Event_Control *event,
+ Thread_blocking_operation_States *sync_state,
+ States_Control wait_state
)
{
- ISR_Level level;
- rtems_event_set pending_events;
- rtems_event_set event_condition;
- rtems_event_set seized_events;
- rtems_option option_set;
- RTEMS_API_Control *api;
-
- api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
+ ISR_Level level;
+ rtems_event_set pending_events;
+ rtems_event_set event_condition;
+ rtems_event_set seized_events;
+ rtems_option option_set;
- option_set = (rtems_option) the_thread->Wait.option;
+ option_set = the_thread->Wait.option;
_ISR_Disable( level );
- pending_events = api->pending_events;
- event_condition = (rtems_event_set) the_thread->Wait.count;
+ _Event_sets_Post( event_in, &event->pending_events );
+ pending_events = event->pending_events;
+ event_condition = the_thread->Wait.count;
seized_events = _Event_sets_Get( pending_events, event_condition );
@@ -74,13 +59,16 @@ void _Event_Surrender(
*/
if ( _ISR_Is_in_progress() &&
_Thread_Is_executing( the_thread ) &&
- ((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
- (_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
+ ((*sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
+ (*sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
if ( seized_events == event_condition || _Options_Is_any(option_set) ) {
- api->pending_events = _Event_sets_Clear( pending_events,seized_events );
+ event->pending_events = _Event_sets_Clear(
+ pending_events,
+ seized_events
+ );
the_thread->Wait.count = 0;
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
- _Event_Sync_state = THREAD_BLOCKING_OPERATION_SATISFIED;
+ *sync_state = THREAD_BLOCKING_OPERATION_SATISFIED;
}
_ISR_Enable( level );
return;
@@ -89,9 +77,12 @@ void _Event_Surrender(
/*
* Otherwise, this is a normal send to another thread
*/
- if ( _States_Is_waiting_for_event( the_thread->current_state ) ) {
+ if ( _States_Are_set( the_thread->current_state, wait_state ) ) {
if ( seized_events == event_condition || _Options_Is_any( option_set ) ) {
- api->pending_events = _Event_sets_Clear( pending_events, seized_events );
+ event->pending_events = _Event_sets_Clear(
+ pending_events,
+ seized_events
+ );
the_thread->Wait.count = 0;
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
diff --git a/cpukit/rtems/src/tasks.c b/cpukit/rtems/src/tasks.c
index d8b80f453c..325eba0546 100644
--- a/cpukit/rtems/src/tasks.c
+++ b/cpukit/rtems/src/tasks.c
@@ -64,7 +64,7 @@ static bool _RTEMS_tasks_Create_extension(
created->API_Extensions[ THREAD_API_RTEMS ] = api;
- api->pending_events = EVENT_SETS_NONE_PENDING;
+ _Event_Initialize( &api->Event );
_ASR_Initialize( &api->Signal );
created->task_variables = NULL;
@@ -92,7 +92,7 @@ static void _RTEMS_tasks_Start_extension(
api = started->API_Extensions[ THREAD_API_RTEMS ];
- api->pending_events = EVENT_SETS_NONE_PENDING;
+ _Event_Initialize( &api->Event );
}
/*