summaryrefslogtreecommitdiffstats
path: root/testsuites/sptests/spfatal28
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2014-03-28 13:44:18 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2014-04-03 11:13:25 +0200
commit3f5f2ce22903c1e1f15fee75938b34987d894916 (patch)
treeb241a719942581e9e15226b380d027ae18f51b4d /testsuites/sptests/spfatal28
parentscore: Move __log2table to separate file (diff)
downloadrtems-3f5f2ce22903c1e1f15fee75938b34987d894916.tar.bz2
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.
Diffstat (limited to 'testsuites/sptests/spfatal28')
-rw-r--r--testsuites/sptests/spfatal28/Makefile.am19
-rw-r--r--testsuites/sptests/spfatal28/spfatal28.doc12
-rw-r--r--testsuites/sptests/spfatal28/spfatal28.scn3
-rw-r--r--testsuites/sptests/spfatal28/testcase.h39
4 files changed, 73 insertions, 0 deletions
diff --git a/testsuites/sptests/spfatal28/Makefile.am b/testsuites/sptests/spfatal28/Makefile.am
new file mode 100644
index 0000000000..a20d936f5f
--- /dev/null
+++ b/testsuites/sptests/spfatal28/Makefile.am
@@ -0,0 +1,19 @@
+rtems_tests_PROGRAMS = spfatal28
+spfatal28_SOURCES = ../spfatal_support/init.c ../spfatal_support/system.h testcase.h
+
+dist_rtems_tests_DATA = spfatal28.scn spfatal28.doc
+
+include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
+include $(top_srcdir)/../automake/compile.am
+include $(top_srcdir)/../automake/leaf.am
+
+AM_CPPFLAGS += -I$(top_srcdir)/../support/include
+
+LINK_OBJS = $(spfatal28_OBJECTS)
+LINK_LIBS = $(spfatal28_LDLIBS)
+
+spfatal28$(EXEEXT): $(spfatal28_OBJECTS) $(spfatal28_DEPENDENCIES)
+ @rm -f spfatal28$(EXEEXT)
+ $(make-exe)
+
+include $(top_srcdir)/../automake/local.am
diff --git a/testsuites/sptests/spfatal28/spfatal28.doc b/testsuites/sptests/spfatal28/spfatal28.doc
new file mode 100644
index 0000000000..7514dd9903
--- /dev/null
+++ b/testsuites/sptests/spfatal28/spfatal28.doc
@@ -0,0 +1,12 @@
+This file describes the directives and concepts tested by this test set.
+
+test set name: spfatal28
+
+directives:
+
+ - rtems_task_delete()
+
+concepts:
+
+ - Ensure that deletion of a task with a semaphore in use leads to a fatal
+ error.
diff --git a/testsuites/sptests/spfatal28/spfatal28.scn b/testsuites/sptests/spfatal28/spfatal28.scn
new file mode 100644
index 0000000000..6fcae10340
--- /dev/null
+++ b/testsuites/sptests/spfatal28/spfatal28.scn
@@ -0,0 +1,3 @@
+*** BEGIN OF TEST SPFATAL 28 ***
+Fatal error (delete a task with a semaphore in use) hit
+*** END OF TEST SPFATAL 28 ***
diff --git a/testsuites/sptests/spfatal28/testcase.h b/testsuites/sptests/spfatal28/testcase.h
new file mode 100644
index 0000000000..fc721003e2
--- /dev/null
+++ b/testsuites/sptests/spfatal28/testcase.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2014 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Dornierstr. 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.
+ */
+
+#define FATAL_ERROR_TEST_NAME "28"
+#define FATAL_ERROR_DESCRIPTION "delete a task with a semaphore in use"
+#define FATAL_ERROR_EXPECTED_SOURCE INTERNAL_ERROR_CORE
+#define FATAL_ERROR_EXPECTED_IS_INTERNAL FALSE
+#define FATAL_ERROR_EXPECTED_ERROR INTERNAL_ERROR_RESOURCE_IN_USE
+
+#define CONFIGURE_MAXIMUM_SEMAPHORES 1
+
+void force_error()
+{
+ rtems_status_code sc;
+ rtems_id id;
+
+ sc = rtems_semaphore_create(
+ rtems_build_name('S', 'E', 'M', 'A'),
+ 0,
+ RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY | RTEMS_INHERIT_PRIORITY,
+ 0,
+ &id
+ );
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ sc = rtems_task_delete(RTEMS_SELF);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+}