summaryrefslogtreecommitdiffstats
path: root/lib/libc_r/uthread/uthread_init.c
diff options
context:
space:
mode:
authorjb <jb@FreeBSD.org>1998-09-30 06:36:56 +0000
committerjb <jb@FreeBSD.org>1998-09-30 06:36:56 +0000
commitdf42f1ac5f49d30528909286a925e0d7492bc337 (patch)
treef3bf279acabc8ce90e6bbf65e33a722b578cebfb /lib/libc_r/uthread/uthread_init.c
parentd76ace8cb5de85bc8d0e7bcd29ff688098b1de96 (diff)
downloadFreeBSD-src-df42f1ac5f49d30528909286a925e0d7492bc337.zip
FreeBSD-src-df42f1ac5f49d30528909286a925e0d7492bc337.tar.gz
Move the cleanup code that frees memory allocated for a dead thread from
the thread kernel into a garbage collector thread which is started when the fisrt thread is created (other than the initial thread). This removes the window of opportunity where a context switch will cause a thread that has locked the malloc spinlock, to enter the thread kernel, find there is a dead thread and try to free memory, therefore trying to lock the malloc spinlock against itself. The garbage collector thread acts just like any other thread, so instead of having a spinlock to control accesses to the dead thread list, it uses a mutex and a condition variable so that it can happily wait to be signalled when a thread exists.
Diffstat (limited to 'lib/libc_r/uthread/uthread_init.c')
-rw-r--r--lib/libc_r/uthread/uthread_init.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/lib/libc_r/uthread/uthread_init.c b/lib/libc_r/uthread/uthread_init.c
index 69b0fef..50f3bef 100644
--- a/lib/libc_r/uthread/uthread_init.c
+++ b/lib/libc_r/uthread/uthread_init.c
@@ -251,6 +251,11 @@ _thread_init(void)
__set_dynamic_handler_allocator( dynamic_allocator_handler_fn );
#endif /* GCC_2_8_MADE_THREAD_AWARE */
+ /* Initialise the garbage collector mutex and condition variable. */
+ if (pthread_mutex_init(&_gc_mutex,NULL) != 0 ||
+ pthread_cond_init(&_gc_cond,NULL) != 0)
+ PANIC("Failed to initialise garbage collector mutex or condvar");
+
return;
}
OpenPOWER on IntegriCloud