diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index cd87d948487..879fd617aeb 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,8 @@ +2013-07-22 Jason Merrill + + PR libstdc++/57914 + * libsupc++/atexit_thread.cc (run): Delete cleanup elts. + 2013-07-22 Paolo Carlini PR c++/57920 diff --git a/libstdc++-v3/libsupc++/atexit_thread.cc b/libstdc++-v3/libsupc++/atexit_thread.cc index 3b33df233e8..11f1dbdeac4 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(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); }