harmony-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ge...@apache.org
Subject svn commit: r453719 - in /incubator/harmony/enhanced/drlvm/trunk/vm/vmcore: include/mon_enter_exit.h src/exception/exceptions_jit.cpp src/jvmti/jvmti_pop_frame.cpp src/jvmti/jvmti_step.cpp src/thread/mon_enter_exit.cpp
Date Fri, 06 Oct 2006 18:08:12 GMT
Author: geirm
Date: Fri Oct  6 11:08:11 2006
New Revision: 453719

URL: http://svn.apache.org/viewvc?view=rev&rev=453719
Log:
HARMONY-1736

PopFrame crashes VM while popping synchronized method. It tries to release method monitor
and fails.
The cause is in wrong exception RAISE state. Do PopFrame function executed in one state but
release monitor function 
expects another.

Ubuntu 6 - smoke, c-unit, ~kernel


Modified:
    incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/include/mon_enter_exit.h
    incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/exception/exceptions_jit.cpp
    incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_pop_frame.cpp
    incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_step.cpp
    incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/mon_enter_exit.cpp

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/include/mon_enter_exit.h
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/include/mon_enter_exit.h?view=diff&rev=453719&r1=453718&r2=453719
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/include/mon_enter_exit.h (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/include/mon_enter_exit.h Fri Oct  6 11:08:11
2006
@@ -39,6 +39,11 @@
 // and after arguments are parsed.  It should set function pointers
 // to the appropriate values.
 void vm_monitor_init();
+
+// monitor exit from synchronized method
+struct StackIterator;
+void vm_monitor_exit_synchronized_method(StackIterator *si);
+
 // Does a monitorexit operation.
 extern void (*vm_monitor_exit)(ManagedObject *p_obj);
 extern void (*vm_monitor_enter)(ManagedObject *p_obj);

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/exception/exceptions_jit.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/exception/exceptions_jit.cpp?view=diff&rev=453719&r1=453718&r2=453719
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/exception/exceptions_jit.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/exception/exceptions_jit.cpp Fri
Oct  6 11:08:11 2006
@@ -317,24 +317,7 @@
         }
 
         // No appropriate handler found, undo synchronization
-        if (method->is_synchronized()) {
-            bool unwindable = set_unwindable(false);
-            if (method->is_static()) {
-                assert(!hythread_is_suspend_enabled());
-                TRACE2("tm.locks", ("unlock staic sync methods... %x",  exn_obj));
-                vm_monitor_exit(struct_Class_to_java_lang_Class(method->
-                        get_class()));
-            }
-            else {
-                void **p_this =
-                    (void **) jit->get_address_of_this(method,
-                    si_get_jit_context(si));
-                TRACE2("tm.locks", ("unlock sync methods...%x" , *p_this));
-                vm_monitor_exit((ManagedObject *) * p_this);
-            }
-            exn_clear();
-            set_unwindable(unwindable);
-        }
+        vm_monitor_exit_synchronized_method(si);
 
         BEGIN_RAISE_AREA;
         jvalue ret_val = {(jlong)0};

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_pop_frame.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_pop_frame.cpp?view=diff&rev=453719&r1=453718&r2=453719
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_pop_frame.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_pop_frame.cpp Fri Oct
 6 11:08:11 2006
@@ -184,22 +184,7 @@
     unlocked by VM, so JIT has to store information about these monitors
     somewhere.
     */
-    if (method->is_synchronized()) {
-        if (is_method_static) {
-            assert(!hythread_is_suspend_enabled());
-            TRACE2("tm.locks", ("unlock staic sync methods... "));
-            vm_monitor_exit(struct_Class_to_java_lang_Class(method->
-                    get_class()));
-            exn_clear();
-        } else {
-            JIT *jit = cci->get_jit();
-            void **p_this =
-                (void **) jit->get_address_of_this(method, jitContext);
-            TRACE2("tm.locks", ("unlock sync methods...%x" , *p_this));
-            vm_monitor_exit((ManagedObject *) * p_this);
-            exn_clear();
-        }
-    }
+    vm_monitor_exit_synchronized_method(si);
 
     // pop java frame
     si_goto_previous(si);

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_step.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_step.cpp?view=diff&rev=453719&r1=453718&r2=453719
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_step.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_step.cpp Fri Oct  6 11:08:11
2006
@@ -91,6 +91,9 @@
     NativeCodePtr call_ip = NULL;
     do
     {
+        if (disasm.get_type() == InstructionDisassembler::INDIRECT_CALL)
+            call_ip = ip;
+
         ip = (NativeCodePtr)((POINTER_SIZE_INT)ip + disasm.get_length_with_prefix());
 
         // Another thread could have instrumented this location for
@@ -105,9 +108,6 @@
         }
         else
             disasm = ip;
-
-        if (disasm.get_type() == InstructionDisassembler::INDIRECT_CALL)
-            call_ip = ip;
     }
     while (ip < next_ip);
 

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/mon_enter_exit.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/mon_enter_exit.cpp?view=diff&rev=453719&r1=453718&r2=453719
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/mon_enter_exit.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/mon_enter_exit.cpp Fri Oct
 6 11:08:11 2006
@@ -37,6 +37,9 @@
 #include "vm_threads.h"
 #include "jit_runtime_support.h"
 #include "exceptions.h"
+#include "stack_iterator.h"
+#include "Class.h"
+#include "jit_intf_cpp.h"
 
 #include "mon_enter_exit.h"
 #include "thread_generic.h"
@@ -72,6 +75,35 @@
     vm_monitor_try_enter = vm_monitor_try_enter_default;
     vm_monitor_exit = vm_monitor_exit_default;
     vm_monitor_try_exit = vm_monitor_try_exit_default;
+}
+
+void vm_monitor_exit_synchronized_method(StackIterator *si)
+{
+    assert(!si_is_native(si));
+    CodeChunkInfo *cci = si_get_code_chunk_info(si);
+    assert(cci);
+    Method *method = cci->get_method();
+
+    if (method->is_synchronized()) {
+        bool unwindable = set_unwindable(false);
+        if (method->is_static()) {
+            assert(!hythread_is_suspend_enabled());
+            TRACE2("tm.locks", ("unlock static sync methods...%x",
+                struct_Class_to_java_lang_Class(method->get_class())));
+            vm_monitor_exit(struct_Class_to_java_lang_Class(method->
+                    get_class()));
+        }
+        else {
+            JIT *jit = cci->get_jit();
+            void **p_this =
+                (void **) jit->get_address_of_this(method,
+                si_get_jit_context(si));
+            TRACE2("tm.locks", ("unlock sync methods...%x" , *p_this));
+            vm_monitor_exit((ManagedObject *) * p_this);
+        }
+        exn_clear();
+        set_unwindable(unwindable);
+    }
 }
 
 static void vm_monitor_enter_default(ManagedObject *p_obj)



Mime
View raw message