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;
|
*event_out = _Thread_Executing->events_out;
|
||||||
return( _Thread_Executing->Wait.return_code );
|
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;
|
*event_out = _Thread_Executing->events_out;
|
||||||
return( _Thread_Executing->Wait.return_code );
|
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