Commit 16a1d8fe by Jason Merrill Committed by Jason Merrill

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
parent fb414939
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> 2013-07-22 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/57920 PR c++/57920
......
...@@ -58,8 +58,13 @@ namespace { ...@@ -58,8 +58,13 @@ namespace {
void run (void *p) void run (void *p)
{ {
elt *e = static_cast<elt*>(p); elt *e = static_cast<elt*>(p);
for (; e; e = e->next) while (e)
e->destructor (e->object); {
elt *old_e = e;
e->destructor (e->object);
e = e->next;
delete (old_e);
}
} }
// Run the stack of cleanups for the current thread. // Run the stack of cleanups for the current thread.
...@@ -67,9 +72,15 @@ namespace { ...@@ -67,9 +72,15 @@ namespace {
{ {
void *e; void *e;
if (__gthread_active_p ()) if (__gthread_active_p ())
e = __gthread_getspecific (key); {
e = __gthread_getspecific (key);
__gthread_setspecific (key, NULL);
}
else else
e = single_thread; {
e = single_thread;
single_thread = NULL;
}
run (e); run (e);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment