From 0318c367fcccd60cb24f418d13863dbd25d65a67 Mon Sep 17 00:00:00 2001 From: David Xu Date: Thu, 4 Sep 2003 05:24:53 +0000 Subject: [PATCH] Allow hooks registered by atexit() to run with current thread pointer set, without this change, my atexit test dumps core. --- lib/libkse/thread/thr_kern.c | 5 ++++- lib/libpthread/thread/thr_kern.c | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/libkse/thread/thr_kern.c b/lib/libkse/thread/thr_kern.c index f9a17a5c6745..5ed144ae232c 100644 --- a/lib/libkse/thread/thr_kern.c +++ b/lib/libkse/thread/thr_kern.c @@ -1246,7 +1246,6 @@ thr_cleanup(struct kse *curkse, struct pthread *thread) KSE_SCHED_UNLOCK(curkse, curkse->k_kseg); DBG_MSG("Adding thread %p to GC list\n", thread); KSE_LOCK_ACQUIRE(curkse, &_thread_list_lock); - THR_GCLIST_ADD(thread); /* Use thread_list_lock */ active_threads--; #ifdef SYSTEM_SCOPE_ONLY @@ -1255,8 +1254,12 @@ thr_cleanup(struct kse *curkse, struct pthread *thread) if (active_threads == 1) { #endif KSE_LOCK_RELEASE(curkse, &_thread_list_lock); + /* Possible use a signalcontext wrapper to call exit ? */ + curkse->k_curthread = thread; + _tcb_set(curkse->k_kcb, thread->tcb); exit(0); } + THR_GCLIST_ADD(thread); KSE_LOCK_RELEASE(curkse, &_thread_list_lock); if (sys_scope) { /* diff --git a/lib/libpthread/thread/thr_kern.c b/lib/libpthread/thread/thr_kern.c index f9a17a5c6745..5ed144ae232c 100644 --- a/lib/libpthread/thread/thr_kern.c +++ b/lib/libpthread/thread/thr_kern.c @@ -1246,7 +1246,6 @@ thr_cleanup(struct kse *curkse, struct pthread *thread) KSE_SCHED_UNLOCK(curkse, curkse->k_kseg); DBG_MSG("Adding thread %p to GC list\n", thread); KSE_LOCK_ACQUIRE(curkse, &_thread_list_lock); - THR_GCLIST_ADD(thread); /* Use thread_list_lock */ active_threads--; #ifdef SYSTEM_SCOPE_ONLY @@ -1255,8 +1254,12 @@ thr_cleanup(struct kse *curkse, struct pthread *thread) if (active_threads == 1) { #endif KSE_LOCK_RELEASE(curkse, &_thread_list_lock); + /* Possible use a signalcontext wrapper to call exit ? */ + curkse->k_curthread = thread; + _tcb_set(curkse->k_kcb, thread->tcb); exit(0); } + THR_GCLIST_ADD(thread); KSE_LOCK_RELEASE(curkse, &_thread_list_lock); if (sys_scope) { /*