[PATCH] score: Add and use rtems_assert_context

Sebastian Huber sebastian.huber at embedded-brains.de
Sun Jan 27 13:02:50 UTC 2013


---
 cpukit/libcsupport/src/__assert.c         |    9 ++++++++-
 cpukit/sapi/include/rtems/fatal.h         |   10 ++++++++++
 cpukit/score/include/rtems/score/interr.h |    4 +++-
 testsuites/sptests/spfatal10/testcase.h   |   23 +++++++++++++++++++----
 testsuites/sptests/spfatal_support/init.c |   13 ++++++++++++-
 5 files changed, 52 insertions(+), 7 deletions(-)

diff --git a/cpukit/libcsupport/src/__assert.c b/cpukit/libcsupport/src/__assert.c
index be0fa6c..d29ea0b 100644
--- a/cpukit/libcsupport/src/__assert.c
+++ b/cpukit/libcsupport/src/__assert.c
@@ -34,6 +34,13 @@ void __assert_func(
   const char *failedexpr
 )
 {
+  rtems_assert_context assert_context = {
+    .file = file,
+    .line = line,
+    .function = func,
+    .failed_expression = failedexpr
+  };
+
   printk("assertion \"%s\" failed: file \"%s\", line %d%s%s\n",
     failedexpr,
     file,
@@ -41,7 +48,7 @@ void __assert_func(
     (func) ? ", function: " : "",
     (func) ? func : ""
   );
-  rtems_fatal( RTEMS_FATAL_SOURCE_ASSERT, (rtems_fatal_code) func );
+  rtems_fatal( RTEMS_FATAL_SOURCE_ASSERT, (rtems_fatal_code) &assert_context );
 }
 #endif
 
diff --git a/cpukit/sapi/include/rtems/fatal.h b/cpukit/sapi/include/rtems/fatal.h
index 6623646..47bf74f 100644
--- a/cpukit/sapi/include/rtems/fatal.h
+++ b/cpukit/sapi/include/rtems/fatal.h
@@ -34,6 +34,16 @@ extern "C" {
 /**@{**/
 
 /**
+ * @brief Assert context.
+ */
+typedef struct {
+  const char *file;
+  int         line;
+  const char *function;
+  const char *failed_expression;
+} rtems_assert_context;
+
+/**
  * @brief Exception frame.
  */
 typedef CPU_Exception_frame rtems_exception_frame;
diff --git a/cpukit/score/include/rtems/score/interr.h b/cpukit/score/include/rtems/score/interr.h
index 2580c72..a047ca6 100644
--- a/cpukit/score/include/rtems/score/interr.h
+++ b/cpukit/score/include/rtems/score/interr.h
@@ -88,7 +88,9 @@ typedef enum {
   /**
    * @brief Fatal source of assert().
    *
-   * The fatal code is the pointer value of the function string.
+   * The fatal code is the pointer value of the assert context.
+   *
+   * @see rtems_assert_context.
    */
   RTEMS_FATAL_SOURCE_ASSERT,
 
diff --git a/testsuites/sptests/spfatal10/testcase.h b/testsuites/sptests/spfatal10/testcase.h
index 9af96d9..895a0c2 100644
--- a/testsuites/sptests/spfatal10/testcase.h
+++ b/testsuites/sptests/spfatal10/testcase.h
@@ -9,18 +9,33 @@
  */
 
 #include <assert.h>
-
-static const char func [] = "Init";
+#include <string.h>
 
 #define FATAL_ERROR_TEST_NAME            "10"
 #define FATAL_ERROR_DESCRIPTION          "asserting with non-NULL strings..."
 #define FATAL_ERROR_EXPECTED_SOURCE      RTEMS_FATAL_SOURCE_ASSERT
 #define FATAL_ERROR_EXPECTED_IS_INTERNAL FALSE
-#define FATAL_ERROR_EXPECTED_ERROR       ((rtems_fatal_code) func)
+#define FATAL_ERROR_EXPECTED_ERROR_CHECK spfatal10_is_expected_error
+
+#define ASSERT_FILE "testcase.h"
+#define ASSERT_LINE 38
+#define ASSERT_FUNC "Init"
+#define ASSERT_FEXP "forced"
+
+static inline bool spfatal10_is_expected_error( rtems_fatal_code error )
+{
+  const rtems_assert_context *assert_context =
+    (const rtems_assert_context *) error;
+
+  return strcmp( assert_context->file, ASSERT_FILE ) == 0
+    && assert_context->line == ASSERT_LINE
+    && strcmp( assert_context->function, ASSERT_FUNC ) == 0
+    && strcmp( assert_context->failed_expression, ASSERT_FEXP ) == 0;
+}
 
 void force_error()
 {
-  __assert_func( __FILE__, __LINE__, func, "forced" );
+  __assert_func( ASSERT_FILE, ASSERT_LINE, ASSERT_FUNC, ASSERT_FEXP );
 
   /* we will not run this far */
 }
diff --git a/testsuites/sptests/spfatal_support/init.c b/testsuites/sptests/spfatal_support/init.c
index eb7a167..216c766 100644
--- a/testsuites/sptests/spfatal_support/init.c
+++ b/testsuites/sptests/spfatal_support/init.c
@@ -80,6 +80,15 @@ void Put_Source( rtems_fatal_source source )
   printk( "%s", rtems_fatal_source_description( source ) );
 }
 
+static bool is_expected_error( rtems_fatal_code error )
+{
+#ifdef FATAL_ERROR_EXPECTED_ERROR
+  return error == FATAL_ERROR_EXPECTED_ERROR;
+#else /* FATAL_ERROR_EXPECTED_ERROR */
+  return FATAL_ERROR_EXPECTED_ERROR_CHECK( error );
+#endif /* FATAL_ERROR_EXPECTED_ERROR */
+}
+
 void Fatal_extension(
   rtems_fatal_source source,
   bool               is_internal,
@@ -109,6 +118,7 @@ void Fatal_extension(
       );
   }
 
+#ifdef FATAL_ERROR_EXPECTED_ERROR
   if ( error !=  FATAL_ERROR_EXPECTED_ERROR ) {
     printk( "ERROR==> Fatal Error Expected (");
     Put_Error( source, FATAL_ERROR_EXPECTED_ERROR );
@@ -116,11 +126,12 @@ void Fatal_extension(
     Put_Error( source, error );
     printk( ")\n" );
   }
+#endif /* FATAL_ERROR_EXPECTED_ERROR */
 
   if (
     source == FATAL_ERROR_EXPECTED_SOURCE
       && is_internal == FATAL_ERROR_EXPECTED_IS_INTERNAL
-      && error == FATAL_ERROR_EXPECTED_ERROR
+      && is_expected_error( error )
   ) {
     printk( "*** END OF TEST FATAL " FATAL_ERROR_TEST_NAME " ***\n" );
   }
-- 
1.7.10.4




More information about the devel mailing list