summaryrefslogtreecommitdiffstats
path: root/cpukit/rtems/src/ratemontimeout.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-02-18 08:36:26 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-03-04 13:36:10 +0100
commit03b900d3ed120ea919ea3eded7edbece3488cff3 (patch)
tree182781fc14fe15fd67caeb80e46f1c58495839c2 /cpukit/rtems/src/ratemontimeout.c
parentscore: Distribute clock tick to all online CPUs (diff)
downloadrtems-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 'cpukit/rtems/src/ratemontimeout.c')
-rw-r--r--cpukit/rtems/src/ratemontimeout.c50
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();
}