1// { dg-require-sharedlib "" }
2// { dg-options "-g -O2 -pthread -ldl" { target *-*-linux* } }
3
4// Copyright (C) 2004, 2005, 2009 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#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;
52  fn = reinterpret_cast<function_type>(dlsym(h, "try_allocation"));
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;
96  pthread_create(&th, NULL, tf, NULL);
97  pthread_join(th, NULL);
98  return 0;
99}
100