aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMomchil Velikov <velco@fadata.bg>2004-11-02 00:47:33 +0200
committerBenjamin Kosnik <bkoz@gcc.gnu.org>2004-11-01 22:47:33 +0000
commitc137586a8e9df47bb5e5f71b39ed410bb6cc56db (patch)
treed97be966b802fd08c57e5b35b1953e3a7ed54c9c
parentf759c75e09bbce8fe6ad809bc27b1e832a82d422 (diff)
downloadgcc-c137586a8e9df47bb5e5f71b39ed410bb6cc56db.zip
gcc-c137586a8e9df47bb5e5f71b39ed410bb6cc56db.tar.gz
gcc-c137586a8e9df47bb5e5f71b39ed410bb6cc56db.tar.bz2
re PR libstdc++/18185 ([3.4 only] Unhandled exceptions leak)
2004-11-01 Momchil Velikov <velco@fadata.bg> PR libstdc++/18185 * libsupc++/eh_globals.cc (get_globals_dtor): Delete unhandled exceptions. * testsuite/thread/18185.cc: New. From-SVN: r89962
-rw-r--r--libstdc++-v3/ChangeLog7
-rw-r--r--libstdc++-v3/libsupc++/eh_globals.cc12
-rw-r--r--libstdc++-v3/testsuite/thread/18185.cc53
3 files changed, 71 insertions, 1 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index a2af5a8..4e61672 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,10 @@
+2004-11-01 Momchil Velikov <velco@fadata.bg>
+
+ PR libstdc++/18185
+ * libsupc++/eh_globals.cc (get_globals_dtor): Delete unhandled
+ exceptions.
+ * testsuite/thread/18185.cc: New.
+
2004-11-01 Chris Jefferson <chris@bubblescope.net>
PR libstdc++/18159
diff --git a/libstdc++-v3/libsupc++/eh_globals.cc b/libstdc++-v3/libsupc++/eh_globals.cc
index b63fc1e..0f0dee5 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 0000000..5ea1db0
--- /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 <ext/new_allocator.h>
+#include <string>
+#include <pthread.h>
+
+static void *
+foo (void *p)
+{
+ typedef std::char_traits<char> traits_type;
+ typedef __gnu_cxx::new_allocator<char> allocator_type;
+ typedef std::basic_string<char, traits_type, allocator_type> 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;
+}