Files
rtems/testsuites/sptests/spinternalerror02/init.c
Sebastian Huber 3f5f2ce229 score: PR788: Add INTERNAL_ERROR_RESOURCE_IN_USE
Issue a fatal error in case a thread is deleted which still owns
resources (e.g. a binary semaphore with priority inheritance or ceiling
protocol).  The resource count must be checked quite late since RTEMS
task variable destructors, POSIX key destructors, POSIX cleanup handler,
the Newlib thread termination extension or other thread termination
extensions may release resources.  In this context it would be quite
difficult to return an error status to the caller.

An alternative would be to place threads with a non-zero resource count
not on the zombie chain.  Thus we have a resource leak instead of a
fatal error.  The terminator thread can see this error if we return an
RTEMS_RESOURCE_IN_USE status for the rtems_task_delete() for example.
2014-04-03 11:13:25 +02:00

100 lines
2.0 KiB
C

/*
* Copyright (c) 2012-2014 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Donierstr. 4
* 82178 Puchheim
* Germany
* <rtems@embedded-brains.de>
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rtems.org/license/LICENSE.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "tmacros.h"
#include <rtems.h>
const char rtems_test_name[] = "SPINTERNALERROR 2";
static void test_internal_error_text(void)
{
rtems_fatal_code error = 0;
const char *text = NULL;
const char *text_last;
do {
text_last = text;
text = rtems_internal_error_text( error );
++error;
puts( text );
} while ( text != text_last );
rtems_test_assert( error - 3 == INTERNAL_ERROR_RESOURCE_IN_USE );
}
static void test_fatal_source_text(void)
{
rtems_fatal_source source = 0;
const char *text = NULL;
const char *text_last;
do {
text_last = text;
text = rtems_fatal_source_text( source );
++source;
puts( text );
} while ( text != text_last );
rtems_test_assert( source - 3 == RTEMS_FATAL_SOURCE_SMP );
}
static void test_status_text(void)
{
rtems_status_code code = 0;
const char *text = NULL;
const char *text_last;
do {
text_last = text;
text = rtems_status_text( code );
++code;
puts( text );
} while ( text != text_last );
rtems_test_assert( code - 3 == RTEMS_PROXY_BLOCKING );
}
static void Init(rtems_task_argument arg)
{
TEST_BEGIN();
test_internal_error_text();
test_fatal_source_text();
test_status_text();
TEST_END();
rtems_test_exit(0);
}
#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
#define CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM
#define CONFIGURE_MAXIMUM_TASKS 1
#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
#define CONFIGURE_INIT
#include <rtems/confdefs.h>