]> git.ipfire.org Git - people/ms/gcc.git/blame - libstdc++-v3/testsuite/ext/mt_allocator/22309_thread.cc
Update copyright years.
[people/ms/gcc.git] / libstdc++-v3 / testsuite / ext / mt_allocator / 22309_thread.cc
CommitLineData
2f9f6cef 1// { dg-require-sharedlib "" }
9275f73a 2// { dg-options "-g -O2 -pthread -ldl" { target *-*-linux* *-*-gnu* } }
2f9f6cef 3
7adcbafe 4// Copyright (C) 2004-2022 Free Software Foundation, Inc.
2f9f6cef
BK
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
748086b7 9// Free Software Foundation; either version 3, or (at your option)
2f9f6cef
BK
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
748086b7
JJ
18// with this library; see the file COPYING3. If not see
19// <http://www.gnu.org/licenses/>.
2f9f6cef
BK
20
21#include <dlfcn.h>
22#include <pthread.h>
23#include <cstdlib>
24#include <stdexcept>
25
26void
27check_dlopen(void*& h)
28{
29 dlerror();
30 void* tmp = dlopen("./testsuite_shared.so", RTLD_LAZY);
31 if (!tmp)
32 {
33 try
34 {
35 // Throws std::logic_error on NULL string.
36 std::string error(dlerror());
37 throw std::runtime_error(error);
38 }
39 catch (const std::logic_error&)
40 { }
41 }
42 h = tmp;
43}
44
45void
46check_dlsym(void*& h)
47{
48 dlerror();
49
50 typedef void (*function_type) (void);
51 function_type fn;
cddfb1c7 52 fn = reinterpret_cast<function_type>(dlsym(h, "try_allocation"));
2f9f6cef
BK
53
54 try
55 {
56 std::string error(dlerror());
57 throw std::runtime_error(error);
58 }
59 catch (const std::logic_error&)
60 { }
61
62 fn();
63}
64
65void
66check_dlclose(void*& h)
67{
68 dlerror();
69 if (dlclose(h) != 0)
70 {
71 try
72 {
73 std::string error(dlerror());
74 throw std::runtime_error(error);
75 }
76 catch (const std::logic_error&)
77 { }
78 }
79}
80
81void*
82tf(void* arg)
83{
84 void* h;
85 check_dlopen(h);
86 check_dlsym(h);
87 check_dlclose(h);
88 return 0;
89}
90
91// libstdc++/22309
92int
93main (void)
94{
95 pthread_t th;
8fc81078
PC
96 pthread_create(&th, 0, tf, 0);
97 pthread_join(th, 0);
2f9f6cef
BK
98 return 0;
99}