[PATCH v2 3/3] testsuite/rcxx01: Add examples for use in the User manual
Gedare Bloom
gedare at rtems.org
Fri Oct 9 03:45:45 UTC 2020
the set looks good to me. thanks for the the style adjustments
On Thu, Oct 8, 2020 at 5:52 PM <chrisj at rtems.org> wrote:
>
> From: Chris Johns <chrisj at rtems.org>
>
> ---
> spec/build/testsuites/libtests/rcxx01.yml | 3 +
> testsuites/libtests/rcxx01/init.c | 2 +-
> testsuites/libtests/rcxx01/thread.cpp | 21 +++-
> testsuites/libtests/rcxx01/user-example-1.cpp | 49 ++++++++
> testsuites/libtests/rcxx01/user-example-2.cpp | 68 +++++++++++
> testsuites/libtests/rcxx01/user-example-3.cpp | 113 ++++++++++++++++++
> 6 files changed, 251 insertions(+), 5 deletions(-)
> create mode 100644 testsuites/libtests/rcxx01/user-example-1.cpp
> create mode 100644 testsuites/libtests/rcxx01/user-example-2.cpp
> create mode 100644 testsuites/libtests/rcxx01/user-example-3.cpp
>
> diff --git a/spec/build/testsuites/libtests/rcxx01.yml b/spec/build/testsuites/libtests/rcxx01.yml
> index 864ad4d9d6..49bd9cff66 100644
> --- a/spec/build/testsuites/libtests/rcxx01.yml
> +++ b/spec/build/testsuites/libtests/rcxx01.yml
> @@ -13,6 +13,9 @@ links: []
> source:
> - testsuites/libtests/rcxx01/init.c
> - testsuites/libtests/rcxx01/thread.cpp
> +- testsuites/libtests/rcxx01/user-example-1.cpp
> +- testsuites/libtests/rcxx01/user-example-2.cpp
> +- testsuites/libtests/rcxx01/user-example-3.cpp
> stlib: []
> target: testsuites/libtests/rcxx01.exe
> type: build
> diff --git a/testsuites/libtests/rcxx01/init.c b/testsuites/libtests/rcxx01/init.c
> index 87d3155c7f..bea71d14c7 100644
> --- a/testsuites/libtests/rcxx01/init.c
> +++ b/testsuites/libtests/rcxx01/init.c
> @@ -72,7 +72,7 @@ rtems_task Init(
> #define CONFIGURE_MEMORY_OVERHEAD (2024)
>
> #define CONFIGURE_MAXIMUM_TASKS 1
> -#define CONFIGURE_MAXIMUM_POSIX_THREADS 2
> +#define CONFIGURE_MAXIMUM_POSIX_THREADS 5
>
> #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
>
> diff --git a/testsuites/libtests/rcxx01/thread.cpp b/testsuites/libtests/rcxx01/thread.cpp
> index 05a9de8c48..f977a340a9 100644
> --- a/testsuites/libtests/rcxx01/thread.cpp
> +++ b/testsuites/libtests/rcxx01/thread.cpp
> @@ -36,6 +36,10 @@ using namespace std::chrono_literals;
>
> extern "C" void rcxx_run_test(void);
>
> +void example_1();
> +void example_2();
> +void example_3();
> +
> struct test_thread
> {
> test_thread();
> @@ -96,13 +100,22 @@ bool test_thread::running()
> return finished == false;
> }
>
> +void test_1()
> +{
> + test_thread tt;
> + tt.start();
> + while (tt.running())
> + std::this_thread::sleep_for(1s);
> +}
> +
> void rcxx_run_test(void)
> {
> try {
> - test_thread tt;
> - tt.start();
> - while (tt.running())
> - std::this_thread::sleep_for(1s);
> + test_1();
> + /* From the user manual */
> + example_1();
> + example_2();
> + example_3();
> } catch (...) {
> std::cout << "Thread: ouch" << std::endl;
> throw;
> diff --git a/testsuites/libtests/rcxx01/user-example-1.cpp b/testsuites/libtests/rcxx01/user-example-1.cpp
> new file mode 100644
> index 0000000000..dfc0992193
> --- /dev/null
> +++ b/testsuites/libtests/rcxx01/user-example-1.cpp
> @@ -0,0 +1,49 @@
> +/* 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 <chrono>
> +#include <iostream>
> +
> +#include <rtems/thread.hpp>
> +
> +static void wait_for(size_t seconds)
> +{
> + while (seconds--) {
> + std::this_thread::sleep_for(std::chrono::seconds(1));
> + std::cout << "Seconds: " << seconds << std::endl;
> + }
> +}
> +
> +void example_1()
> +{
> + std::cout << "Start example 1" << std::endl;
> +
> + rtems::thread::thread t(wait_for, 5);
> + t.join();
> +
> + std::cout << "End example 1" << std::endl;
> +}
> diff --git a/testsuites/libtests/rcxx01/user-example-2.cpp b/testsuites/libtests/rcxx01/user-example-2.cpp
> new file mode 100644
> index 0000000000..05090fc73c
> --- /dev/null
> +++ b/testsuites/libtests/rcxx01/user-example-2.cpp
> @@ -0,0 +1,68 @@
> +/* 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 <chrono>
> +#include <iostream>
> +
> +#include <rtems/thread.hpp>
> +
> +static void wait_for(std::string me, size_t seconds, size_t announce)
> +{
> + size_t count = 0;
> + while (count < seconds) {
> + std::this_thread::sleep_for(std::chrono::seconds(1));
> + if ((count % announce) == 0)
> + std::cout << me << ": " << count << std::endl;
> + count++;
> + }
> +}
> +
> +void example_2()
> +{
> + std::cout << "Start example 2" << std::endl;
> +
> + rtems::thread::attributes attr;
> + attr.set_stack_size(16 * 1024);
> +
> + attr.set_priority(100);
> + attr.set_name("T1");
> + rtems::thread::thread t1(attr, wait_for, "T1", 10, 1);
> +
> + attr.set_priority(101);
> + attr.set_name("T2");
> + rtems::thread::thread t2(attr, wait_for, "T2", 10, 2);
> +
> + attr.set_priority(attr.get_priority());
> + attr.set_name("T3");
> + rtems::thread::thread t3(attr, wait_for, "T3", 15, 3);
> +
> + t1.join();
> + t2.join();
> + t3.join();
> +
> + std::cout << "End example 2" << std::endl;
> +}
> diff --git a/testsuites/libtests/rcxx01/user-example-3.cpp b/testsuites/libtests/rcxx01/user-example-3.cpp
> new file mode 100644
> index 0000000000..bdc6328bb3
> --- /dev/null
> +++ b/testsuites/libtests/rcxx01/user-example-3.cpp
> @@ -0,0 +1,113 @@
> +/* 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 <atomic>
> +#include <chrono>
> +#include <iostream>
> +#include <mutex>
> +
> +#include <rtems/thread.hpp>
> +
> +class ticker
> +{
> + public:
> + ticker(const size_t life_time);
> +
> + void run();
> + bool finished();
> +
> + size_t seconds();
> +
> + private:
> +
> + void timer();
> +
> + rtems::thread::thread tocker;
> + std::mutex lock;
> + std::atomic<bool> done;
> + bool running;
> + const size_t life_time;
> + std::atomic<size_t> the_seconds;
> +};
> +
> +ticker::ticker(const size_t life_time)
> + : done(false),
> + running(false),
> + life_time(life_time),
> + the_seconds(0)
> +{
> +}
> +
> +void ticker::run()
> +{
> + std::lock_guard<std::mutex> guard(lock);
> + if (!running) {
> + rtems::thread::attributes attr;
> + attr.set_name("CLCK");
> + attr.set_stack_size(8 * 1024);
> + attr.set_priority(10);
> + running = true;
> + tocker = rtems::thread::thread(attr, &ticker::timer, this);
> + }
> +}
> +
> +bool ticker::finished()
> +{
> + return done.load();
> +}
> +
> +size_t ticker::seconds()
> +{
> + return the_seconds.load();
> +}
> +
> +void ticker::timer()
> +{
> + while (the_seconds.load() < life_time) {
> + std::this_thread::sleep_for(std::chrono::seconds(1));
> + the_seconds++;
> + }
> + done = true;
> + std::lock_guard<std::mutex> guard(lock);
> + running = false;
> +}
> +
> +void example_3()
> +{
> + std::cout << "Start example 3" << std::endl;
> +
> + ticker my_ticker(10);
> +
> + my_ticker.run();
> +
> + while (!my_ticker.finished()) {
> + std::this_thread::sleep_for(std::chrono::seconds(2));
> + std::cout << "Ticker is " << my_ticker.seconds() << std::endl;
> + }
> +
> + std::cout << "End example 3" << std::endl;
> +}
> --
> 2.24.1
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
More information about the devel
mailing list