|  | // natFinalizerThread.cc - Implementation of FinalizerThread native methods. | 
|  |  | 
|  | /* Copyright (C) 2001, 2004  Free Software Foundation | 
|  |  | 
|  | This file is part of libgcj. | 
|  |  | 
|  | This software is copyrighted work licensed under the terms of the | 
|  | Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for | 
|  | details.  */ | 
|  |  | 
|  | #include <config.h> | 
|  |  | 
|  | #include <gcj/cni.h> | 
|  | #include <jvm.h> | 
|  |  | 
|  | #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::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 (); | 
|  | } | 
|  | } |