You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by gs...@apache.org on 2006/11/02 21:36:45 UTC

svn commit: r470512 - in /incubator/harmony/enhanced/drlvm/trunk/vm: include/ vmcore/include/ vmcore/src/class_support/ vmcore/src/jit/ vmcore/src/jvmti/ vmcore/src/thread/ vmcore/src/util/

Author: gshimansky
Date: Thu Nov  2 12:36:44 2006
New Revision: 470512

URL: http://svn.apache.org/viewvc?view=rev&rev=470512
Log:
Applied HARMONY-1985 [drlvm][jvmti] VMObjectAlloc event support

Tests passed on Gentoo linux


Modified:
    incubator/harmony/enhanced/drlvm/trunk/vm/include/jvmti_types.h
    incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/include/jvmti_direct.h
    incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/classloader.cpp
    incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jit/jit_runtime_support.cpp
    incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_capability.cpp
    incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_event.cpp
    incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_general.cpp
    incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/object_generic.cpp
    incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/vm_strings.cpp

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/include/jvmti_types.h
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/include/jvmti_types.h?view=diff&rev=470512&r1=470511&r2=470512
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/include/jvmti_types.h (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/include/jvmti_types.h Thu Nov  2 12:36:44 2006
@@ -283,6 +283,8 @@
         JVMTI_MAX_EVENT_TYPE_VAL = 84
     } jvmtiEvent;
 
