From 68f36d144adfa1294f026bdf2d348c22365543fc Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Sun, 27 Jan 2013 14:02:50 +0100 Subject: score: Add and use rtems_assert_context --- 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 be0fa6c2e9..d29ea0b7e0 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 66236462d8..47bf74f279 100644 --- a/cpukit/sapi/include/rtems/fatal.h +++ b/cpukit/sapi/include/rtems/fatal.h @@ -33,6 +33,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. */ diff --git a/cpukit/score/include/rtems/score/interr.h b/cpukit/score/include/rtems/score/interr.h index 2580c72253..a047ca6766 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 9af96d9637..895a0c21e5 100644 --- a/testsuites/sptests/spfatal10/testcase.h +++ b/testsuites/sptests/spfatal10/testcase.h @@ -9,18 +9,33 @@ */ #include - -static const char func [] = "Init"; +#include #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 eb7a167361..216c766b91 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" ); } -- cgit v1.2.3