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