]> git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/30_threads/scoped_lock/cons/1.cc
Update copyright years.
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / 30_threads / scoped_lock / cons / 1.cc
1 // { dg-options "-std=gnu++17" }
2 // { dg-do run { target c++17 } }
3
4 // Copyright (C) 2017-2021 Free Software Foundation, Inc.
5 //
6 // This file is part of the GNU ISO C++ Library. This library is free
7 // software; you can redistribute it and/or modify it under the
8 // terms of the GNU General Public License as published by the
9 // Free Software Foundation; either version 3, or (at your option)
10 // any later version.
11
12 // This library is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
16
17 // You should have received a copy of the GNU General Public License along
18 // with this library; see the file COPYING3. If not see
19 // <http://www.gnu.org/licenses/>.
20
21
22 #include <mutex>
23 #include <testsuite_hooks.h>
24
25 struct BasicLockable
26 {
27 BasicLockable() : locked(false) { }
28
29 ~BasicLockable() noexcept(false)
30 {
31 if (locked)
32 throw 0;
33 }
34
35 void lock()
36 {
37 if (locked)
38 throw 0;
39 locked = true;
40 }
41
42 void unlock()
43 {
44 if (!locked)
45 throw 0;
46 locked = false;
47 }
48
49 bool locked;
50 };
51
52 template<int>
53 struct Lockable
54 {
55 BasicLockable m;
56 void lock() { m.lock(); }
57 void unlock() { m.unlock(); }
58 bool try_lock() { if (m.locked) return false; m.lock(); return true; }
59 };
60
61 void test01()
62 {
63 BasicLockable m;
64
65 try
66 {
67 std::scoped_lock<BasicLockable> l(m);
68 VERIFY( m.locked );
69 }
70 catch (...)
71 {
72 VERIFY( false );
73 }
74
75 VERIFY( !m.locked );
76
77 m.lock();
78
79 try
80 {
81 std::scoped_lock<BasicLockable> l(std::adopt_lock, m);
82 }
83 catch (...)
84 {
85 VERIFY( false );
86 }
87
88 VERIFY( !m.locked );
89 }
90
91 void test02()
92 {
93 Lockable<1> m1;
94 Lockable<2> m2;
95
96 try
97 {
98 std::scoped_lock<Lockable<1>, Lockable<2>> l(m1, m2);
99 VERIFY( m1.m.locked );
100 VERIFY( m2.m.locked );
101 }
102 catch (...)
103 {
104 VERIFY( false );
105 }
106
107 VERIFY( !m1.m.locked );
108 VERIFY( !m2.m.locked );
109
110 m1.lock();
111 m2.lock();
112
113 try
114 {
115 std::scoped_lock<Lockable<1>, Lockable<2>> l(std::adopt_lock, m1, m2);
116 VERIFY( m1.m.locked );
117 VERIFY( m2.m.locked );
118 }
119 catch (...)
120 {
121 VERIFY( false );
122 }
123
124 VERIFY( !m1.m.locked );
125 VERIFY( !m2.m.locked );
126 }
127
128 int main()
129 {
130 test01();
131 test02();
132 }