From 6efa3498504bffde166b4663319bd7d94ea42a08 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Thu, 14 Apr 2016 08:56:53 +0200 Subject: 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. --- testsuites/sptests/sptls02/init.cc | 51 ++++++++++++++++++++++++++-------- testsuites/sptests/sptls02/sptls02.scn | 2 +- 2 files changed, 40 insertions(+), 13 deletions(-) (limited to 'testsuites/sptests/sptls02') 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(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 *** -- cgit v1.2.3