[PATCH] score: Split _Watchdog_Adjust()

Sebastian Huber sebastian.huber at embedded-brains.de
Fri Apr 10 13:51:50 UTC 2015


Split _Watchdog_Adjust() into _Watchdog_Adjust_backward() and
_Watchdog_Adjust_forward().  Remove Watchdog_Adjust_directions,
_Watchdog_Adjust_seconds() and _Watchdog_Adjust_ticks().  This avoids to
check the same condition again.

Update #2307.
---
 cpukit/rtems/src/timerserver.c                  |  2 +-
 cpukit/score/include/rtems/score/watchdogimpl.h | 78 +++++++------------------
 cpukit/score/src/coretodset.c                   |  6 +-
 cpukit/score/src/watchdogadjust.c               | 67 ++++++++++-----------
 4 files changed, 56 insertions(+), 97 deletions(-)

diff --git a/cpukit/rtems/src/timerserver.c b/cpukit/rtems/src/timerserver.c
index e4fe56f..00f29cc 100644
--- a/cpukit/rtems/src/timerserver.c
+++ b/cpukit/rtems/src/timerserver.c
@@ -275,7 +275,7 @@ static void _Timer_server_Process_tod_watchdogs(
       *  TOD has been set backwards.
       */
      delta = last_snapshot - snapshot;
-     _Watchdog_Adjust( &watchdogs->Chain, WATCHDOG_BACKWARD, delta );
+     _Watchdog_Adjust_backward( &watchdogs->Chain, delta );
   }
 
   watchdogs->last_snapshot = snapshot;
diff --git a/cpukit/score/include/rtems/score/watchdogimpl.h b/cpukit/score/include/rtems/score/watchdogimpl.h
index d50e279..9eb0951 100644
--- a/cpukit/score/include/rtems/score/watchdogimpl.h
+++ b/cpukit/score/include/rtems/score/watchdogimpl.h
@@ -53,22 +53,6 @@ extern "C" {
   }
 
 /**
- *  @brief the manner in which a watchdog chain may
- *  be adjusted by the @ref _Watchdog_Adjust routine.
- *
- *  The following enumerated type details the manner in which
- *  a watchdog chain may be adjusted by the @ref _Watchdog_Adjust
- *  routine.  The direction indicates a movement FORWARD
- *  or BACKWARD in time.
- */
-typedef enum {
-  /** adjust delta value forward */
-  WATCHDOG_FORWARD,
-  /** adjust delta value backward */
-  WATCHDOG_BACKWARD
-} Watchdog_Adjust_directions;
-
-/**
  *  @brief Watchdog synchronization level.
  *
  *  This used for synchronization purposes
@@ -121,20 +105,29 @@ Watchdog_States _Watchdog_Remove (
 );
 
 /**
- *  @brief Adjusts the @a header watchdog chain in the forward
- *  or backward @a direction for @a units ticks.
+ *  @brief Adjusts the header watchdog chain in the backward direction for
+ *  units ticks.
  *
- *  This routine adjusts the @a header watchdog chain in the forward
- *  or backward @a direction for @a units ticks.
+ *  @param[in] header The watchdog chain.
+ *  @param[in] units The units of ticks to adjust.
+ */
+void _Watchdog_Adjust_backward(
+  Chain_Control     *header,
+  Watchdog_Interval  units
+);
+
+/**
+ *  @brief Adjusts the header watchdog chain in the forward direction for units
+ *  ticks.
  *
- *  @param[in] header is the watchdog chain to adjust
- *  @param[in] direction is the direction to adjust @a header
- *  @param[in] units is the number of units to adjust @a header
+ *  This may lead to several _Watchdog_Tickle() invocations.
+ *
+ *  @param[in] header The watchdog chain.
+ *  @param[in] units The units of ticks to adjust.
  */
