aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2013-07-22 15:43:27 -0400
committerJason Merrill <jason@gcc.gnu.org>2013-07-22 15:43:27 -0400
commit16a1d8fe2955c301ae61a13c4cbf8bd2c83d17f0 (patch)
tree700a56f1839927ca984c08e54562bdacd88d23ea
parentfb4149396a6445e2cb9a16faa64c9b2231719955 (diff)
downloadgcc-16a1d8fe2955c301ae61a13c4cbf8bd2c83d17f0.zip
gcc-16a1d8fe2955c301ae61a13c4cbf8bd2c83d17f0.tar.gz
gcc-16a1d8fe2955c301ae61a13c4cbf8bd2c83d17f0.tar.bz2
re PR libstdc++/57914 (Memory leak in __cxa_thread_atexit when using thread_local)
PR libstdc++/57914 * libsupc++/atexit_thread.cc (run): Delete cleanup elts. From-SVN: r201146
-rw-r--r--libstdc++-v3/ChangeLog5
-rw-r--r--libstdc++-v3/libsupc++/atexit_thread.cc19
2 files changed, 20 insertions, 4 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index cd87d94..879fd61 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,8 @@
+2013-07-22 Jason Merrill <jason@redhat.com>
+
+ PR libstdc++/57914
+ * libsupc++/atexit_thread.cc (run): Delete cleanup elts.
+
2013-07-22 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/57920
diff --git a/libstdc++-v3/libsupc++/atexit_thread.cc b/libstdc++-v3/libsupc++/atexit_thread.cc
index 3b33df2..11f1dbd 100644
--- a/libstdc++-v3/libsupc++/atexit_thread.cc
+++ b/libstdc++-v3/libsupc++/atexit_thread.cc
@@ -58,8 +58,13 @@ namespace {
void run (void *p)
{
elt *e = static_cast<elt*>(p);
- for (; e; e = e->next)
- e->destructor (e->object);
+ while (e)
+ {
+ elt *old_e = e;
+ e->destructor (e->object);
+ e = e->next;
+ delete (old_e);
+ }
}
// Run the stack of cleanups for the current thread.
@@ -67,9 +72,15 @@ namespace {
{
void *e;
if (__gthread_active_p ())
- e = __gthread_getspecific (key);
+ {
+ e = __gthread_getspecific (key);
+ __gthread_setspecific (key, NULL);
+ }
else
- e = single_thread;
+ {
+ e = single_thread;
+ single_thread = NULL;
+ }
run (e);
}