From: bkoz Date: Mon, 1 Nov 2004 22:47:33 +0000 (+0000) Subject: 2004-11-01 Momchil Velikov X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=487c05b7371c92ee6b4cdf748e363bb03a46c08a 2004-11-01 Momchil Velikov PR libstdc++/18185 * libsupc++/eh_globals.cc (get_globals_dtor): Delete unhandled exceptions. * testsuite/thread/18185.cc: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@89962 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index a2af5a8b1ff..4e6167227ef 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2004-11-01 Momchil Velikov + + PR libstdc++/18185 + * libsupc++/eh_globals.cc (get_globals_dtor): Delete unhandled + exceptions. + * testsuite/thread/18185.cc: New. + 2004-11-01 Chris Jefferson PR libstdc++/18159 diff --git a/libstdc++-v3/libsupc++/eh_globals.cc b/libstdc++-v3/libsupc++/eh_globals.cc index b63fc1e8985..0f0dee58d45 100644 --- a/libstdc++-v3/libsupc++/eh_globals.cc +++ b/libstdc++-v3/libsupc++/eh_globals.cc @@ -48,7 +48,17 @@ static void get_globals_dtor (void *ptr) { if (ptr) - std::free (ptr); + { + __cxa_exception *exn, *next; + exn = ((__cxa_eh_globals *) ptr)->caughtExceptions; + while (exn) + { + next = exn->nextException; + _Unwind_DeleteException (&exn->unwindHeader); + exn = next; + } + std::free (ptr); + } } static void diff --git a/libstdc++-v3/testsuite/thread/18185.cc b/libstdc++-v3/testsuite/thread/18185.cc new file mode 100644 index 00000000000..5ea1db08526 --- /dev/null +++ b/libstdc++-v3/testsuite/thread/18185.cc @@ -0,0 +1,53 @@ +// +// Copyright (C) 2004 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING. If not, write to the Free +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +// { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* alpha*-*-osf* } } +// { dg-options "-pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* alpha*-*-osf* } } +// { dg-options "-pthreads" { target *-*-solaris* } } + +#include +#include +#include + +static void * +foo (void *p) +{ + typedef std::char_traits traits_type; + typedef __gnu_cxx::new_allocator allocator_type; + typedef std::basic_string string_type; + try + { + throw string_type("leak"); + } + catch (const string_type&) + { + pthread_exit (0); + } +} + +// c++/18185 +// This used to leak memory. +int +main () +{ + pthread_t t; + int j = pthread_create (&t, 0, foo, 0); + int i = pthread_join (t, 0); + return 0; +}