* src/vm/exceptions.c (exceptions_get_exception)
[cacao.git] / src / vm / finalizer.c
index b0ac3c91dbb6050b8aa9e3c92cc5bceda1cbccfe..4c77e4af29107bb8bcb201ea3fc19c95ff9ab2fd 100644 (file)
@@ -1,6 +1,6 @@
 /* src/vm/finalizer.c - finalizer linked list and thread
 
-   Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
+   Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
    C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
    E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
    J. Wenninger, Institut f. Computersprachen - TU Wien
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   Contact: cacao@cacaojvm.org
-
-   Authors: Christian Thalinger
-
-   Changes:
-
-   $Id: finalizer.c 4874 2006-05-05 14:36:18Z edwin $
+   $Id: finalizer.c 7831 2007-04-26 12:48:16Z twisti $
 
 */
 
 #include "vm/types.h"
 
 #include "mm/memory.h"
-#include "native/jni.h"
-#include "native/include/java_lang_Thread.h"
-#include "native/include/java_lang_VMThread.h"
+
+#include "threads/lock-common.h"
+#include "threads/threads-common.h"
+
 #include "vm/builtin.h"
 #include "vm/exceptions.h"
 #include "vm/global.h"
-#include "vm/options.h"
 #include "vm/stringlocal.h"
 #include "vm/vm.h"
+
 #include "vm/jit/asmpart.h"
 
+#include "vmcore/options.h"
+
 
 /* global variables ***********************************************************/
 
-#if defined(USE_THREADS)
-static java_lang_VMThread *finalizer_vmthread;
-static java_objectheader *lock_finalizer_thread;
+#if defined(ENABLE_THREADS)
+static java_objectheader *lock_thread_finalizer;
 #endif
 
 
@@ -68,12 +64,10 @@ static java_objectheader *lock_finalizer_thread;
 
 bool finalizer_init(void)
 {
-#if defined(USE_THREADS)
-       lock_finalizer_thread = NEW(java_objectheader);
+#if defined(ENABLE_THREADS)
+       lock_thread_finalizer = NEW(java_objectheader);
 
-# if defined(NATIVE_THREADS)
-       initObjectLock(lock_finalizer_thread);
-# endif
+       LOCK_INIT_OBJECT_LOCK(lock_thread_finalizer);
 #endif
 
        /* everything's ok */
@@ -90,21 +84,21 @@ bool finalizer_init(void)
 
 *******************************************************************************/
 
-#if defined(USE_THREADS)
+#if defined(ENABLE_THREADS)
 static void finalizer_thread(void)
 {
        while (true) {
                /* get the lock on the finalizer lock object, so we can call wait */
 
-               builtin_monitorenter(lock_finalizer_thread);
+               lock_monitor_enter(lock_thread_finalizer);
 
                /* wait forever (0, 0) on that object till we are signaled */
        
-               wait_cond_for_object(lock_finalizer_thread, 0, 0);
+               lock_wait_for_object(lock_thread_finalizer, 0, 0);
 
                /* leave the lock */
 
-               builtin_monitorexit(lock_finalizer_thread);
+               lock_monitor_exit(lock_thread_finalizer);
 
                /* and call the finalizers */
 
@@ -120,32 +114,16 @@ static void finalizer_thread(void)
 
 *******************************************************************************/
 
-#if defined(USE_THREADS)
+#if defined(ENABLE_THREADS)
 bool finalizer_start_thread(void)
 {
-       java_lang_Thread *t;
+       utf *name;
 
-       /* create the finalizer object */
+       name = utf_new_char("Finalizer");
 
-       finalizer_vmthread =
-               (java_lang_VMThread *) builtin_new(class_java_lang_VMThread);
-
-       if (!finalizer_vmthread)
+       if (!threads_thread_start_internal(name, finalizer_thread))
                return false;
 
-       t = (java_lang_Thread *) builtin_new(class_java_lang_Thread);
-
-       t->vmThread = finalizer_vmthread;
-       t->name     = javastring_new_from_ascii("Finalizer");
-       t->daemon   = true;
-       t->priority = 5;
-
-       finalizer_vmthread->thread = t;
-
-       /* actually start the finalizer thread */
-
-       threads_start_thread(t, finalizer_thread);
-
        /* everything's ok */
 
        return true;
@@ -162,18 +140,18 @@ bool finalizer_start_thread(void)
 
 void finalizer_notify(void)
 {
-#if defined(USE_THREADS)
+#if defined(ENABLE_THREADS)
        /* get the lock on the finalizer lock object, so we can call wait */
 
-       builtin_monitorenter(lock_finalizer_thread);
+       lock_monitor_enter(lock_thread_finalizer);
 
        /* signal the finalizer thread */
        
-       signal_cond_for_object(lock_finalizer_thread);
+       lock_notify_object(lock_thread_finalizer);
 
        /* leave the lock */
 
-       builtin_monitorexit(lock_finalizer_thread);
+       lock_monitor_exit(lock_thread_finalizer);
 #else
        /* if we don't have threads, just run the finalizers */
 
@@ -200,7 +178,7 @@ void finalizer_run(void *o, void *p)
 
        /* if we had an exception in the finalizer, ignore it */
 
-       *exceptionptr = NULL;
+       exceptions_clear_exception();
 }