You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by re...@apache.org on 2009/12/09 10:08:42 UTC

svn commit: r888739 - /harmony/enhanced/classlib/trunk/modules/instrument/src/main/native/instrument/shared/inst_agt.c

Author: regisxu
Date: Wed Dec  9 09:08:41 2009
New Revision: 888739

URL: http://svn.apache.org/viewvc?rev=888739&view=rev
Log:
updating capabilities in instrument agent should consider JVM's potential capabilities

Modified:
    harmony/enhanced/classlib/trunk/modules/instrument/src/main/native/instrument/shared/inst_agt.c

Modified: harmony/enhanced/classlib/trunk/modules/instrument/src/main/native/instrument/shared/inst_agt.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/instrument/src/main/native/instrument/shared/inst_agt.c?rev=888739&r1=888738&r2=888739&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/instrument/src/main/native/instrument/shared/inst_agt.c (original)
+++ harmony/enhanced/classlib/trunk/modules/instrument/src/main/native/instrument/shared/inst_agt.c Wed Dec  9 09:08:41 2009
@@ -339,9 +339,9 @@
     str_support_redefine = read_attribute(vm, manifest, lwrmanifest,"can-redefine-classes");
     if(NULL != str_support_redefine){
         support_redefine = str2bol(str_support_redefine);
-        gsupport_redefine |= support_redefine;
         hymem_free_memory(str_support_redefine);
     }
+    gsupport_redefine &= support_redefine;
 
     //add bootclasspath
 
@@ -362,6 +362,10 @@
 JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *vm, char *options, void *reserved){
     PORT_ACCESS_FROM_JAVAVM(vm);
     VMI_ACCESS_FROM_JAVAVM(vm);
+    jvmtiError jvmti_err;
+    JNIEnv *env = NULL;
+    static jvmtiEnv *jvmti;
+    jvmtiCapabilities updatecapabilities;
     jint err = (*vm)->GetEnv(vm, (void **)&jnienv, JNI_VERSION_1_2);
     if(JNI_OK != err){
         return err;
@@ -371,8 +375,6 @@
         jvmtiCapabilities capabilities;
         jvmtiError jvmti_err;
         jvmtiEventCallbacks callbacks;
-        JNIEnv *env = NULL;
-        static jvmtiEnv *jvmti;
 
         gdata = hymem_allocate_memory(sizeof(AgentData));
 
@@ -383,15 +385,10 @@
         }
         gdata->jvmti = jvmti;
 
-        //set prerequisite capabilities for classfileloadhook, redefine, and VMInit event
-        memset(&capabilities, 0, sizeof(capabilities));
-        capabilities.can_generate_all_class_hook_events=1;
-        capabilities.can_redefine_classes = 1;
-        //FIXME VM doesnot support the capbility right now.
-        //capabilities.can_redefine_any_class = 1;
-        jvmti_err = (*jvmti)->AddCapabilities(jvmti, &capabilities);
-        check_jvmti_error(env, jvmti_err,
-                          "Cannot add JVMTI capabilities.");
+        //get JVMTI potential capabilities
+        jvmti_err = (*jvmti)->GetPotentialCapabilities(jvmti, &capabilities);
+        check_jvmti_error(env, jvmti_err, "Cannot get JVMTI potential capabilities.");
+        gsupport_redefine = (capabilities.can_redefine_classes == 1);
 
         //set events callback function
         (void)memset(&callbacks, 0, sizeof(callbacks));
@@ -405,7 +402,18 @@
         check_jvmti_error(env, jvmti_err, "Cannot set JVMTI VMInit event notification mode.");
     }
 
-    return Parse_Options(vm,jnienv, gdata->jvmti,options);
+    err = Parse_Options(vm,jnienv, gdata->jvmti,options);
+
+    //update capabilities JVMTI
+    memset(&updatecapabilities, 0, sizeof(updatecapabilities));
+    updatecapabilities.can_generate_all_class_hook_events = 1;
+    updatecapabilities.can_redefine_classes = gsupport_redefine;
+    //FIXME VM doesnot support the capbility right now.
+    //capabilities.can_redefine_any_class = 1;
+    jvmti_err = (*jvmti)->AddCapabilities(jvmti, &updatecapabilities);
+    check_jvmti_error(env, jvmti_err, "Cannot add JVMTI capabilities.");
+
+    return err;
 }
 
 JNIEXPORT void JNICALL Agent_OnUnload(JavaVM *vm){