1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// UNSUPPORTED: no-threads
10// ALLOW_RETRIES: 2
11
12// <condition_variable>
13
14// class condition_variable_any;
15
16// void notify_one();
17
18#include <condition_variable>
19#include <mutex>
20#include <thread>
21#include <cassert>
22
23#include "make_test_thread.h"
24#include "test_macros.h"
25
26std::condition_variable_any cv;
27
28typedef std::timed_mutex L0;
29typedef std::unique_lock<L0> L1;
30
31L0 m0;
32
33int test0 = 0;
34int test1 = 0;
35int test2 = 0;
36
37void f1()
38{
39 L1 lk(m0);
40 assert(test1 == 0);
41 while (test1 == 0)
42 cv.wait(lock&: lk);
43 assert(test1 == 1);
44 test1 = 2;
45}
46
47void f2()
48{
49 L1 lk(m0);
50 assert(test2 == 0);
51 while (test2 == 0)
52 cv.wait(lock&: lk);
53 assert(test2 == 1);
54 test2 = 2;
55}
56
57int main(int, char**)
58{
59 std::thread t1 = support::make_test_thread(f1);
60 std::thread t2 = support::make_test_thread(f2);
61 std::this_thread::sleep_for(rtime: std::chrono::milliseconds(100));
62 {
63 L1 lk(m0);
64 test1 = 1;
65 test2 = 1;
66 }
67 cv.notify_one();
68 {
69 std::this_thread::sleep_for(rtime: std::chrono::milliseconds(100));
70 L1 lk(m0);
71 }
72 if (test1 == 2)
73 {
74 t1.join();
75 test1 = 0;
76 }
77 else if (test2 == 2)
78 {
79 t2.join();
80 test2 = 0;
81 }
82 else
83 assert(false);
84 cv.notify_one();
85 {
86 std::this_thread::sleep_for(rtime: std::chrono::milliseconds(100));
87 L1 lk(m0);
88 }
89 if (test1 == 2)
90 {
91 t1.join();
92 test1 = 0;
93 }
94 else if (test2 == 2)
95 {
96 t2.join();
97 test2 = 0;
98 }
99 else
100 assert(false);
101
102 return 0;
103}
104

source code of libcxx/test/std/thread/thread.condition/thread.condition.condvarany/notify_one.pass.cpp