Fix addvdi3 and subvdi3 patterns
[official-gcc.git] / libstdc++-v3 / testsuite / 30_threads / semaphore / try_acquire_until.cc
bloba75be177771d7d5cc2fe99078683e846a51daac3
1 // Copyright (C) 2020-2022 Free Software Foundation, Inc.
2 //
3 // This file is part of the GNU ISO C++ Library. This library is free
4 // software; you can redistribute it and/or modify it under the
5 // terms of the GNU General Public License as published by the
6 // Free Software Foundation; either version 3, or (at your option)
7 // any later version.
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License along
15 // with this library; see the file COPYING3. If not see
16 // <http://www.gnu.org/licenses/>.
18 // { dg-options "-std=gnu++2a" }
19 // { dg-do run { target c++2a } }
20 // { dg-require-gthreads "" }
21 // { dg-additional-options "-pthread" { target pthread } }
22 // { dg-add-options libatomic }
24 #include <semaphore>
25 #include <chrono>
26 #include <thread>
27 #include <atomic>
28 #include <testsuite_hooks.h>
30 void test01()
32 using namespace std::chrono_literals;
33 std::counting_semaphore<10> s(2);
34 s.acquire();
36 auto const dur = 250ms;
38 auto const at = std::chrono::system_clock::now() + dur;
39 auto const t0 = std::chrono::steady_clock::now();
40 VERIFY( s.try_acquire_until(at) );
41 auto const diff = std::chrono::steady_clock::now() - t0;
42 VERIFY( diff < dur );
46 auto const at = std::chrono::system_clock::now() + dur;
47 auto const t0 = std::chrono::steady_clock::now();
48 VERIFY( !s.try_acquire_until(at) );
49 auto const diff = std::chrono::steady_clock::now() - t0;
50 VERIFY( diff >= dur );
54 void test02()
56 using namespace std::chrono_literals;
57 std::binary_semaphore s(1);
58 std::atomic<int> a(0), b(0);
59 std::thread t([&] {
60 a.wait(0);
61 auto const dur = 250ms;
63 auto const at = std::chrono::system_clock::now() + dur;
64 VERIFY( !s.try_acquire_until(at) );
66 b++;
67 b.notify_one();
70 a.wait(1);
72 auto const at = std::chrono::system_clock::now() + dur;
73 VERIFY( s.try_acquire_until(at) );
75 b++;
76 b.notify_one();
77 });
78 t.detach();
80 s.acquire();
81 a++;
82 a.notify_one();
83 b.wait(0);
84 s.release();
85 a++;
86 a.notify_one();
88 b.wait(1);
91 int main()
93 test01();
94 test02();