Explicitly link with libatomic when needed.
[official-gcc.git] / libstdc++-v3 / testsuite / 30_threads / stop_token / stop_callback / deadlock-mt.cc
blob96f7197c3da917116a88f9071a37e196955722c5
1 // Copyright (C) 2020 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 -pthread" }
19 // { dg-add-options libatomic }
20 // { dg-require-effective-target c++2a }
21 // { dg-require-effective-target pthread }
22 // { dg-require-gthreads "" }
24 #include <stop_token>
25 #include <memory>
26 #include <testsuite_hooks.h>
28 void
29 test01()
31 std::stop_source ssrc;
32 std::stop_token stok = ssrc.get_token();
33 using F = void(*)();
34 std::unique_ptr<std::stop_callback<F>> pcb;
35 auto dereg = [&pcb] { pcb.reset(); };
36 std::stop_callback cb1(stok, dereg);
37 pcb = std::make_unique<std::stop_callback<F>>(stok, []{});
38 std::stop_callback cb2(stok, dereg);
40 // PR libstdc++/92895
41 // Making a stop request runs the callbacks. Whichever of cb1 and cb2
42 // runs first will destroy *pcb, which will try to unregister it.
43 // This recursive access to the shared stop state within a callback must
44 // work without deadlock.
45 ssrc.request_stop();
48 int main()
50 test01();