diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-02-18 08:36:26 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-03-04 13:36:10 +0100 |
commit | 03b900d3ed120ea919ea3eded7edbece3488cff3 (patch) | |
tree | 182781fc14fe15fd67caeb80e46f1c58495839c2 /cpukit/rtems/src/ratemontimeout.c | |
parent | score: Distribute clock tick to all online CPUs (diff) | |
download | rtems-03b900d3ed120ea919ea3eded7edbece3488cff3.tar.bz2 |
score: Replace watchdog handler implementation
Use a red-black tree instead of delta chains.
Close #2344.
Update #2554.
Update #2555.
Close #2606.
Diffstat (limited to '')
-rw-r--r-- | cpukit/rtems/src/ratemontimeout.c | 50 |
1 files changed, 17 insertions, 33 deletions
diff --git a/cpukit/rtems/src/ratemontimeout.c b/cpukit/rtems/src/ratemontimeout.c index 08f9bd17d7..7c25595a16 100644 --- a/cpukit/rtems/src/ratemontimeout.c +++ b/cpukit/rtems/src/ratemontimeout.c @@ -22,46 +22,30 @@ #include <rtems/score/threadimpl.h> #include <rtems/score/watchdogimpl.h> -void _Rate_monotonic_Timeout( - Objects_Id id, - void *ignored -) +void _Rate_monotonic_Timeout( Watchdog_Control *watchdog ) { Rate_monotonic_Control *the_period; - Objects_Locations location; Thread_Control *the_thread; /* * When we get here, the Timer is already off the chain so we do not * have to worry about that -- hence no _Watchdog_Remove(). */ - the_period = _Rate_monotonic_Get( id, &location ); - switch ( location ) { - - case OBJECTS_LOCAL: - the_thread = the_period->owner; - if ( _States_Is_waiting_for_period( the_thread->current_state ) && - the_thread->Wait.id == the_period->Object.id ) { - _Thread_Unblock( the_thread ); - - _Rate_monotonic_Initiate_statistics( the_period ); - - _Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length ); - } else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) { - the_period->state = RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING; - - _Rate_monotonic_Initiate_statistics( the_period ); - - _Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length ); - } else - the_period->state = RATE_MONOTONIC_EXPIRED; - _Objects_Put_without_thread_dispatch( &the_period->Object ); - break; - -#if defined(RTEMS_MULTIPROCESSING) - case OBJECTS_REMOTE: /* impossible */ -#endif - case OBJECTS_ERROR: - break; + the_period = RTEMS_CONTAINER_OF( watchdog, Rate_monotonic_Control, Timer ); + the_thread = the_period->owner; + + _Thread_Disable_dispatch(); + + if ( _States_Is_waiting_for_period( the_thread->current_state ) && + the_thread->Wait.id == the_period->Object.id ) { + _Thread_Unblock( the_thread ); + _Rate_monotonic_Restart( the_period ); + } else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) { + the_period->state = RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING; + _Rate_monotonic_Restart( the_period ); + } else { + the_period->state = RATE_MONOTONIC_EXPIRED; } + + _Thread_Unnest_dispatch(); } |