From cf95826089f36a42a69a1b12691e453428c0b2af Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Sat, 3 Oct 2020 16:13:24 +1000 Subject: cpukit/librcxx: Add a C++ thread interface with attributes --- testsuites/libtests/rcxx01/init.c | 89 +++++++++++++++++++++++++++ testsuites/libtests/rcxx01/rcxx01.doc | 16 +++++ testsuites/libtests/rcxx01/rcxx01.scn | 13 ++++ testsuites/libtests/rcxx01/thread.cpp | 110 ++++++++++++++++++++++++++++++++++ 4 files changed, 228 insertions(+) create mode 100644 testsuites/libtests/rcxx01/init.c create mode 100644 testsuites/libtests/rcxx01/rcxx01.doc create mode 100644 testsuites/libtests/rcxx01/rcxx01.scn create mode 100644 testsuites/libtests/rcxx01/thread.cpp (limited to 'testsuites/libtests') diff --git a/testsuites/libtests/rcxx01/init.c b/testsuites/libtests/rcxx01/init.c new file mode 100644 index 0000000000..87d3155c7f --- /dev/null +++ b/testsuites/libtests/rcxx01/init.c @@ -0,0 +1,89 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/* + * Copyright (C) 2020 Chris Johns (http://contemporary.software) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include "tmacros.h" + +const char rtems_test_name[] = "RCXX 1"; + +/* forward declarations to avoid warnings */ +rtems_task Init(rtems_task_argument argument); + +void rcxx_run_test(void); + +rtems_task Init( + rtems_task_argument ignored +) +{ + TEST_BEGIN(); + + rcxx_run_test(); + + TEST_END(); + rtems_test_exit( 0 ); +} + +/* configuration information */ + +#include + +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER + +#define CONFIGURE_MAXIMUM_FILE_DESCRIPTORS 5 + +#define CONFIGURE_MEMORY_OVERHEAD (2024) + +#define CONFIGURE_MAXIMUM_TASKS 1 +#define CONFIGURE_MAXIMUM_POSIX_THREADS 2 + +#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION + +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE + +#define CONFIGURE_INIT_TASK_STACK_SIZE (10U * 1024U) + +#define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_FLOATING_POINT + +#define CONFIGURE_INIT + +#include + +/* end of file */ diff --git a/testsuites/libtests/rcxx01/rcxx01.doc b/testsuites/libtests/rcxx01/rcxx01.doc new file mode 100644 index 0000000000..3fd41b029b --- /dev/null +++ b/testsuites/libtests/rcxx01/rcxx01.doc @@ -0,0 +1,16 @@ +# Copyright (c) 2019 Chris Johns +# + +This file describes the directives and concepts tested by this test set. + +test set name: rcxx01 + +directives: + + rtems::thread::thread + rtems::thread::attributes + +concepts: + ++ Create a thread using the default method, ie like std::thread. +* Create a thread with changed attributes. diff --git a/testsuites/libtests/rcxx01/rcxx01.scn b/testsuites/libtests/rcxx01/rcxx01.scn new file mode 100644 index 0000000000..37bf2d3f7a --- /dev/null +++ b/testsuites/libtests/rcxx01/rcxx01.scn @@ -0,0 +1,13 @@ +*** BEGIN OF TEST RCXX 1 *** +*** TEST VERSION: 5.0.0.7ba04a62227286dcd3da20ea7319d9c64b8f5fd1 +*** TEST STATE: EXPECTED-PASS +*** TEST BUILD: +*** TEST TOOLS: 7.5.0 20191114 (RTEMS 5, RSB ceb811fa19ddcfdd449a8da8f1107e6e592727b6, Newlib d14714c69) +Thread: start: default + 1 D +Thread: start: attr + 2 R +Thread: end: default +Thread: end: attr + +*** END OF TEST RCXX 1 *** diff --git a/testsuites/libtests/rcxx01/thread.cpp b/testsuites/libtests/rcxx01/thread.cpp new file mode 100644 index 0000000000..05a9de8c48 --- /dev/null +++ b/testsuites/libtests/rcxx01/thread.cpp @@ -0,0 +1,110 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/* + * Copyright (C) 2020 Chris Johns (http://contemporary.software) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include + +#include + +using namespace std::chrono_literals; + +extern "C" void rcxx_run_test(void); + +struct test_thread +{ + test_thread(); + + void start(); + bool running(); + void body(const char* title, int i, char c); + + rtems::thread::thread thread_default; + rtems::thread::thread thread_attr; + + std::mutex mutex; + + bool finished; +}; + +test_thread::test_thread() + : finished(false) +{ +} + +void test_thread::start() +{ + thread_default = rtems::thread::thread(&test_thread::body, this, + "default", 1, 'D'); + + rtems::thread::attributes attr; + + attr.set_name("RTHREAD"); + attr.set_priority(5); + attr.set_stack_size(32 * 1024); + + thread_attr = rtems::thread::thread(attr, &test_thread::body, this, + "attr", 2, 'R'); +} + +void test_thread::body(const char* title, int i, char c) +{ + std::cout << "Thread: start: " << title << std::endl + << ' ' << i << ' ' << c << std::endl; + + size_t count = 5; + + while (count--) { + std::this_thread::sleep_for(1s); + } + + std::cout << "Thread: end: " << title << std::endl; + + std::lock_guard lock(mutex); + + finished = true; +} + +bool test_thread::running() +{ + std::lock_guard lock(mutex); + return finished == false; +} + +void rcxx_run_test(void) +{ + try { + test_thread tt; + tt.start(); + while (tt.running()) + std::this_thread::sleep_for(1s); + } catch (...) { + std::cout << "Thread: ouch" << std::endl; + throw; + } +} -- cgit v1.2.3