summaryrefslogtreecommitdiffstats
path: root/testsuites/sptests/sptls02
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-04-14 08:56:53 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-04-14 08:56:53 +0200
commit6efa3498504bffde166b4663319bd7d94ea42a08 (patch)
tree7b491ffe458f6570953b60b74ab6867742f734ee /testsuites/sptests/sptls02
parentbsp/qoriq: Fix MMU initialization for e6500 (diff)
downloadrtems-6efa3498504bffde166b4663319bd7d94ea42a08.tar.bz2
posix: Run key destructors during thread restart
POSIX key destructors must be called during thread restart. Just like the POSIX cleanup handlers. This ensures that the TLS object destructors are called during thread restart for example. It is important for the global construction, which uses a thread restart to run the Init task in a clean environment. Close #2689.
Diffstat (limited to 'testsuites/sptests/sptls02')
-rw-r--r--testsuites/sptests/sptls02/init.cc51
-rw-r--r--testsuites/sptests/sptls02/sptls02.scn2
2 files changed, 40 insertions, 13 deletions
diff --git a/testsuites/sptests/sptls02/init.cc b/testsuites/sptests/sptls02/init.cc
index b15e35856f..dc2e123c40 100644
--- a/testsuites/sptests/sptls02/init.cc
+++ b/testsuites/sptests/sptls02/init.cc
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014 embedded brains GmbH. All rights reserved.
+ * Copyright (c) 2014, 2016 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Dornierstr. 4
@@ -162,8 +162,24 @@ static void checkTLSValues()
static rtems_id masterTask;
-static void task(rtems_task_argument arg)
+static void wakeUpMaster()
{
+ rtems_status_code sc = rtems_event_transient_send(masterTask);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+}
+
+static void waitForWorker()
+{
+ rtems_status_code sc = rtems_event_transient_receive(
+ RTEMS_WAIT,
+ RTEMS_NO_TIMEOUT
+ );
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+}
+
+static void worker(rtems_task_argument arg)
+{
+ wakeUpMaster();
checkTLSValues();
const long gc = static_cast<long>(arg);
@@ -182,21 +198,20 @@ static void task(rtems_task_argument arg)
a2.clobber();
a3.clobber();
- rtems_status_code sc = rtems_event_transient_send(masterTask);
- rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+ wakeUpMaster();
- sc = rtems_task_suspend(RTEMS_SELF);
- rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+ (void) rtems_task_suspend(RTEMS_SELF);
+ rtems_test_assert(false);
}
-static void testTask()
+static void testWorkerTask()
{
checkTLSValues();
rtems_id id;
rtems_status_code sc = rtems_task_create(
rtems_build_name('T', 'A', 'S', 'K'),
- RTEMS_MINIMUM_PRIORITY,
+ 2,
RTEMS_MINIMUM_STACK_SIZE,
RTEMS_DEFAULT_MODES,
RTEMS_DEFAULT_ATTRIBUTES,
@@ -206,12 +221,24 @@ static void testTask()
const long gc = A::globalCounter();
- sc = rtems_task_start(id, task, gc);
+ sc = rtems_task_start(id, worker, gc);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
- sc = rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT);
+ waitForWorker();
+ rtems_test_assert(A::globalCounter() == gc);
+
+ waitForWorker();
+ rtems_test_assert(A::globalCounter() == gc + 3);
+
+ sc = rtems_task_restart(id, gc);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+ waitForWorker();
+ rtems_test_assert(A::globalCounter() == gc);
+
+ waitForWorker();
+ rtems_test_assert(A::globalCounter() == gc + 3);
+
sc = rtems_task_delete(id);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
@@ -232,12 +259,12 @@ extern "C" void Init(rtems_task_argument arg)
masterTask = rtems_task_self();
- testTask();
+ testWorkerTask();
rtems_resource_snapshot snapshot;
rtems_resource_snapshot_take(&snapshot);
- testTask();
+ testWorkerTask();
rtems_test_assert(rtems_resource_snapshot_check(&snapshot));
diff --git a/testsuites/sptests/sptls02/sptls02.scn b/testsuites/sptests/sptls02/sptls02.scn
index e4c92f5f36..01593d95af 100644
--- a/testsuites/sptests/sptls02/sptls02.scn
+++ b/testsuites/sptests/sptls02/sptls02.scn
@@ -1,4 +1,4 @@
-*** TEST SPTLS 2 ***
+*** BEGIN OF TEST SPTLS 2 ***
A::globalCounter() = 0
A::globalCounter() = 3
*** END OF TEST SPTLS 2 ***