score: Add and use rtems_assert_context

This commit is contained in:
Sebastian Huber
2013-01-27 14:02:50 +01:00
parent 77ac5785b1
commit 68f36d144a
5 changed files with 52 additions and 7 deletions

View File

@@ -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

View File

@@ -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.
*/

View File

@@ -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,

View File

@@ -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 */
}

View File

@@ -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" );
}