Changeset 9700578 in rtems for cpukit/rtems


Ignore:
Timestamp:
10/30/95 21:54:45 (28 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, 5, master
Children:
c4808ca
Parents:
ea74482
Message:

SPARC port passes all tests

File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpukit/rtems/src/event.c

    rea74482 r9700578  
    109109  return( _Thread_Executing->Wait.return_code );
    110110}
     111
     112
     113/*PAGE
     114 *
     115 *  _Event_Seize
     116 *
     117 *  This routine attempts to satisfy the requested event condition
     118 *  for the running thread.
     119 *
     120 *  Input parameters:
     121 *    event_in   - the event condition to satisfy
     122 *    option_set - acquire event options
     123 *    ticks      - interval to wait
     124 *    event_out  - pointer to event set output area
     125 *
     126 *  Output parameters: NONE
     127 *    *event_out - event set output area filled in
     128 *
     129 *  INTERRUPT LATENCY:
     130 *    available
     131 *    wait
     132 *    check sync
     133 */
     134
     135void _Event_Seize(
     136  rtems_event_set  event_in,
     137  rtems_option     option_set,
     138  rtems_interval   ticks,
     139  rtems_event_set *event_out
     140)
     141{
     142  Thread_Control    *executing;
     143  rtems_event_set    seized_events;
     144  rtems_event_set    pending_events;
     145  ISR_Level          level;
     146  RTEMS_API_Control  *api;
     147
     148  executing = _Thread_Executing;
     149  executing->Wait.return_code = RTEMS_SUCCESSFUL;
     150
     151  api = executing->API_Extensions[ THREAD_API_RTEMS ];
     152
     153  _ISR_Disable( level );
     154  pending_events = api->pending_events;
     155  seized_events  = _Event_sets_Get( pending_events, event_in );
     156
     157  if ( !_Event_sets_Is_empty( seized_events ) &&
     158       (seized_events == event_in || _Options_Is_any( option_set )) ) {
     159    api->pending_events =
     160      _Event_sets_Clear( pending_events, seized_events );
     161    _ISR_Enable( level );
     162    *event_out = seized_events;
     163    return;
     164  }
     165
     166  if ( _Options_Is_no_wait( option_set ) ) {
     167    _ISR_Enable( level );
     168    executing->Wait.return_code = RTEMS_UNSATISFIED;
     169    *event_out = seized_events;
     170    return;
     171  }
     172
     173  _Event_Sync = TRUE;
     174  executing->Wait.option            = (unsigned32) option_set;
     175  executing->Wait.count             = (unsigned32) event_in;
     176  executing->Wait.return_argument   = event_out;
     177
     178  _ISR_Enable( level );
     179  _Thread_Set_state( executing, STATES_WAITING_FOR_EVENT );
     180
     181  if ( ticks ) {
     182    _Watchdog_Initialize(
     183      &executing->Timer,
     184      _Event_Timeout,
     185      executing->Object.id,
     186      NULL
     187    );
     188    _Watchdog_Insert_ticks(
     189      &executing->Timer,
     190      ticks,
     191      WATCHDOG_NO_ACTIVATE
     192    );
     193  }
     194
     195  _ISR_Disable( level );
     196  if ( _Event_Sync == TRUE ) {
     197    _Event_Sync = FALSE;
     198    if ( ticks )
     199      _Watchdog_Activate( &executing->Timer );
     200    _ISR_Enable( level );
     201    return;
     202  }
     203  _ISR_Enable( level );
     204  (void) _Watchdog_Remove( &executing->Timer );
     205  _Thread_Unblock( executing );
     206  return;
     207}
     208
     209/*PAGE
     210 *
     211 *  _Event_Surrender
     212 *
     213 *  This routines remove a thread from the specified threadq.
     214 *
     215 *  Input parameters:
     216 *    the_thread - pointer to thread to be dequeued
     217 *
     218 *  Output parameters: NONE
     219 *
     220 *  INTERRUPT LATENCY:
     221 *    before flash
     222 *    after flash
     223 *    check sync
     224 */
     225
     226void _Event_Surrender(
     227  Thread_Control *the_thread
     228)
     229{
     230  ISR_Level           level;
     231  rtems_event_set     pending_events;
     232  rtems_event_set     event_condition;
     233  rtems_event_set     seized_events;
     234  rtems_option        option_set;
     235  RTEMS_API_Control  *api;
     236
     237  api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
     238
     239  option_set = (rtems_option) the_thread->Wait.option;
     240
     241  _ISR_Disable( level );
     242  pending_events  = api->pending_events;
     243  event_condition = (rtems_event_set) the_thread->Wait.count;
     244
     245  seized_events = _Event_sets_Get( pending_events, event_condition );
     246
     247  if ( !_Event_sets_Is_empty( seized_events ) ) {
     248    if ( _States_Is_waiting_for_event( the_thread->current_state ) ) {
     249      if ( seized_events == event_condition || _Options_Is_any( option_set ) ) {
     250        api->pending_events =
     251           _Event_sets_Clear( pending_events, seized_events );
     252        *(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
     253
     254        _ISR_Flash( level );
     255
     256        if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
     257          _ISR_Enable( level );
     258          _Thread_Unblock( the_thread );
     259        }
     260        else {
     261          _Watchdog_Deactivate( &the_thread->Timer );
     262          _ISR_Enable( level );
     263          (void) _Watchdog_Remove( &the_thread->Timer );
     264          _Thread_Unblock( the_thread );
     265        }
     266        return;
     267      }
     268    }
     269    else if ( _Thread_Is_executing( the_thread ) && _Event_Sync == TRUE ) {
     270      if ( seized_events == event_condition || _Options_Is_any( option_set ) ) {
     271        api->pending_events = _Event_sets_Clear( pending_events,seized_events );
     272        *(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
     273        _Event_Sync = FALSE;
     274      }
     275    }
     276  }
     277  _ISR_Enable( level );
     278}
     279
     280/*PAGE
     281 *
     282 *  _Event_Timeout
     283 *
     284 *  This routine processes a thread which timeouts while waiting to
     285 *  receive an event_set. It is called by the watchdog handler.
     286 *
     287 *  Input parameters:
     288 *    id - thread id
     289 *
     290 *  Output parameters: NONE
     291 */
     292
     293void _Event_Timeout(
     294  Objects_Id  id,
     295  void       *ignored
     296)
     297{
     298  Thread_Control *the_thread;
     299  Objects_Locations      location;
     300
     301  the_thread = _Thread_Get( id, &location );
     302  switch ( location ) {
     303    case OBJECTS_ERROR:
     304    case OBJECTS_REMOTE:  /* impossible */
     305      break;
     306    case OBJECTS_LOCAL:
     307      the_thread->Wait.return_code = RTEMS_TIMEOUT;
     308      _Thread_Unblock( the_thread );
     309      _Thread_Unnest_dispatch();
     310      break;
     311  }
     312}
Note: See TracChangeset for help on using the changeset viewer.