aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/libsupc++/atexit_thread.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libstdc++-v3/libsupc++/atexit_thread.cc')
-rw-r--r--libstdc++-v3/libsupc++/atexit_thread.cc19
1 files changed, 15 insertions, 4 deletions
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<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);
}