diff options
Diffstat (limited to 'libjava/gnu/gcj/runtime/natFinalizerThread.cc')
-rw-r--r-- | libjava/gnu/gcj/runtime/natFinalizerThread.cc | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/libjava/gnu/gcj/runtime/natFinalizerThread.cc b/libjava/gnu/gcj/runtime/natFinalizerThread.cc index d296bc40551..ec1846baf6a 100644 --- a/libjava/gnu/gcj/runtime/natFinalizerThread.cc +++ b/libjava/gnu/gcj/runtime/natFinalizerThread.cc @@ -1,6 +1,6 @@ // natFinalizerThread.cc - Implementation of FinalizerThread native methods. -/* Copyright (C) 2001 Free Software Foundation +/* Copyright (C) 2001, 2004 Free Software Foundation This file is part of libgcj. @@ -15,8 +15,48 @@ details. */ #include <gnu/gcj/runtime/FinalizerThread.h> +#include <java-threads.h> + +static _Jv_Mutex_t mutex; +static _Jv_ConditionVariable_t condition; + +// Initialize lock & condition variable. +void +gnu::gcj::runtime::FinalizerThread::init () +{ + _Jv_MutexInit (&mutex); + _Jv_CondInit (&condition); +} + +// This is called by the GC when a finalizer is ready to be +// run. It sets a flag and wakes up the finalizer thread. Note +// that this MUST NOT aquire any Java lock, as this could result in +// the hash synchronization code being re-entered: the synchronization +// code itself might need to allocate. See PR 16478. void -gnu::gcj::runtime::FinalizerThread::runFinalizers () +gnu::gcj::runtime::FinalizerThread::finalizerReady () { +#ifdef __JV_NO_THREADS__ _Jv_RunFinalizers (); +#else + _Jv_MutexLock (&mutex); + finalizer_ready = true; + _Jv_CondNotify (&condition, &mutex); + _Jv_MutexUnlock (&mutex); +#endif +} + +// Main loop for the finalizer thread. +void +gnu::gcj::runtime::FinalizerThread::run () +{ + while (true) + { + _Jv_MutexLock (&mutex); + if (! finalizer_ready) + _Jv_CondWait (&condition, &mutex, 0, 0); + finalizer_ready = false; + _Jv_MutexUnlock (&mutex); + _Jv_RunFinalizers (); + } } |