[PATCH 1/2] score: Return status in _TOD_Set()

Sebastian Huber sebastian.huber at embedded-brains.de
Mon Apr 13 17:51:16 UTC 2020


Update #3949.
---
 cpukit/include/rtems/score/todimpl.h        | 25 ++++++++++--------------
 cpukit/posix/src/clocksettime.c             |  9 +++++----
 cpukit/rtems/src/clockset.c                 |  9 +++------
 cpukit/score/src/coretodhookrun.c           | 30 ++++++++++++++++-------------
 cpukit/score/src/coretodset.c               | 12 ++++++------
 testsuites/sptests/spclock_todhook01/init.c | 14 +++++++-------
 6 files changed, 48 insertions(+), 51 deletions(-)

diff --git a/cpukit/include/rtems/score/todimpl.h b/cpukit/include/rtems/score/todimpl.h
index 5287c976f5..b54d9a950c 100644
--- a/cpukit/include/rtems/score/todimpl.h
+++ b/cpukit/include/rtems/score/todimpl.h
@@ -18,6 +18,7 @@
 #ifndef _RTEMS_SCORE_TODIMPL_H
 #define _RTEMS_SCORE_TODIMPL_H
 
+#include <rtems/score/status.h>
 #include <rtems/score/timestamp.h>
 #include <rtems/score/timecounterimpl.h>
 #include <rtems/score/watchdog.h>
@@ -197,10 +198,10 @@ static inline void _TOD_Release( ISR_lock_Context *lock_context )
  *   _TOD_Acquire().  The caller must be the owner of the TOD lock.  This
  *   function will release the TOD lock.
  *
- * @retval true on success
- * @retval false on failure
+ * @retval STATUS_SUCCESSFUL Successful operation.
+ * @retval other Some error occurred.
  */