+#define TOTAL_EVENT_TYPE_NUM (JVMTI_MAX_EVENT_TYPE_VAL - JVMTI_MIN_EVENT_TYPE_VAL + 1)
+
     /**
      * Root types.
      */

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/include/jvmti_direct.h
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/include/jvmti_direct.h?view=diff&rev=470512&r1=470511&r2=470512
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/include/jvmti_direct.h (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/include/jvmti_direct.h Thu Nov  2 12:36:44 2006
@@ -50,8 +50,8 @@
     VMBreakInterface *brpt_intf;
     TIEnv* next;
 
-    bool global_events[JVMTI_MAX_EVENT_TYPE_VAL - JVMTI_MIN_EVENT_TYPE_VAL];
-    TIEventThread *event_threads[JVMTI_MAX_EVENT_TYPE_VAL - JVMTI_MIN_EVENT_TYPE_VAL];
+    bool global_events[TOTAL_EVENT_TYPE_NUM];
+    TIEventThread *event_threads[TOTAL_EVENT_TYPE_NUM];
 
     /**
      * Returns pointer to a callback function that was set by SetEventCallbacks
@@ -137,6 +137,8 @@
     jmethodID method, jlocation location, ManagedObject* object);
 VMEXPORT void jvmti_process_field_modification_event(Field_Handle field,
     jmethodID method, jlocation location, ManagedObject* object, jvalue new_value);
+VMEXPORT Managed_Object_Handle vm_alloc_and_report_ti(unsigned size, 
+    Allocation_Handle p_vtable, void *thread_pointer, Class* object_class);
 
 #ifdef __cplusplus
 extern "C" {

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/classloader.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/classloader.cpp?view=diff&rev=470512&r1=470511&r2=470512
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/classloader.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/classloader.cpp Thu Nov  2 12:36:44 2006
@@ -1114,8 +1114,8 @@
 
         tmn_suspend_disable(); // -----------------vvv
         ManagedObject* new_java_lang_Class =
-            (ManagedObject*)gc_alloc(root_class->instance_data_size,
-                root_class->allocation_handle, vm_get_gc_thread_local());
+            (ManagedObject*) vm_alloc_and_report_ti(root_class->instance_data_size,
+                root_class->allocation_handle, vm_get_gc_thread_local(), root_class);
         if(new_java_lang_Class == NULL)
         {
             tmn_suspend_enable();

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jit/jit_runtime_support.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jit/jit_runtime_support.cpp?view=diff&rev=470512&r1=470511&r2=470512
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jit/jit_runtime_support.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jit/jit_runtime_support.cpp Thu Nov  2 12:36:44 2006
@@ -2077,9 +2077,9 @@
     vtable->clss->num_bytes_allocated += vtable->allocated_size;
 #endif //VM_STATS
     // From vm_types.h: this is the same as instance_data_size with the constraint bit cleared.
-    ManagedObject* o = (ManagedObject *)
-        gc_alloc(vtable->allocated_size, 
-            vtable->clss->allocation_handle, vm_get_gc_thread_local());
+    ManagedObject* o = (ManagedObject *) vm_alloc_and_report_ti(
+            vtable->allocated_size, vtable->clss->allocation_handle, 
+            vm_get_gc_thread_local(), vtable->clss);
     if (!o) {
         exn_raise_object(
             VM_Global_State::loader_env->java_lang_OutOfMemoryError);

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_capability.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_capability.cpp?view=diff&rev=470512&r1=470511&r2=470512
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_capability.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_capability.cpp Thu Nov  2 12:36:44 2006
@@ -60,7 +60,7 @@
     1, // can_generate_all_class_hook_events
     1, // can_generate_compiled_method_load_events
     1, // can_generate_monitor_events
-    0, // can_generate_vm_object_alloc_events
+    1, // can_generate_vm_object_alloc_events
     0, // can_generate_native_method_bind_events
     0, // can_generate_garbage_collection_events
     0  // can_generate_object_free_events
@@ -97,7 +97,7 @@
     1, // can_generate_all_class_hook_events
     1, // can_generate_compiled_method_load_events
     1, // can_generate_monitor_events
-    0, // can_generate_vm_object_alloc_events
+    1, // can_generate_vm_object_alloc_events
     0, // can_generate_native_method_bind_events
     0, // can_generate_garbage_collection_events
     0  // can_generate_object_free_events
@@ -136,7 +136,7 @@
     1, // can_generate_all_class_hook_events
     1, // can_generate_compiled_method_load_events
     0, // can_generate_monitor_events
-    0, // can_generate_vm_object_alloc_events
+    1, // can_generate_vm_object_alloc_events
     0, // can_generate_native_method_bind_events
     0, // can_generate_garbage_collection_events
     0  // can_generate_object_free_events

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_event.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_event.cpp?view=diff&rev=470512&r1=470511&r2=470512
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_event.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_event.cpp Thu Nov  2 12:36:44 2006
@@ -40,6 +40,7 @@
 #include "jvmti_break_intf.h"
 #include "stack_iterator.h"
 #include "m2n.h"
+#include "suspend_checker.h"
 
 /*
  * Set Event Callbacks
@@ -925,8 +926,6 @@
         object->object = managed_object;
     }
 
-    tmn_suspend_enable();
-
     DebugUtilsTI *ti = VM_Global_State::loader_env->TI;
     if (!ti->isEnabled() )
         return;
@@ -937,6 +936,8 @@
     if (!ti->get_global_capability(DebugUtilsTI::TI_GC_ENABLE_FIELD_ACCESS_EVENT))
         return;
 
+    tmn_suspend_enable();
+
     // get field class
     //Type_Info_Handle field_type = field_get_type_info_of_field_value(field);
     //Class_Handle clss = type_info_get_class(field_type);
@@ -997,8 +998,6 @@
         object->object = managed_object;
     }
 
-    tmn_suspend_enable();
-
     DebugUtilsTI *ti = VM_Global_State::loader_env->TI;
     if (!ti->isEnabled() )
         return;
@@ -1010,6 +1009,8 @@
         return;
 
     // get field class
+    tmn_suspend_enable();
+
     //Type_Info_Handle field_type = field_get_type_info_of_field_value(field);
     //Class_Handle clss = type_info_get_class(field_type);
     //ASSERT(clss, "Can't get class handle for field type.");
@@ -1059,6 +1060,90 @@
 
     tmn_suspend_disable();
 } // jvmti_process_field_modification_event
+
+static void jvmti_process_vm_object_alloc_event(ManagedObject** p_managed_object,
+    Class* object_clss, unsigned size)
+{
+    SuspendDisabledChecker sdc;
+
+    DebugUtilsTI *ti = VM_Global_State::loader_env->TI;
+    if (!ti->isEnabled() )
+        return;
+
+    if (JVMTI_PHASE_LIVE != ti->getPhase())
+        return;
+
+    // check the j.l.Thread is already initialized
+    hythread_t curr_thread = hythread_self();
+    jthread thread = jthread_get_java_thread(curr_thread);
+    if (NULL == thread)
+        return;
+
+    ManagedObject* managed_object = *p_managed_object;
+    // create handle for object
+    jobject object = NULL;
+
+    if (NULL != managed_object) {
+        object = oh_allocate_local_handle();
+        object->object = managed_object;
+    }
+
+    tmn_suspend_enable();
+
+    // get class
+    jclass klass = struct_Class_to_java_lang_Class_Handle(object_clss);
+
+    jvmtiEvent event_type = JVMTI_EVENT_VM_OBJECT_ALLOC;
+    TIEnv *ti_env = ti->getEnvironments();
+    TIEnv *next_env;
+    while (NULL != ti_env)
+    {
+        next_env = ti_env->next;
+        // check that event is enabled in this environment.
+        if (!ti_env->global_events[event_type - JVMTI_MIN_EVENT_TYPE_VAL]) {
+            TIEventThread *thr = ti_env->event_threads[event_type - JVMTI_MIN_EVENT_TYPE_VAL];
+            while (thr)
+            {
+                if (thr->thread == curr_thread)
+                    break;
+                thr = thr->next;
+            }
+
+            if (!thr)
+            {
+                ti_env = next_env;
+                continue;
+            }
+        }
+
+        // event is enabled in this environment
+        JNIEnv *jni_env = p_TLS_vmthread->jni_env;
+        jvmtiEnv *jvmti_env = (jvmtiEnv*) ti_env;
+
+        if (NULL != ti_env->event_table.VMObjectAlloc)
+            ti_env->event_table.VMObjectAlloc(jvmti_env, jni_env, thread,
+                    object, klass, (jlong)size);
+
+        ti_env = next_env;
+    }
+
+    tmn_suspend_disable();
+
+    // restore object pointer. As et could be relocated by GC.
+    *p_managed_object = object->object;
+} // jvmti_process_vm_object_alloc_event
+
+VMEXPORT Managed_Object_Handle vm_alloc_and_report_ti(unsigned size, 
+    Allocation_Handle p_vtable, void *thread_pointer, Class* object_class)
+{
+    SuspendDisabledChecker sdc;
+    Managed_Object_Handle handle = gc_alloc(size, p_vtable, thread_pointer);
+
+    if (handle) 
+        jvmti_process_vm_object_alloc_event((ManagedObject**) &handle, object_class, size);
+
+    return handle;
+} // vm_alloc_and_report_ti
 
 /*
  * Send Exception event

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_general.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_general.cpp?view=diff&rev=470512&r1=470511&r2=470512
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_general.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_general.cpp Thu Nov  2 12:36:44 2006
@@ -88,7 +88,7 @@
 
     // Disable all global events for this environment
     int iii;
-    for (iii = JVMTI_MIN_EVENT_TYPE_VAL; iii < JVMTI_MAX_EVENT_TYPE_VAL; iii++)
+    for (iii = JVMTI_MIN_EVENT_TYPE_VAL; iii <= JVMTI_MAX_EVENT_TYPE_VAL; iii++)
         remove_event_from_global(env, (jvmtiEvent)iii);
 
     // Disable all thread local events for this environment, do it only in live phase
@@ -103,7 +103,7 @@
         jthread *threads;
         jvmtiGetAllThreads(env, &threads_number, &threads);
         for (int jjj = 0; jjj < threads_number; jjj++)
-            for (iii = JVMTI_MIN_EVENT_TYPE_VAL; iii < JVMTI_MAX_EVENT_TYPE_VAL; iii++)
+            for (iii = JVMTI_MIN_EVENT_TYPE_VAL; iii <= JVMTI_MAX_EVENT_TYPE_VAL; iii++)
                 remove_event_from_thread(env, (jvmtiEvent)iii, threads[jjj]);
         _deallocate((unsigned char *)threads);
     }

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/object_generic.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/object_generic.cpp?view=diff&rev=470512&r1=470511&r2=470512
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/object_generic.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/object_generic.cpp Thu Nov  2 12:36:44 2006
@@ -144,7 +144,8 @@
             return NULL;
         }
         size = vt->allocated_size;
-        result = (ManagedObject *) gc_alloc(size, vt->clss->allocation_handle, vm_get_gc_thread_local());
+        result = (ManagedObject *) vm_alloc_and_report_ti(size, 
+            vt->clss->allocation_handle, vm_get_gc_thread_local(), vt->clss);
     }
     if (result == NULL) {
         tmn_suspend_enable(); 

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/vm_strings.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/vm_strings.cpp?view=diff&rev=470512&r1=470511&r2=470512
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/vm_strings.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/vm_strings.cpp Thu Nov  2 12:36:44 2006
@@ -244,7 +244,8 @@
     assert(clss);
 
     unsigned sz = vm_array_size(clss->vtable, unicode_length);
-    Vector_Handle array = gc_alloc(sz, clss->allocation_handle, vm_get_gc_thread_local());
+    Vector_Handle array = vm_alloc_and_report_ti(sz, clss->allocation_handle, 
+            vm_get_gc_thread_local(), clss);
     if (!array) { // OutOfMemory should be thrown
         *str = NULL;
         exn_raise_object(VM_Global_State::loader_env->java_lang_OutOfMemoryError);