You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by va...@apache.org on 2007/05/25 08:00:18 UTC
svn commit: r541558 - in /harmony/enhanced/drlvm/trunk:
src/test/regression/H2057/ vm/include/ vm/jitrino/src/codegenerator/ia32/
vm/jitrino/src/vm/ vm/jitrino/src/vm/drl/ vm/vmcore/src/jit/
Author: varlax
Date: Thu May 24 23:00:17 2007
New Revision: 541558
URL: http://svn.apache.org/viewvc?view=rev&rev=541558
Log:
Applied HARMONY-2057 [drlvm][jit] Jitrino.OPT's bpp.version=6 algorithm (the default) considers that all VM helpers are interruptable.
Added:
harmony/enhanced/drlvm/trunk/src/test/regression/H2057/
harmony/enhanced/drlvm/trunk/src/test/regression/H2057/SyncTest.java
harmony/enhanced/drlvm/trunk/src/test/regression/H2057/run.test.xml
Modified:
harmony/enhanced/drlvm/trunk/vm/include/jit_runtime_support.h
harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32BBPolling.cpp
harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp
harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/VMInterface.h
harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlVMInterface.cpp
harmony/enhanced/drlvm/trunk/vm/vmcore/src/jit/jit_runtime_support.cpp
Added: harmony/enhanced/drlvm/trunk/src/test/regression/H2057/SyncTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/regression/H2057/SyncTest.java?view=auto&rev=541558
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/H2057/SyncTest.java (added)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/H2057/SyncTest.java Thu May 24 23:00:17 2007
@@ -0,0 +1,51 @@
+
+package org.apache.harmony.drlvm.tests.regression.H2057;
+
+import junit.framework.TestCase;
+
+public class SyncTest extends TestCase {
+
+
+ public void testMain() {
+ Waiter w = new Waiter();
+ w.start();
+ while(!w.passed){}
+ }
+
+}
+
+class Stopper extends Thread {
+ Waiter w;
+ Stopper(Waiter w) {this.w=w;}
+
+ public void run() {
+// System.out.println("stopper started..");
+ try {sleep(1000);} catch (Exception e) {e.printStackTrace();}
+// System.out.println("stopping..");
+ w.finish();
+// System.out.println("stopped..");
+ }
+}
+
+class Waiter extends Thread {
+ boolean done = false;
+ boolean passed = false;
+
+ synchronized void finish(){
+// System.out.println("inside finish()..");
+ done = true;
+ }
+
+ public void run() {
+// System.out.println("waiter started..");
+ new Stopper(this).start();
+ int i=0;
+ while(!done) {
+ synchronized(this) {
+ i++;
+ }
+ }
+ passed = true;
+// System.out.println("passed!");
+ }
+}
Added: harmony/enhanced/drlvm/trunk/src/test/regression/H2057/run.test.xml
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/regression/H2057/run.test.xml?view=auto&rev=541558
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/H2057/run.test.xml (added)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/H2057/run.test.xml Thu May 24 23:00:17 2007
@@ -0,0 +1,9 @@
+<project name="RUN HARMONY-2057 Regression Test">
+ <target name="run-test">
+ <run-junit-test
+ test="org.apache.harmony.drlvm.tests.regression.H2057.SyncTest"
+ vmarg="-Xem:opt">
+ </run-junit-test>
+ </target>
+</project>
+
Modified: harmony/enhanced/drlvm/trunk/vm/include/jit_runtime_support.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/include/jit_runtime_support.h?view=diff&rev=541558&r1=541557&r2=541558
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/include/jit_runtime_support.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/include/jit_runtime_support.h Thu May 24 23:00:17 2007
@@ -699,9 +699,29 @@
* Write barrier for GC.
*/
-} VM_RT_SUPPORT; //VM_RT_SUPPORT
+} VM_RT_SUPPORT;
+/**
+ * VM RT helpers can be interrupted differently.
+ */
+typedef
+enum HELPER_INTERRUPTIBILITY_KIND {
+/**
+ * Disallowed to interrupt a thread inside the helper.
+ */
+ INTERRUPTIBLE_NEVER,
+/**
+ * Some helpers can be run in fast path mode,
+ * when they are not interruptible, or in slow path, when they are.
+ */
+ INTERRUPTIBLE_SOMETIMES,
+/**
+ * Helper call can always be interrupted.
+ */
+ INTERRUPTIBLE_ALWAYS
+
+} HELPER_INTERRUPTIBILITY_KIND;
NativeCodePtr rth_get_lil_helper(VM_RT_SUPPORT f);
@@ -727,7 +747,7 @@
* Checks if helper is a suspension point
*/
-VMEXPORT Boolean vm_helper_is_gc_interruptible(VM_RT_SUPPORT f);
+VMEXPORT HELPER_INTERRUPTIBILITY_KIND vm_helper_get_interruptibility_kind(VM_RT_SUPPORT f);
#ifdef __cplusplus
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32BBPolling.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32BBPolling.cpp?view=diff&rev=541558&r1=541557&r2=541558
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32BBPolling.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32BBPolling.cpp Thu May 24 23:00:17 2007
@@ -393,11 +393,14 @@
if (!ri) {
return false;
} else {
- if ( ri->getKind() == Opnd::RuntimeInfo::Kind_HelperAddress ) {
- return true;
- }
if ( ri->getKind() == Opnd::RuntimeInfo::Kind_MethodDirectAddr &&
((MethodDesc*)ri->getValue(0))->isNative() )
+ {
+ return true;
+ }
+ CompilationInterface* ci = CompilationContext::getCurrentContext()->getVMCompilationInterface();
+ if ( ri->getKind() == Opnd::RuntimeInfo::Kind_HelperAddress &&
+ ci->isInterruptible((CompilationInterface::RuntimeHelperId)(POINTER_SIZE_INT)ri->getValue(0)) )
{
return true;
}
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp?view=diff&rev=541558&r1=541557&r2=541558
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp Thu May 24 23:00:17 2007
@@ -2238,7 +2238,7 @@
if (!isInternalHelper) {
CompilationInterface* ci = CompilationContext::getCurrentContext()->getVMCompilationInterface();
isNonGCVMHelper = rt && rt->getKind() == Opnd::RuntimeInfo::Kind_HelperAddress
- && !ci->isGCInterruptible((CompilationInterface::RuntimeHelperId)(POINTER_SIZE_INT)rt->getValue(0));
+ && !ci->mayBeInterruptible((CompilationInterface::RuntimeHelperId)(POINTER_SIZE_INT)rt->getValue(0));
}
bool isGCPoint = !isInternalHelper && !isNonGCVMHelper;
return isGCPoint;
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/VMInterface.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/VMInterface.h?view=diff&rev=541558&r1=541557&r2=541558
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/VMInterface.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/VMInterface.h Thu May 24 23:00:17 2007
@@ -380,7 +380,8 @@
static RuntimeHelperId str2rid( const char * helperName );
VmCallingConvention getRuntimeHelperCallingConvention(RuntimeHelperId id);
- bool isGCInterruptible(RuntimeHelperId id);
+ bool isInterruptible(RuntimeHelperId id);
+ bool mayBeInterruptible(RuntimeHelperId id);
void* getRuntimeHelperAddress(RuntimeHelperId);
void* getRuntimeHelperAddressForType(RuntimeHelperId, Type*);
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlVMInterface.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlVMInterface.cpp?view=diff&rev=541558&r1=541557&r2=541558
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlVMInterface.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlVMInterface.cpp Thu May 24 23:00:17 2007
@@ -595,11 +595,16 @@
}
bool
-CompilationInterface::isGCInterruptible(RuntimeHelperId runtimeHelperId) {
+CompilationInterface::isInterruptible(RuntimeHelperId runtimeHelperId) {
VM_RT_SUPPORT drlHelperId = translateHelperId(runtimeHelperId);
- return vm_helper_is_gc_interruptible(drlHelperId);
+ return INTERRUPTIBLE_ALWAYS == vm_helper_get_interruptibility_kind(drlHelperId);
}
+bool
+CompilationInterface::mayBeInterruptible(RuntimeHelperId runtimeHelperId) {
+ VM_RT_SUPPORT drlHelperId = translateHelperId(runtimeHelperId);
+ return INTERRUPTIBLE_NEVER != vm_helper_get_interruptibility_kind(drlHelperId);
+}
bool
CompilationInterface::compileMethod(MethodDesc *method) {
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/jit/jit_runtime_support.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jit/jit_runtime_support.cpp?view=diff&rev=541558&r1=541557&r2=541558
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/jit/jit_runtime_support.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/jit/jit_runtime_support.cpp Thu May 24 23:00:17 2007
@@ -2403,100 +2403,100 @@
* Checks if helper is a suspension point
*/
-VMEXPORT Boolean vm_helper_is_gc_interruptible(VM_RT_SUPPORT f)
+VMEXPORT HELPER_INTERRUPTIBILITY_KIND vm_helper_get_interruptibility_kind(VM_RT_SUPPORT f)
{
switch(f) {
case VM_RT_MULTIANEWARRAY_RESOLVED:
- return TRUE;
+ return INTERRUPTIBLE_ALWAYS;
case VM_RT_LDC_STRING:
- return TRUE;
+ return INTERRUPTIBLE_ALWAYS;
// Exceptions
case VM_RT_THROW:
case VM_RT_THROW_SET_STACK_TRACE:
- return TRUE;
+ return INTERRUPTIBLE_ALWAYS;
case VM_RT_THROW_LAZY:
- return TRUE;
+ return INTERRUPTIBLE_ALWAYS;
case VM_RT_IDX_OUT_OF_BOUNDS:
- return TRUE;
+ return INTERRUPTIBLE_ALWAYS;
case VM_RT_NULL_PTR_EXCEPTION:
- return TRUE;
+ return INTERRUPTIBLE_ALWAYS;
case VM_RT_DIVIDE_BY_ZERO_EXCEPTION:
- return TRUE;
+ return INTERRUPTIBLE_ALWAYS;
case VM_RT_ARRAY_STORE_EXCEPTION:
- return TRUE;
+ return INTERRUPTIBLE_ALWAYS;
case VM_RT_THROW_LINKING_EXCEPTION:
- return TRUE;
+ return INTERRUPTIBLE_ALWAYS;
// Type tests
case VM_RT_CHECKCAST:
- return TRUE;
+ return INTERRUPTIBLE_ALWAYS;
case VM_RT_INSTANCEOF:
- return TRUE;
+ return INTERRUPTIBLE_ALWAYS;
case VM_RT_AASTORE:
- return TRUE;
+ return INTERRUPTIBLE_ALWAYS;
case VM_RT_AASTORE_TEST:
- return TRUE;
+ return INTERRUPTIBLE_ALWAYS;
// Misc
case VM_RT_GET_INTERFACE_VTABLE_VER0:
- return TRUE;
+ return INTERRUPTIBLE_ALWAYS;
case VM_RT_INITIALIZE_CLASS:
- return TRUE;
+ return INTERRUPTIBLE_ALWAYS;
case VM_RT_GC_SAFE_POINT:
- return TRUE;
+ return INTERRUPTIBLE_ALWAYS;
case VM_RT_GC_GET_TLS_BASE:
- return FALSE;
+ return INTERRUPTIBLE_NEVER;
// JVMTI
case VM_RT_JVMTI_METHOD_ENTER_CALLBACK:
- return TRUE;
+ return INTERRUPTIBLE_ALWAYS;
case VM_RT_JVMTI_METHOD_EXIT_CALLBACK:
- return TRUE;
+ return INTERRUPTIBLE_ALWAYS;
case VM_RT_JVMTI_FIELD_ACCESS_CALLBACK:
- return TRUE;
+ return INTERRUPTIBLE_ALWAYS;
case VM_RT_JVMTI_FIELD_MODIFICATION_CALLBACK:
- return TRUE;
+ return INTERRUPTIBLE_ALWAYS;
// Non-VM
case VM_RT_F2I:
- return FALSE;
+ return INTERRUPTIBLE_NEVER;
case VM_RT_F2L:
- return FALSE;
+ return INTERRUPTIBLE_NEVER;
case VM_RT_D2I:
- return FALSE;
+ return INTERRUPTIBLE_NEVER;
case VM_RT_D2L:
- return FALSE;
+ return INTERRUPTIBLE_NEVER;
case VM_RT_LSHL:
- return FALSE;
+ return INTERRUPTIBLE_NEVER;
case VM_RT_LSHR:
- return FALSE;
+ return INTERRUPTIBLE_NEVER;
case VM_RT_LUSHR:
- return FALSE;
+ return INTERRUPTIBLE_NEVER;
case VM_RT_LMUL:
#ifdef VM_LONG_OPT
case VM_RT_LMUL_CONST_MULTIPLIER:
#endif
- return FALSE;
+ return INTERRUPTIBLE_NEVER;
case VM_RT_LREM:
- return FALSE;
+ return INTERRUPTIBLE_NEVER;
case VM_RT_LDIV:
- return FALSE;
+ return INTERRUPTIBLE_NEVER;
case VM_RT_ULDIV:
- return FALSE;
+ return INTERRUPTIBLE_NEVER;
case VM_RT_CONST_LDIV:
- return FALSE;
+ return INTERRUPTIBLE_NEVER;
case VM_RT_CONST_LREM:
- return FALSE;
+ return INTERRUPTIBLE_NEVER;
case VM_RT_IMUL:
- return FALSE;
+ return INTERRUPTIBLE_NEVER;
case VM_RT_IREM:
- return FALSE;
+ return INTERRUPTIBLE_NEVER;
case VM_RT_IDIV:
- return FALSE;
+ return INTERRUPTIBLE_NEVER;
case VM_RT_FREM:
- return FALSE;
+ return INTERRUPTIBLE_NEVER;
case VM_RT_FDIV:
- return FALSE;
+ return INTERRUPTIBLE_NEVER;
case VM_RT_DREM:
- return FALSE;
+ return INTERRUPTIBLE_NEVER;
case VM_RT_DDIV:
- return FALSE;
+ return INTERRUPTIBLE_NEVER;
case VM_RT_NEWOBJ_WITHRESOLVE:
case VM_RT_NEWARRAY_WITHRESOLVE:
case VM_RT_INITIALIZE_CLASS_WITHRESOLVE:
@@ -2508,32 +2508,32 @@
case VM_RT_GET_INVOKEINTERFACE_ADDR_WITHRESOLVE:
case VM_RT_GET_INVOKEVIRTUAL_ADDR_WITHRESOLVE:
case VM_RT_GET_INVOKE_SPECIAL_ADDR_WITHRESOLVE:
- return TRUE;
+ return INTERRUPTIBLE_ALWAYS;
case VM_RT_NEW_RESOLVED_USING_VTABLE_AND_SIZE:
- return TRUE;
+ return INTERRUPTIBLE_ALWAYS;
case VM_RT_NEW_VECTOR_USING_VTABLE:
- return TRUE;
+ return INTERRUPTIBLE_ALWAYS;
case VM_RT_WRITE_BARRIER_FASTCALL:
- return TRUE;
+ return INTERRUPTIBLE_ALWAYS;
case VM_RT_MONITOR_ENTER:
case VM_RT_MONITOR_ENTER_NON_NULL:
- return TRUE;
+ return INTERRUPTIBLE_SOMETIMES;
case VM_RT_MONITOR_ENTER_STATIC:
- return TRUE;
+ return INTERRUPTIBLE_SOMETIMES;
case VM_RT_MONITOR_EXIT:
case VM_RT_MONITOR_EXIT_NON_NULL:
- return TRUE;
+ return INTERRUPTIBLE_SOMETIMES;
case VM_RT_MONITOR_EXIT_STATIC:
- return TRUE;
+ return INTERRUPTIBLE_SOMETIMES;
case VM_RT_CHAR_ARRAYCOPY_NO_EXC:
- return TRUE;
+ return INTERRUPTIBLE_ALWAYS;
case VM_RT_GC_HEAP_WRITE_REF:
- return FALSE;
+ return INTERRUPTIBLE_NEVER;
default:
ASSERT(false, "Unexpected helper id" << f);
- return TRUE;
+ return INTERRUPTIBLE_SOMETIMES;
}
}