From ac631c42adf26cee868135fc74401039099fe5ee Mon Sep 17 00:00:00 2001 From: Stefan Ring Date: Mon, 18 Apr 2011 22:26:41 +0200 Subject: [PATCH] * src/threads/thread.cpp: Break a reference cycle. * src/threads/thread-classpath.cpp, src/threads/thread-classpath.hpp, src/threads/thread-cldc11.cpp, src/threads/thread-cldc11.hpp, src/threads/thread-openjdk.cpp, src/threads/thread-openjdk.hpp (clear_heap_reference): Added. * src/vm/javaobjects.cpp, src/vm/javaobjects.hpp [OpenJDK]: Added accessors for "me" field. --- src/threads/thread-classpath.cpp | 5 +++++ src/threads/thread-classpath.hpp | 1 + src/threads/thread-cldc11.cpp | 5 +++++ src/threads/thread-cldc11.hpp | 1 + src/threads/thread-openjdk.cpp | 5 +++++ src/threads/thread-openjdk.hpp | 1 + src/threads/thread.cpp | 4 ++++ src/vm/javaobjects.cpp | 4 +++- src/vm/javaobjects.hpp | 8 ++++++++ 9 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/threads/thread-classpath.cpp b/src/threads/thread-classpath.cpp index eae414a30..166052c9a 100644 --- a/src/threads/thread-classpath.cpp +++ b/src/threads/thread-classpath.cpp @@ -156,6 +156,11 @@ bool ThreadRuntimeClasspath::invoke_thread_initializer(java_lang_Thread& jlt, th return true; } +void ThreadRuntimeClasspath::clear_heap_reference(java_lang_Thread& jlt) +{ + // Nothing to do. +} + #endif /* ENABLE_THREADS && WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH */ diff --git a/src/threads/thread-classpath.hpp b/src/threads/thread-classpath.hpp index fa6f804cd..eb7862a24 100644 --- a/src/threads/thread-classpath.hpp +++ b/src/threads/thread-classpath.hpp @@ -57,6 +57,7 @@ struct ThreadRuntimeClasspath { static threadobject *get_threadobject_from_thread(java_handle_t *h); static void thread_create_initial_threadgroups(java_handle_t **threadgroup_system, java_handle_t **threadgroup_main); static bool invoke_thread_initializer(java_lang_Thread& jlt, threadobject *t, methodinfo *thread_method_init, java_handle_t *name, java_handle_t *group); + static void clear_heap_reference(java_lang_Thread& jlt); }; typedef ThreadRuntimeClasspath ThreadRuntime; diff --git a/src/threads/thread-cldc11.cpp b/src/threads/thread-cldc11.cpp index 4af35f407..d1d9a4c3e 100644 --- a/src/threads/thread-cldc11.cpp +++ b/src/threads/thread-cldc11.cpp @@ -99,6 +99,11 @@ bool ThreadRuntimeCldc11::invoke_thread_initializer(java_lang_Thread& jlt, threa return false; } +void ThreadRuntimeOpenjdk::clear_heap_reference(java_lang_Thread& jlt) +{ + // Nothing to do. +} + #endif /* ENABLE_THREADS && WITH_JAVA_RUNTIME_LIBRARY_OPENJDK */ diff --git a/src/threads/thread-cldc11.hpp b/src/threads/thread-cldc11.hpp index 3854c9229..8d66657c4 100644 --- a/src/threads/thread-cldc11.hpp +++ b/src/threads/thread-cldc11.hpp @@ -57,6 +57,7 @@ struct ThreadRuntimeCldc11 { static threadobject *get_threadobject_from_thread(java_handle_t *h); static void thread_create_initial_threadgroups(java_handle_t **threadgroup_system, java_handle_t **threadgroup_main); static bool invoke_thread_initializer(java_lang_Thread& jlt, threadobject *t, methodinfo *thread_method_init, java_handle_t *name, java_handle_t *group); + static void clear_heap_reference(java_lang_Thread& jlt); }; typedef ThreadRuntimeCldc11 ThreadRuntime; diff --git a/src/threads/thread-openjdk.cpp b/src/threads/thread-openjdk.cpp index fecda2fc2..e274b30b4 100644 --- a/src/threads/thread-openjdk.cpp +++ b/src/threads/thread-openjdk.cpp @@ -152,6 +152,11 @@ bool ThreadRuntimeOpenjdk::invoke_thread_initializer(java_lang_Thread& jlt, thre return true; } +void ThreadRuntimeOpenjdk::clear_heap_reference(java_lang_Thread& jlt) +{ + jlt.set_me(0); +} + #endif /* ENABLE_THREADS && WITH_JAVA_RUNTIME_LIBRARY_OPENJDK */ diff --git a/src/threads/thread-openjdk.hpp b/src/threads/thread-openjdk.hpp index be008819d..c65eef5b5 100644 --- a/src/threads/thread-openjdk.hpp +++ b/src/threads/thread-openjdk.hpp @@ -57,6 +57,7 @@ struct ThreadRuntimeOpenjdk { static threadobject *get_threadobject_from_thread(java_handle_t *h); static void thread_create_initial_threadgroups(java_handle_t **threadgroup_system, java_handle_t **threadgroup_main); static bool invoke_thread_initializer(java_lang_Thread& jlt, threadobject *t, methodinfo *thread_method_init, java_handle_t *name, java_handle_t *group); + static void clear_heap_reference(java_lang_Thread& jlt); }; typedef ThreadRuntimeOpenjdk ThreadRuntime; diff --git a/src/threads/thread.cpp b/src/threads/thread.cpp index ab0e05e2f..b111ca90f 100644 --- a/src/threads/thread.cpp +++ b/src/threads/thread.cpp @@ -369,6 +369,10 @@ static threadobject *thread_new(int32_t flags) void thread_free(threadobject *t) { + java_handle_t *h = LLNI_WRAP(t->object); + java_lang_Thread jlt(h); + ThreadRuntime::clear_heap_reference(jlt); + /* Set the reference to the Java object to NULL. */ t->object = 0; diff --git a/src/vm/javaobjects.cpp b/src/vm/javaobjects.cpp index 0aa5af11f..cb862ee2c 100644 --- a/src/vm/javaobjects.cpp +++ b/src/vm/javaobjects.cpp @@ -1,6 +1,6 @@ /* src/vm/javaobjects.cpp - functions to create and access Java objects - Copyright (C) 2010, 2011 + Copyright (C) 1996-2011 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO Copyright (C) 2008, 2009 Theobroma Systems Ltd. @@ -253,6 +253,7 @@ off_t java_lang_Thread::offset_daemon; off_t java_lang_Thread::offset_group; off_t java_lang_Thread::offset_uncaughtExceptionHandler; off_t java_lang_Thread::offset_threadStatus; +off_t java_lang_Thread::offset_me; static DynOffsetEntry dyn_entries_java_lang_Thread[] = { { &java_lang_Thread::set_priority_offset, "priority" }, @@ -260,6 +261,7 @@ static DynOffsetEntry dyn_entries_java_lang_Thread[] = { { &java_lang_Thread::set_group_offset, "group" }, { &java_lang_Thread::set_uncaughtExceptionHandler_offset, "uncaughtExceptionHandler" }, { &java_lang_Thread::set_threadStatus_offset, "threadStatus" }, + { &java_lang_Thread::set_me_offset, "me" }, { 0, 0 } }; diff --git a/src/vm/javaobjects.hpp b/src/vm/javaobjects.hpp index 29329f380..f60026b97 100644 --- a/src/vm/javaobjects.hpp +++ b/src/vm/javaobjects.hpp @@ -1969,6 +1969,7 @@ private: static off_t offset_group; static off_t offset_uncaughtExceptionHandler; static off_t offset_threadStatus; + static off_t offset_me; public: java_lang_Thread(java_handle_t* h) : java_lang_Object(h) {} @@ -1983,6 +1984,7 @@ public: void set_priority (int32_t value); void set_group (java_handle_t* value); void set_threadStatus(int32_t value); + void set_me (java_handle_t* value); // Offset initializers static void set_priority_offset(int32_t off) { offset_priority = off; } @@ -1990,6 +1992,7 @@ public: static void set_group_offset(int32_t off) { offset_group = off; } static void set_uncaughtExceptionHandler_offset(int32_t off) { offset_uncaughtExceptionHandler = off; } static void set_threadStatus_offset(int32_t off) { offset_threadStatus = off; } + static void set_me_offset(int32_t off) { offset_me = off; } }; @@ -2029,6 +2032,11 @@ inline void java_lang_Thread::set_threadStatus(int32_t value) set(_handle, offset_threadStatus, value); } +inline void java_lang_Thread::set_me(java_handle_t* value) +{ + set(_handle, offset_me, value); +} + /** -- 2.25.1