[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