forked from Imagelibrary/rtems
split out event support functions in anticipation of making a handler
This commit is contained in:
@@ -101,194 +101,3 @@ rtems_status_code rtems_event_receive(
|
||||
*event_out = _Thread_Executing->events_out;
|
||||
return( _Thread_Executing->Wait.return_code );
|
||||
}
|
||||
|
||||
/*PAGE
|
||||
*
|
||||
* _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
|
||||
*
|
||||
* Output parameters: NONE
|
||||
*
|
||||
* INTERRUPT LATENCY:
|
||||
* available
|
||||
* wait
|
||||
* check sync
|
||||
*/
|
||||
|
||||
void _Event_Seize(
|
||||
rtems_event_set event_in,
|
||||
rtems_option option_set,
|
||||
rtems_interval ticks
|
||||
)
|
||||
{
|
||||
Thread_Control *executing;
|
||||
rtems_event_set seized_events;
|
||||
rtems_event_set pending_events;
|
||||
ISR_Level level;
|
||||
|
||||
executing = _Thread_Executing;
|
||||
executing->Wait.return_code = RTEMS_SUCCESSFUL;
|
||||
|
||||
_ISR_Disable( level );
|
||||
pending_events = executing->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 )) ) {
|
||||
executing->pending_events =
|
||||
_Event_sets_Clear( pending_events, seized_events );
|
||||
_ISR_Enable( level );
|
||||
executing->events_out = seized_events;
|
||||
return;
|
||||
}
|
||||
|
||||
if ( _Options_Is_no_wait( option_set ) ) {
|
||||
_ISR_Enable( level );
|
||||
executing->Wait.return_code = RTEMS_UNSATISFIED;
|
||||
executing->events_out = seized_events;
|
||||
return;
|
||||
}
|
||||
|
||||
_Event_Sync = TRUE;
|
||||
executing->Wait.option_set = option_set;
|
||||
executing->Wait.Extra.event_condition = event_in;
|
||||
|
||||
_ISR_Enable( level );
|
||||
_Thread_Set_state( executing, STATES_WAITING_FOR_EVENT );
|
||||
|
||||
if ( ticks ) {
|
||||
_Watchdog_Initialize(
|
||||
&executing->Timer,
|
||||
_Event_Timeout,
|
||||
executing->Object.id,
|
||||
NULL
|
||||
);
|
||||
_Watchdog_Insert_ticks(
|
||||
&executing->Timer,
|
||||
ticks,
|
||||
WATCHDOG_NO_ACTIVATE
|
||||
);
|
||||
}
|
||||
|
||||
_ISR_Disable( level );
|
||||
if ( _Event_Sync == TRUE ) {
|
||||
_Event_Sync = FALSE;
|
||||
if ( ticks )
|
||||
_Watchdog_Activate( &executing->Timer );
|
||||
_ISR_Enable( level );
|
||||
return;
|
||||
}
|
||||
_ISR_Enable( level );
|
||||
(void) _Watchdog_Remove( &executing->Timer );
|
||||
_Thread_Unblock( executing );
|
||||
return;
|
||||
}
|
||||
|
||||
/*PAGE
|
||||
*
|
||||
* _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
|
||||
* check sync
|
||||
*/
|
||||
|
||||
void _Event_Surrender(
|
||||
Thread_Control *the_thread
|
||||
)
|
||||
{
|
||||
ISR_Level level;
|
||||
rtems_event_set pending_events;
|
||||
rtems_event_set event_condition;
|
||||
rtems_event_set seized_events;
|
||||
|
||||
_ISR_Disable( level );
|
||||
pending_events = the_thread->pending_events;
|
||||
event_condition = the_thread->Wait.Extra.event_condition;
|
||||
|
||||
seized_events = _Event_sets_Get( pending_events, event_condition );
|
||||
|
||||
if ( !_Event_sets_Is_empty( seized_events ) ) {
|
||||
if ( _States_Is_waiting_for_event( the_thread->current_state ) ) {
|
||||
if ( seized_events == event_condition ||
|
||||
_Options_Is_any( the_thread->Wait.option_set ) ) {
|
||||
the_thread->pending_events =
|
||||
_Event_sets_Clear( pending_events, seized_events );
|
||||
(rtems_event_set *)the_thread->events_out = seized_events;
|
||||
|
||||
_ISR_Flash( level );
|
||||
|
||||
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
|
||||
_ISR_Enable( level );
|
||||
_Thread_Unblock( the_thread );
|
||||
}
|
||||
else {
|
||||
_Watchdog_Deactivate( &the_thread->Timer );
|
||||
_ISR_Enable( level );
|
||||
(void) _Watchdog_Remove( &the_thread->Timer );
|
||||
_Thread_Unblock( the_thread );
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if ( _Thread_Is_executing( the_thread ) && _Event_Sync == TRUE ) {
|
||||
if ( seized_events == event_condition ||
|
||||
_Options_Is_any( the_thread->Wait.option_set ) ) {
|
||||
the_thread->pending_events =
|
||||
_Event_sets_Clear( pending_events,seized_events );
|
||||
(rtems_event_set *)the_thread->events_out = seized_events;
|
||||
_Event_Sync = FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
_ISR_Enable( level );
|
||||
}
|
||||
|
||||
/*PAGE
|
||||
*
|
||||
* _Event_Timeout
|
||||
*
|
||||
* This routine processes a thread which timeouts while waiting to
|
||||
* receive an event_set. It is called by the watchdog handler.
|
||||
*
|
||||
* Input parameters:
|
||||
* id - thread id
|
||||
*
|
||||
* Output parameters: NONE
|
||||
*/
|
||||
|
||||
void _Event_Timeout(
|
||||
Objects_Id id,
|
||||
void *ignored
|
||||
)
|
||||
{
|
||||
Thread_Control *the_thread;
|
||||
Objects_Locations location;
|
||||
|
||||
the_thread = _Thread_Get( id, &location );
|
||||
switch ( location ) {
|
||||
case OBJECTS_ERROR:
|
||||
case OBJECTS_REMOTE: /* impossible */
|
||||
break;
|
||||
case OBJECTS_LOCAL:
|
||||
the_thread->Wait.return_code = RTEMS_TIMEOUT;
|
||||
_Thread_Unblock( the_thread );
|
||||
_Thread_Unnest_dispatch();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,194 +101,3 @@ rtems_status_code rtems_event_receive(
|
||||
*event_out = _Thread_Executing->events_out;
|
||||
return( _Thread_Executing->Wait.return_code );
|
||||
}
|
||||
|
||||
/*PAGE
|
||||
*
|
||||
* _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
|
||||
*
|
||||
* Output parameters: NONE
|
||||
*
|
||||
* INTERRUPT LATENCY:
|
||||
* available
|
||||
* wait
|
||||
* check sync
|
||||
*/
|
||||
|
||||
void _Event_Seize(
|
||||
rtems_event_set event_in,
|
||||
rtems_option option_set,
|
||||
rtems_interval ticks
|
||||
)
|
||||
{
|
||||
Thread_Control *executing;
|
||||
rtems_event_set seized_events;
|
||||
rtems_event_set pending_events;
|
||||
ISR_Level level;
|
||||
|
||||
executing = _Thread_Executing;
|
||||
executing->Wait.return_code = RTEMS_SUCCESSFUL;
|
||||
|
||||
_ISR_Disable( level );
|
||||
pending_events = executing->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 )) ) {
|
||||
executing->pending_events =
|
||||
_Event_sets_Clear( pending_events, seized_events );
|
||||
_ISR_Enable( level );
|
||||
executing->events_out = seized_events;
|
||||
return;
|
||||
}
|
||||
|
||||
if ( _Options_Is_no_wait( option_set ) ) {
|
||||
_ISR_Enable( level );
|
||||
executing->Wait.return_code = RTEMS_UNSATISFIED;
|
||||
executing->events_out = seized_events;
|
||||
return;
|
||||
}
|
||||
|
||||
_Event_Sync = TRUE;
|
||||
executing->Wait.option_set = option_set;
|
||||
executing->Wait.Extra.event_condition = event_in;
|
||||
|
||||
_ISR_Enable( level );
|
||||
_Thread_Set_state( executing, STATES_WAITING_FOR_EVENT );
|
||||
|
||||
if ( ticks ) {
|
||||
_Watchdog_Initialize(
|
||||
&executing->Timer,
|
||||
_Event_Timeout,
|
||||
executing->Object.id,
|
||||
NULL
|
||||
);
|
||||
_Watchdog_Insert_ticks(
|
||||
&executing->Timer,
|
||||
ticks,
|
||||
WATCHDOG_NO_ACTIVATE
|
||||
);
|
||||
}
|
||||
|
||||
_ISR_Disable( level );
|
||||
if ( _Event_Sync == TRUE ) {
|
||||
_Event_Sync = FALSE;
|
||||
if ( ticks )
|
||||
_Watchdog_Activate( &executing->Timer );
|
||||
_ISR_Enable( level );
|
||||
return;
|
||||
}
|
||||
_ISR_Enable( level );
|
||||
(void) _Watchdog_Remove( &executing->Timer );
|
||||
_Thread_Unblock( executing );
|
||||
return;
|
||||
}
|
||||
|
||||
/*PAGE
|
||||
*
|
||||
* _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
|
||||
* check sync
|
||||
*/
|
||||
|
||||
void _Event_Surrender(
|
||||
Thread_Control *the_thread
|
||||
)
|
||||
{
|
||||
ISR_Level level;
|
||||
rtems_event_set pending_events;
|
||||
rtems_event_set event_condition;
|
||||
rtems_event_set seized_events;
|
||||
|
||||
_ISR_Disable( level );
|
||||
pending_events = the_thread->pending_events;
|
||||
event_condition = the_thread->Wait.Extra.event_condition;
|
||||
|
||||
seized_events = _Event_sets_Get( pending_events, event_condition );
|
||||
|
||||
if ( !_Event_sets_Is_empty( seized_events ) ) {
|
||||
if ( _States_Is_waiting_for_event( the_thread->current_state ) ) {
|
||||
if ( seized_events == event_condition ||
|
||||
_Options_Is_any( the_thread->Wait.option_set ) ) {
|
||||
the_thread->pending_events =
|
||||
_Event_sets_Clear( pending_events, seized_events );
|
||||
(rtems_event_set *)the_thread->events_out = seized_events;
|
||||
|
||||
_ISR_Flash( level );
|
||||
|
||||
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
|
||||
_ISR_Enable( level );
|
||||
_Thread_Unblock( the_thread );
|
||||
}
|
||||
else {
|
||||
_Watchdog_Deactivate( &the_thread->Timer );
|
||||
_ISR_Enable( level );
|
||||
(void) _Watchdog_Remove( &the_thread->Timer );
|
||||
_Thread_Unblock( the_thread );
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if ( _Thread_Is_executing( the_thread ) && _Event_Sync == TRUE ) {
|
||||
if ( seized_events == event_condition ||
|
||||
_Options_Is_any( the_thread->Wait.option_set ) ) {
|
||||
the_thread->pending_events =
|
||||
_Event_sets_Clear( pending_events,seized_events );
|
||||
(rtems_event_set *)the_thread->events_out = seized_events;
|
||||
_Event_Sync = FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
_ISR_Enable( level );
|
||||
}
|
||||
|
||||
/*PAGE
|
||||
*
|
||||
* _Event_Timeout
|
||||
*
|
||||
* This routine processes a thread which timeouts while waiting to
|
||||
* receive an event_set. It is called by the watchdog handler.
|
||||
*
|
||||
* Input parameters:
|
||||
* id - thread id
|
||||
*
|
||||
* Output parameters: NONE
|
||||
*/
|
||||
|
||||
void _Event_Timeout(
|
||||
Objects_Id id,
|
||||
void *ignored
|
||||
)
|
||||
{
|
||||
Thread_Control *the_thread;
|
||||
Objects_Locations location;
|
||||
|
||||
the_thread = _Thread_Get( id, &location );
|
||||
switch ( location ) {
|
||||
case OBJECTS_ERROR:
|
||||
case OBJECTS_REMOTE: /* impossible */
|
||||
break;
|
||||
case OBJECTS_LOCAL:
|
||||
the_thread->Wait.return_code = RTEMS_TIMEOUT;
|
||||
_Thread_Unblock( the_thread );
|
||||
_Thread_Unnest_dispatch();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user