summaryrefslogtreecommitdiffstats
path: root/cpukit/rtems/src/ratemontimeout.c
diff options
context:
space:
mode:
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();
}