-bool _TOD_Set(
+Status_Control _TOD_Set(
   const struct timespec *tod,
   ISR_lock_Context      *lock_context
 );
@@ -370,7 +371,7 @@ typedef struct TOD_Hook {
   Chain_Node Node;
 
   /** This is the TOD action hook that is invoked. */
-  bool (*handler)(TOD_Action, const struct timespec *);
+  Status_Control ( *handler )( TOD_Action, const struct timespec * );
 } TOD_Hook;
 
 /**
@@ -384,9 +385,6 @@ extern Chain_Control _TOD_Hooks;
  * This method is used to add a hook to the TOD action set.
  *
  * @brief hook is the action hook to register.
- *
- * @retval true if the hook is added. 
- * @retval false if the hook cannot be added. 
  */
 void _TOD_Hook_Register(
   TOD_Hook *hook
@@ -398,9 +396,6 @@ void _TOD_Hook_Register(
  * This method is used to remove a hook from the TOD action set.
  *
  * @brief hook is the action hook to unregister.
- *
- * @retval true if the hook is unregister. 
- * @retval false if the hook cannot be unregister. 
  */
 void _TOD_Hook_Unregister(
   TOD_Hook *hook
@@ -411,13 +406,13 @@ void _TOD_Hook_Unregister(
  *
  * This method is used to invoke the set of TOD action hooks.
  *
- * @brief action is the action which triggered this run.
- * @brief tod is the current tod
+ * @brief action The action which triggered this run.
+ * @brief tod The current time of day.
  *
- * @retval true if the hooks can be run. 
- * @retval false if the hook cannot be run. 
+ * @retval STATUS_SUCCESSFUL Successful operation.
+ * @retval other Some error occurred.
  */
-bool _TOD_Hook_Run(
+Status_Control _TOD_Hook_Run(
   TOD_Action             action,
   const struct timespec *tod
 );
diff --git a/cpukit/posix/src/clocksettime.c b/cpukit/posix/src/clocksettime.c
index bfae46feee..5bb6f2f14b 100644
--- a/cpukit/posix/src/clocksettime.c
+++ b/cpukit/posix/src/clocksettime.c
@@ -32,7 +32,7 @@ int clock_settime(
   const struct timespec *tp
 )
 {
-  bool  retval;
+  Status_Control status;
 
   if ( !tp )
     rtems_set_errno_and_return_minus_one( EINVAL );
@@ -45,10 +45,11 @@ int clock_settime(
 
     _TOD_Lock();
     _TOD_Acquire( &lock_context );
-      retval = _TOD_Set( tp, &lock_context );
+      status = _TOD_Set( tp, &lock_context );
     _TOD_Unlock();
-    if ( retval == false ) {
-      rtems_set_errno_and_return_minus_one( EPERM );
+
+    if ( status != STATUS_SUCCESSFUL ) {
+      rtems_set_errno_and_return_minus_one( STATUS_GET_POSIX( status ) );
     }
   }
 #ifdef _POSIX_CPUTIME
diff --git a/cpukit/rtems/src/clockset.c b/cpukit/rtems/src/clockset.c
index a885fe1169..f60efb4c11 100644
--- a/cpukit/rtems/src/clockset.c
+++ b/cpukit/rtems/src/clockset.c
@@ -26,7 +26,7 @@ rtems_status_code rtems_clock_set(
   const rtems_time_of_day *tod
 )
 {
-  bool retval;
+  Status_Control status;
 
   if ( !tod )
     return RTEMS_INVALID_ADDRESS;
@@ -41,13 +41,10 @@ rtems_status_code rtems_clock_set(
 
     _TOD_Lock();
     _TOD_Acquire( &lock_context );
-    retval = _TOD_Set( &tod_as_timespec, &lock_context );
+    status = _TOD_Set( &tod_as_timespec, &lock_context );
     _TOD_Unlock();
 
-    if ( retval == true ) {
-      return RTEMS_SUCCESSFUL;
-    }
-    return RTEMS_IO_ERROR;
+    return STATUS_GET_CLASSIC( status );
   }
 
   return RTEMS_INVALID_CLOCK;
diff --git a/cpukit/score/src/coretodhookrun.c b/cpukit/score/src/coretodhookrun.c
index ae9cf66dfc..c0acc6e5fb 100644
--- a/cpukit/score/src/coretodhookrun.c
+++ b/cpukit/score/src/coretodhookrun.c
@@ -42,31 +42,35 @@
 #include <rtems/score/assert.h>
 #include <rtems/score/chainimpl.h>
 
-bool _TOD_Hook_Run(
+Status_Control _TOD_Hook_Run(
   TOD_Action             action,
   const struct timespec *tod
 )
 {
-  Chain_Node        *the_node;
-  bool               retval = true;
+  const Chain_Node *the_node;
+  Status_Control    status;
+
+  status = STATUS_SUCCESSFUL;
 
   /*
    * This is assumed to be called only from _TOD_Set() which is supposed
-   * to be called only while holding the TOD lock. 
+   * to be called only while holding the TOD lock.
    */
   _Assert( _TOD_Is_owner() );
 
-  for ( the_node = _Chain_First( &_TOD_Hooks );
-        !_Chain_Is_tail( &_TOD_Hooks, the_node ) ;
-        the_node = the_node->next ) {
-    TOD_Hook *the_hook = (TOD_Hook *) the_node;
- 
-    retval = (the_hook->handler)( action, tod );
-    if ( retval == false ) {
+  for (
+    the_node = _Chain_Immutable_first( &_TOD_Hooks );
+    !_Chain_Is_tail( &_TOD_Hooks, the_node );
+    the_node = _Chain_Immutable_next( the_node )
+  ) {
+    const TOD_Hook *the_hook;
+
+    the_hook = (const TOD_Hook *) the_node;
+    status = ( *the_hook->handler )( action, tod );
+    if ( status != STATUS_SUCCESSFUL ) {
       break;
     }
   }
 
-  return retval;
+  return status;
 }
-
diff --git a/cpukit/score/src/coretodset.c b/cpukit/score/src/coretodset.c
index 94ecd0b322..ed840ece2b 100644
--- a/cpukit/score/src/coretodset.c
+++ b/cpukit/score/src/coretodset.c
@@ -22,7 +22,7 @@
 #include <rtems/score/assert.h>
 #include <rtems/score/watchdogimpl.h>
 
-bool _TOD_Set(
+Status_Control _TOD_Set(
   const struct timespec *tod,
   ISR_lock_Context      *lock_context
 )
@@ -31,14 +31,14 @@ bool _TOD_Set(
   uint64_t        tod_as_ticks;
   uint32_t        cpu_max;
   uint32_t        cpu_index;
-  bool            retval;
+  Status_Control  status;
 
   _Assert( _TOD_Is_owner() );
 
-  retval = _TOD_Hook_Run( TOD_ACTION_SET_CLOCK, tod );
-  if ( retval == false ) {
+  status = _TOD_Hook_Run( TOD_ACTION_SET_CLOCK, tod );
+  if ( status != STATUS_SUCCESSFUL ) {
     _TOD_Release( lock_context );
-    return false;
+    return status;
   }
 
   timespec2bintime( tod, &tod_as_bintime );
@@ -75,5 +75,5 @@ bool _TOD_Set(
 
   _TOD.is_set = true;
 
-  return true;
+  return STATUS_SUCCESSFUL;
 }
diff --git a/testsuites/sptests/spclock_todhook01/init.c b/testsuites/sptests/spclock_todhook01/init.c
index 26f0ff9b48..78c7bd552a 100644
--- a/testsuites/sptests/spclock_todhook01/init.c
+++ b/testsuites/sptests/spclock_todhook01/init.c
@@ -78,7 +78,7 @@ static struct timespec tod_set;
 static bool hook1_executed;
 static bool hook2_executed;
 
-static bool tod_hook1(
+static Status_Control tod_hook1(
   TOD_Action             action,
   const struct timespec *tod
 )
@@ -90,10 +90,10 @@ static bool tod_hook1(
 
   hook1_executed = true;
 
-  return true;
+  return STATUS_SUCCESSFUL;
 }
 
-static bool tod_hook2(
+static Status_Control tod_hook2(
   TOD_Action             action,
   const struct timespec *tod
 )
@@ -105,7 +105,7 @@ static bool tod_hook2(
 
   hook2_executed = true;
 
-  return true;
+  return STATUS_SUCCESSFUL;
 }
 
 /*
@@ -219,7 +219,7 @@ static void do_positive_case(int i)
 
 static bool hook_error_executed;
 
-static bool tod_hook_error(
+static Status_Control tod_hook_error(
   TOD_Action             action,
   const struct timespec *tod
 )
@@ -231,7 +231,7 @@ static bool tod_hook_error(
 
   hook_error_executed = true;
 
-  return false;
+  return STATUS_NOT_OWNER;
 }
 /*
  * Execute one negative test case.
@@ -274,7 +274,7 @@ static void do_negative_case(bool use_posix)
       0
     );
     status = rtems_clock_set( &time );
-    rtems_test_assert( status == RTEMS_IO_ERROR );
+    rtems_test_assert( status == RTEMS_NOT_OWNER_OF_RESOURCE );
   } else {
     int rc;
 
-- 
2.16.4



More information about the devel mailing list