You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by xl...@apache.org on 2007/12/11 01:16:39 UTC
svn commit: r603102 - in /harmony/enhanced/drlvm/trunk/vm: include/open/
thread/src/ vmcore/src/init/ vmcore/src/thread/
Author: xli
Date: Mon Dec 10 16:16:38 2007
New Revision: 603102
URL: http://svn.apache.org/viewvc?rev=603102&view=rev
Log:
HARMONY-5247: [drlvm][init] DRL VM hangs with gc_cc in shutdown
Modified:
harmony/enhanced/drlvm/trunk/vm/include/open/hythread_ext.h
harmony/enhanced/drlvm/trunk/vm/include/open/jthread.h
harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.def
harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.exp
harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_thin_monitor.c
harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_shutdown.cpp
harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_java_monitors.cpp
Modified: harmony/enhanced/drlvm/trunk/vm/include/open/hythread_ext.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/include/open/hythread_ext.h?rev=603102&r1=603101&r2=603102&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/include/open/hythread_ext.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/include/open/hythread_ext.h Mon Dec 10 16:16:38 2007
@@ -549,6 +549,7 @@
IDATA VMCALL hythread_thin_monitor_enter(hythread_thin_monitor_t *lockword);
IDATA VMCALL hythread_thin_monitor_try_enter(hythread_thin_monitor_t *lockword);
IDATA VMCALL hythread_thin_monitor_exit(hythread_thin_monitor_t *lockword);
+IDATA VMCALL hythread_thin_monitor_release(hythread_thin_monitor_t *lockword);
IDATA VMCALL hythread_thin_monitor_wait(hythread_thin_monitor_t *lockword);
IDATA VMCALL hythread_thin_monitor_wait_timed(hythread_thin_monitor_t *lockword_ptr, I_64 ms, IDATA nano);
IDATA VMCALL hythread_thin_monitor_wait_interruptable(hythread_thin_monitor_t *lockword_ptr, I_64 ms, IDATA nano);
Modified: harmony/enhanced/drlvm/trunk/vm/include/open/jthread.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/include/open/jthread.h?rev=603102&r1=603101&r2=603102&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/include/open/jthread.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/include/open/jthread.h Mon Dec 10 16:16:38 2007
@@ -139,6 +139,7 @@
VMEXPORT IDATA jthread_monitor_enter(jobject mon);
VMEXPORT IDATA jthread_monitor_try_enter(jobject mon);
VMEXPORT IDATA jthread_monitor_exit(jobject mon);
+VMEXPORT IDATA jthread_monitor_release(jobject mon);
VMEXPORT IDATA jthread_monitor_notify(jobject mon);
VMEXPORT IDATA jthread_monitor_notify_all(jobject mon);
VMEXPORT IDATA jthread_monitor_wait(jobject mon);
Modified: harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.def
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.def?rev=603102&r1=603101&r2=603102&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.def (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.def Mon Dec 10 16:16:38 2007
@@ -81,6 +81,7 @@
hythread_thin_monitor_enter
hythread_thin_monitor_try_enter
hythread_thin_monitor_exit
+hythread_thin_monitor_release
hythread_thin_monitor_wait
hythread_thin_monitor_wait_timed
hythread_thin_monitor_wait_interruptable
Modified: harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.exp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.exp?rev=603102&r1=603101&r2=603102&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.exp (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.exp Mon Dec 10 16:16:38 2007
@@ -83,6 +83,7 @@
hythread_thin_monitor_enter;
hythread_thin_monitor_try_enter;
hythread_thin_monitor_exit;
+hythread_thin_monitor_release;
hythread_thin_monitor_wait;
hythread_thin_monitor_wait_timed;
hythread_thin_monitor_wait_interruptable;
Modified: harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_thin_monitor.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_thin_monitor.c?rev=603102&r1=603101&r2=603102&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_thin_monitor.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_thin_monitor.c Mon Dec 10 16:16:38 2007
@@ -468,6 +468,36 @@
return TM_ERROR_ILLEGAL_STATE;
}
+/**
+ * Completely releases the ownership over monitor.
+ */
+IDATA VMCALL hythread_thin_monitor_release(hythread_thin_monitor_t *lockword_ptr)
+{
+ IDATA status;
+ U_32 lockword = *lockword_ptr;
+ hythread_t self = hythread_self();
+
+ if (self != hythread_thin_monitor_get_owner(lockword_ptr)) {
+ // nothing to do, thread is not an owner of monitor
+ return TM_ERROR_NONE;
+ }
+ if (IS_FAT_LOCK(lockword)) {
+ // this is fat monitor
+ hythread_monitor_t monitor =
+ locktable_get_fat_monitor(FAT_LOCK_ID(lockword));
+ monitor->recursion_count = 0;
+ status = hymutex_unlock(&monitor->mutex);
+ assert(status == TM_ERROR_NONE);
+ } else {
+ // this is thin monitor
+ while (RECURSION(lockword)) {
+ RECURSION_DEC(lockword_ptr, lockword);
+ lockword = *lockword_ptr;
+ }
+ *lockword_ptr = lockword & 0xffff;
+ }
+ return TM_ERROR_NONE;
+}
IDATA thin_monitor_wait_impl(hythread_thin_monitor_t *lockword_ptr, I_64 ms, IDATA nano, IDATA interruptable) {
// get this thread
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_shutdown.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_shutdown.cpp?rev=603102&r1=603101&r2=603102&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_shutdown.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_shutdown.cpp Mon Dec 10 16:16:38 2007
@@ -54,6 +54,8 @@
return JNI_ERR; \
} \
+static jobject java_lang_ThreadGroup_lock_field;
+
/**
* Calls java.lang.System.execShutdownSequence() method.
*
@@ -100,6 +102,9 @@
IDATA UNUSED status = jthread_detach(java_thread);
assert(status == TM_ERROR_NONE);
+ status = jthread_monitor_release(java_lang_ThreadGroup_lock_field);
+ assert(status == TM_ERROR_NONE);
+
hythread_exit(NULL);
}
@@ -133,6 +138,17 @@
self = hythread_self();
+ // Get java.lang.ThreadGroup.lock field
+ JNIEnv *jni_env = jthread_self_vm_thread()->jni_env;
+ Class* klass = vm_env->java_lang_ThreadGroup_Class;
+ jobject class_handle = struct_Class_to_jclass(klass);
+ jfieldID lock_field_id = jni_env->GetStaticFieldID(class_handle, "lock",
+ "Ljava/lang/ThreadGroup$ThreadGroupLock;");
+ assert(lock_field_id);
+ java_lang_ThreadGroup_lock_field =
+ jni_env->GetStaticObjectField(class_handle, lock_field_id);
+ assert(java_lang_ThreadGroup_lock_field);
+
// Collect running java threads.
// Set callbacks to let threads exit
TRACE2("shutdown", "stopping threads, self " << self);
@@ -158,15 +174,8 @@
TRACE2("shutdown", "cancelling threads");
- JNIEnv *jni_env = jthread_self_vm_thread()->jni_env;
- Class* klass = vm_env->java_lang_ThreadGroup_Class;
- jobject class_handle = struct_Class_to_jclass(klass);
- jfieldID lock_field_id = jni_env->GetStaticFieldID(class_handle, "lock",
- "Ljava/lang/ThreadGroup$ThreadGroupLock;");
- assert(lock_field_id);
- jobject lock_field = jni_env->GetStaticObjectField(class_handle, lock_field_id);
- assert(lock_field);
- IDATA status = jthread_monitor_enter(lock_field);
+ // Grab java.lang.ThreadGroup.lock
+ IDATA status = jthread_monitor_enter(java_lang_ThreadGroup_lock_field);
assert(status == TM_ERROR_NONE);
// forcedly kill remaining threads
@@ -185,7 +194,8 @@
}
hythread_iterator_release(&it);
- status = jthread_monitor_exit(lock_field);
+ // release java.lang.ThreadGroup.lock
+ status = jthread_monitor_exit(java_lang_ThreadGroup_lock_field);
assert(status == TM_ERROR_NONE);
TRACE2("shutdown", "shutting down threads complete");
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_java_monitors.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_java_monitors.cpp?rev=603102&r1=603101&r2=603102&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_java_monitors.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_java_monitors.cpp Mon Dec 10 16:16:38 2007
@@ -214,6 +214,24 @@
} // jthread_monitor_exit
/**
+ * Completely releases the ownership over monitor.
+ *
+ * @param[in] monitor monitor
+ */
+IDATA VMCALL jthread_monitor_release(jobject monitor)
+{
+ assert(monitor);
+
+ hythread_suspend_disable();
+ hythread_thin_monitor_t *lockword = vm_object_get_lockword_addr(monitor);
+ IDATA status = hythread_thin_monitor_release(lockword);
+ assert(status == TM_ERROR_NONE);
+ hythread_suspend_enable();
+
+ return TM_ERROR_NONE;
+} // jthread_monitor_release
+
+/**
* Notifies one thread waiting on the monitor.
*
* Only single thread waiting on the