2001-10-11 00:25:43 +02:00
|
|
|
// natFinalizerThread.cc - Implementation of FinalizerThread native methods.
|
|
|
|
|
2004-07-11 23:19:47 +02:00
|
|
|
/* Copyright (C) 2001, 2004 Free Software Foundation
|
2001-10-11 00:25:43 +02:00
|
|
|
|
|
|
|
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>
|
|
|
|
|
2004-07-11 23:19:47 +02:00
|
|
|
#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.
|
2001-10-11 00:25:43 +02:00
|
|
|
void
|
2004-07-11 23:19:47 +02:00
|
|
|
gnu::gcj::runtime::FinalizerThread::finalizerReady ()
|
2001-10-11 00:25:43 +02:00
|
|
|
{
|
2004-07-11 23:19:47 +02:00
|
|
|
#ifdef __JV_NO_THREADS__
|
2001-10-11 00:25:43 +02:00
|
|
|
_Jv_RunFinalizers ();
|
2004-07-11 23:19:47 +02:00
|
|
|
#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 ();
|
|
|
|
}
|
2001-10-11 00:25:43 +02:00
|
|
|
}
|