]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/testsuite/18_support/pthread_guard.cc
Update copyright years.
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / 18_support / pthread_guard.cc
CommitLineData
afd82ef5 1//
a5544970 2// Copyright (C) 2007-2019 Free Software Foundation, Inc.
afd82ef5
DK
3//
4// This file is part of the GNU ISO C++ Library. This library is free
5// software; you can redistribute it and/or modify it under the
6// terms of the GNU General Public License as published by the
748086b7 7// Free Software Foundation; either version 3, or (at your option)
afd82ef5
DK
8// any later version.
9//
10// This library is distributed in the hope that it will be useful,
11// but WITHOUT ANY WARRANTY; without even the implied warranty of
12// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13// GNU General Public License for more details.
14//
15// You should have received a copy of the GNU General Public License along
748086b7
JJ
16// with this library; see the file COPYING3. If not see
17// <http://www.gnu.org/licenses/>.
afd82ef5 18
d1236680
RO
19// { dg-do run }
20// { dg-options "-pthread" }
21// { dg-require-effective-target pthread }
afd82ef5
DK
22
23#include <cstdlib>
24#include <pthread.h>
25
26// This used to deadlock with the old libstdc++ because there is only one
27// global mutex guarding initialization of statics and it is held during by
28// the initializer thread of a static until the variable is completely
29// initialized. If the initializer thread creates and waits for another thread
30// which also initializes a static variable, there will be a deadlock because
31// the first thread is holding the mutex and waiting for the second thread,
32// which is blocked when it is acquiring the mutex.
33
34int
35get_bar (void)
36{
37 return 1;
38}
39
40void*
41do_something (void *arg)
42{
395c9e79 43 static int bar __attribute__((unused)) = get_bar ();
8fc81078 44 return 0;
afd82ef5
DK
45}
46
47int
48get_foo (void)
49{
afd82ef5
DK
50 pthread_t new_thread;
51
8fc81078 52 if (pthread_create (&new_thread, 0, do_something, 0) != 0)
afd82ef5
DK
53 std::abort ();
54
8fc81078 55 if (pthread_join (new_thread, 0) != 0)
afd82ef5
DK
56 std::abort ();
57
58 return 1;
59}
60
61int
62main (int argc, char **argv)
63{
395c9e79 64 static int foo __attribute__((unused)) = get_foo ();
afd82ef5
DK
65 return 0;
66}