source: rtems/testsuites/sptests/spcxx01/init.cc

Last change on this file was e4ad14cc, checked in by Sebastian Huber <sebastian.huber@…>, on Feb 12, 2019 at 11:19:38 AM

score: Avoid some deadlocks in _Once()

Recursive usage of the same pthread_once_t results now in a deadlock.
Previously, an error of EINVAL was returned. This usage scenario is
invalid according to the POSIX pthread_once() specification.

Close #3334.

  • Property mode set to 100644
File size: 2.6 KB
Line 
1/*
2 * SPDX-License-Identifier: BSD-2-Clause
3 *
4 * Copyright (C) 2018 embedded brains GmbH
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 * POSSIBILITY OF SUCH DAMAGE.
26 */
27
28#ifdef HAVE_CONFIG_H
29#include "config.h"
30#endif
31
32#include <future>
33#include <new>
34
35#include <rtems.h>
36
37#include <tmacros.h>
38
39const char rtems_test_name[] = "SPCXX 1";
40
41struct alignas(256) S {
42  int i;
43};
44
45static void test_aligned_new(void)
46{
47  int *i = static_cast<decltype(i)>(
48    ::operator new(sizeof(*i), std::align_val_t(256))
49  );
50  RTEMS_OBFUSCATE_VARIABLE(i);
51  rtems_test_assert(i != nullptr);
52  rtems_test_assert(reinterpret_cast<uintptr_t>(i) % 256 == 0);
53  ::delete(i);
54
55  S *s = new S;
56  RTEMS_OBFUSCATE_VARIABLE(s);
57  rtems_test_assert(s != nullptr);
58  rtems_test_assert(reinterpret_cast<uintptr_t>(s) % 256 == 0);
59  delete s;
60}
61
62static void test_future(void)
63{
64  std::future<int> f = std::async(std::launch::async, []{ return 12358; });
65  rtems_test_assert(f.get() == 12358);
66}
67
68extern "C" void Init(rtems_task_argument arg)
69{
70  TEST_BEGIN();
71
72  test_aligned_new();
73  test_future();
74
75  TEST_END();
76  exit(0);
77}
78
79#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
80
81#define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
82
83#define CONFIGURE_MAXIMUM_TASKS 1
84
85#define CONFIGURE_MAXIMUM_POSIX_THREADS 1
86
87#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
88
89#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
90
91#define CONFIGURE_INIT
92
93#include <rtems/confdefs.h>
Note: See TracBrowser for help on using the repository browser.