-void _Watchdog_Adjust (
-  Chain_Control              *header,
-  Watchdog_Adjust_directions  direction,
-  Watchdog_Interval           units
+void _Watchdog_Adjust_forward(
+  Chain_Control     *header,
+  Watchdog_Interval  units
 );
 
 /**
@@ -312,37 +305,6 @@ RTEMS_INLINE_ROUTINE void _Watchdog_Insert_seconds(
 }
 
 /**
- * This routine adjusts the seconds watchdog chain in the forward
- * or backward DIRECTION for UNITS seconds.  This is invoked when the
- * current time of day is changed.
- */
-
-RTEMS_INLINE_ROUTINE void _Watchdog_Adjust_seconds(
-  Watchdog_Adjust_directions direction,
-  Watchdog_Interval          units
-)
-{
-
-  _Watchdog_Adjust( &_Watchdog_Seconds_chain, direction, units );
-
-}
-
-/**
- * This routine adjusts the ticks watchdog chain in the forward
- * or backward DIRECTION for UNITS ticks.
- */
-
-RTEMS_INLINE_ROUTINE void _Watchdog_Adjust_ticks(
-  Watchdog_Adjust_directions direction,
-  Watchdog_Interval          units
-)
-{
-
-  _Watchdog_Adjust( &_Watchdog_Ticks_chain, direction, units );
-
-}
-
-/**
  * This routine resets THE_WATCHDOG timer to its state at INSERT
  * time.  This routine is valid only on interval watchdog timers
  * and is used to make an interval watchdog timer fire "every" so
diff --git a/cpukit/score/src/coretodset.c b/cpukit/score/src/coretodset.c
index 6006e66..8c4ef8b 100644
--- a/cpukit/score/src/coretodset.c
+++ b/cpukit/score/src/coretodset.c
@@ -31,15 +31,17 @@ void _TOD_Set_with_timestamp(
   Watchdog_Interval seconds_next = _Timestamp_Get_seconds( tod_as_timestamp );
   Watchdog_Interval seconds_now;
   ISR_lock_Context lock_context;
+  Chain_Control *header;
 
   _Thread_Disable_dispatch();
 
   seconds_now = _TOD_Seconds_since_epoch();
+  header = &_Watchdog_Seconds_chain;
 
   if ( seconds_next < seconds_now )
-    _Watchdog_Adjust_seconds( WATCHDOG_BACKWARD, seconds_now - seconds_next );
+    _Watchdog_Adjust_backward( header, seconds_now - seconds_next );
   else
-    _Watchdog_Adjust_seconds( WATCHDOG_FORWARD, seconds_next - seconds_now );
+    _Watchdog_Adjust_forward( header, seconds_next - seconds_now );
 
   _TOD_Acquire( tod, &lock_context );
   tod->now = *tod_as_timestamp;
diff --git a/cpukit/score/src/watchdogadjust.c b/cpukit/score/src/watchdogadjust.c
index bbfda4d..5d84104 100644
--- a/cpukit/score/src/watchdogadjust.c
+++ b/cpukit/score/src/watchdogadjust.c
@@ -18,57 +18,52 @@
 #include "config.h"
 #endif
 
-#include <rtems/system.h>
-#include <rtems/score/isr.h>
 #include <rtems/score/watchdogimpl.h>
+#include <rtems/score/chainimpl.h>
+#include <rtems/score/isrlevel.h>
 
-void _Watchdog_Adjust(
-  Chain_Control               *header,
-  Watchdog_Adjust_directions   direction,
-  Watchdog_Interval            units
+void _Watchdog_Adjust_backward(
+  Chain_Control     *header,
+  Watchdog_Interval  units
 )
 {
   ISR_Level level;
 
   _ISR_Disable( level );
 
-  /*
-   * NOTE: It is safe NOT to make 'header' a pointer
-   *       to volatile data (contrast this with watchdoginsert.c)
-   *       because we call _Watchdog_Tickle() below and
-   *       hence the compiler must not assume *header to remain
-   *       unmodified across that call.
-   *
-   *       Till Straumann, 7/2003
-   */
   if ( !_Chain_Is_empty( header ) ) {
-    switch ( direction ) {
-      case WATCHDOG_BACKWARD:
-        _Watchdog_First( header )->delta_interval += units;
-        break;
-      case WATCHDOG_FORWARD:
-        while ( units ) {
-          if ( units < _Watchdog_First( header )->delta_interval ) {
-            _Watchdog_First( header )->delta_interval -= units;
-            break;
-          } else {
-            units -= _Watchdog_First( header )->delta_interval;
-            _Watchdog_First( header )->delta_interval = 1;
+     _Watchdog_First( header )->delta_interval += units;
+  }
+
+  _ISR_Enable( level );
+}
+
+void _Watchdog_Adjust_forward(
+  Chain_Control     *header,
+  Watchdog_Interval  units
+)
+{
+  ISR_Level level;
+
+  _ISR_Disable( level );
+
+  while ( !_Chain_Is_empty( header ) && units > 0 ) {
+    Watchdog_Control *first = _Watchdog_First( header );
 
-            _ISR_Enable( level );
+    if ( units < first->delta_interval ) {
+      first->delta_interval -= units;
+      break;
+    } else {
+      units -= first->delta_interval;
+      first->delta_interval = 1;
 
-            _Watchdog_Tickle( header );
+      _ISR_Enable( level );
 
-            _ISR_Disable( level );
+      _Watchdog_Tickle( header );
 
-            if ( _Chain_Is_empty( header ) )
-              break;
-          }
-        }
-        break;
+      _ISR_Disable( level );
     }
   }
 
   _ISR_Enable( level );
-
 }
-- 
1.8.4.5



More information about the devel mailing list