Changeset 9700578 in rtems for cpukit/rtems
- Timestamp:
- 10/30/95 21:54:45 (28 years ago)
- Branches:
- 4.10, 4.11, 4.8, 4.9, 5, master
- Children:
- c4808ca
- Parents:
- ea74482
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
cpukit/rtems/src/event.c
rea74482 r9700578 109 109 return( _Thread_Executing->Wait.return_code ); 110 110 } 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 135 void _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 226 void _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 293 void _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.