]>
git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/30_threads/lock/4.cc
a12d6276284dfe4ac41dfd03a4c38d3dfa7fbc77
1 // { dg-do run { target *-*-freebsd* *-*-dragonfly* *-*-netbsd* *-*-linux* *-*-gnu* *-*-solaris* *-*-cygwin *-*-rtems* *-*-darwin* powerpc-ibm-aix* } }
2 // { dg-options "-pthread" { target *-*-freebsd* *-*-dragonfly* *-*-netbsd* *-*-linux* *-*-gnu* *-*-solaris* powerpc-ibm-aix* } }
3 // { dg-require-effective-target c++11 }
4 // { dg-require-cstdint "" }
5 // { dg-require-gthreads "" }
7 // Copyright (C) 2010-2016 Free Software Foundation, Inc.
9 // This file is part of the GNU ISO C++ Library. This library is free
10 // software; you can redistribute it and/or modify it under the
11 // terms of the GNU General Public License as published by the
12 // Free Software Foundation; either version 3, or (at your option)
15 // This library is distributed in the hope that it will be useful,
16 // but WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 // GNU General Public License for more details.
20 // You should have received a copy of the GNU General Public License along
21 // with this library; see the file COPYING3. If not see
22 // <http://www.gnu.org/licenses/>.
26 #include <testsuite_hooks.h>
28 struct unreliable_lock
31 std::unique_lock
<std::mutex
> l
;
37 unreliable_lock() : l(m
, std::defer_lock
) { }
41 bool test
__attribute__((unused
)) = true;
42 VERIFY( !l
.owns_lock() );
47 if (count
== throw_on
)
54 if (count
== throw_on
)
56 std::unique_lock
<std::mutex
> l2(m
, std::defer_lock
);
65 bool test
__attribute__((unused
)) = true;
66 VERIFY( l
.owns_lock() );
72 int unreliable_lock::count
= 0;
73 int unreliable_lock::throw_on
= -1;
74 int unreliable_lock::lock_on
= -1;
78 bool test
__attribute__((unused
)) = true;
80 unreliable_lock l1
, l2
, l3
;
84 unreliable_lock::count
= 0;
85 std::lock(l1
, l2
, l3
);
86 VERIFY( unreliable_lock::count
== 3 );
99 bool test
__attribute__((unused
)) = true;
101 // test behaviour when a lock is already held
104 unreliable_lock::lock_on
= 1;
105 while (unreliable_lock::lock_on
< 3)
107 unreliable_lock::count
= 0;
108 unreliable_lock l1
, l2
, l3
;
109 std::lock(l1
, l2
, l3
);
110 VERIFY( unreliable_lock::count
> 3 );
114 ++unreliable_lock::lock_on
;
125 // test behaviour when an exception is thrown
126 unreliable_lock::throw_on
= 0;
127 while (unreliable_lock::throw_on
< 3)
129 unreliable_lock::count
= 0;
130 unreliable_lock l1
, l2
, l3
;
134 std::lock(l1
, l2
, l3
);
141 ++unreliable_lock::throw_on
;