8153749: New capability can_generate_early_class_hook_events
authorsspitsyn
Thu, 28 Apr 2016 00:36:46 -0700
changeset 38110 22bb1ed67962
parent 38108 95c7e9d6747c
child 38111 02d1ce4fb721
8153749: New capability can_generate_early_class_hook_events Summary: Add new capability Reviewed-by: alanb, dsamersoff
hotspot/src/share/vm/prims/jvmti.xml
hotspot/src/share/vm/prims/jvmtiEnvBase.hpp
hotspot/src/share/vm/prims/jvmtiExport.cpp
hotspot/src/share/vm/prims/jvmtiManageCapabilities.cpp
--- a/hotspot/src/share/vm/prims/jvmti.xml	Wed Apr 27 11:40:43 2016 -0700
+++ b/hotspot/src/share/vm/prims/jvmti.xml	Thu Apr 28 00:36:46 2016 -0700
@@ -9994,6 +9994,17 @@
           See <eventlink id="VMStart"/>.
         </description>
       </capabilityfield>
+      <capabilityfield id="can_generate_early_class_hook_events" since="9">
+        <description>
+          Can generate the <eventlink id="ClassFileLoadHook"/> events
+          in the primordial phase. If this capability and
+          <internallink id="jvmtiCapabilities.can_generate_all_class_hook_events">
+          <code>can_generate_all_class_hook_events</code></internallink>
+          are enabled then the <eventlink id="ClassFileLoadHook"/> events
+          can be posted for classes loaded in the primordial phase.
+          See <eventlink id="ClassFileLoadHook"/>.
+        </description>
+      </capabilityfield>
     </capabilitiestypedef>
 
     <function id="GetPotentialCapabilities" jkernel="yes" phase="onload" num="140">
@@ -12404,7 +12415,7 @@
     </parameters>
   </event>
 
-  <event label="Class File Load Hook" phase="start"
+  <event label="Class File Load Hook" phase="any"
 	 id="ClassFileLoadHook" const="JVMTI_EVENT_CLASS_FILE_LOAD_HOOK" num="54">
     <description>
       This event is sent when the VM obtains class file data,
@@ -12420,7 +12431,13 @@
       <internallink id="bci">bytecode instrumentation</internallink>
       for usage information.
       <p/>
-    This event may be sent before the VM is initialized (the start 
+    When the capabilities
+    <internallink id="jvmtiCapabilities.can_generate_early_class_hook_events">
+    <code>can_generate_early_class_hook_events</code></internallink> and
+    <internallink id="jvmtiCapabilities.can_generate_all_class_hook_events">
+    <code>can_generate_all_class_hook_events</code></internallink>
+    are enabled then this event may be sent in the primordial phase.
+    Otherwise, this event may be sent before the VM is initialized (the start 
     <functionlink id="GetPhase">phase</functionlink>).
     Some classes might not be compatible
     with the function (eg. ROMized classes) and this event will not be
@@ -12470,6 +12487,7 @@
   <origin>jvmpi</origin>
     <capabilities>
       <capability id="can_generate_all_class_hook_events"></capability>
+      <capability id="can_generate_early_class_hook_events"></capability>
     </capabilities>
     <parameters>
       <param id="jni_env">
@@ -12542,7 +12560,7 @@
   <event label="VM Start Event"
 	 id="VMStart" const="JVMTI_EVENT_VM_START" num="57" phase="start">
     <description>
-      The VM initialization event signals the start of the VM.
+      The VM start event signals the start of the VM.
       At this time JNI is live but the VM is not yet fully initialized.
       Once this event is generated, the agent is free to call any JNI function.
       This event signals the beginning of the start phase,
@@ -14419,6 +14437,10 @@
        - Add new capability can_generate_early_vmstart
        - Allow CompiledMethodLoad events at start phase
   </change>
+  <change date="14 April 2016" version="9.0.0">
+      Support for modules:
+       - Add new capability can_generate_early_class_hook_events
+  </change>
 </changehistory>
 
 </specification>
--- a/hotspot/src/share/vm/prims/jvmtiEnvBase.hpp	Wed Apr 27 11:40:43 2016 -0700
+++ b/hotspot/src/share/vm/prims/jvmtiEnvBase.hpp	Thu Apr 28 00:36:46 2016 -0700
@@ -162,6 +162,11 @@
 
   jvmtiCapabilities *get_prohibited_capabilities()  { return &_prohibited_capabilities; }
 
+  bool early_class_hook_env() {
+    return get_capabilities()->can_generate_early_class_hook_events != 0
+        && get_capabilities()->can_generate_all_class_hook_events != 0;
+  }
+
   bool early_vmstart_env() {
     return get_capabilities()->can_generate_early_vmstart != 0;
   }
--- a/hotspot/src/share/vm/prims/jvmtiExport.cpp	Wed Apr 27 11:40:43 2016 -0700
+++ b/hotspot/src/share/vm/prims/jvmtiExport.cpp	Thu Apr 28 00:36:46 2016 -0700
@@ -667,7 +667,7 @@
   }
 
   void post_to_env(JvmtiEnv* env, bool caching_needed) {
-    if (env->phase() == JVMTI_PHASE_PRIMORDIAL) {
+    if (env->phase() == JVMTI_PHASE_PRIMORDIAL && !env->early_class_hook_env()) {
       return;
     }
     unsigned char *new_data = NULL;
--- a/hotspot/src/share/vm/prims/jvmtiManageCapabilities.cpp	Wed Apr 27 11:40:43 2016 -0700
+++ b/hotspot/src/share/vm/prims/jvmtiManageCapabilities.cpp	Thu Apr 28 00:36:46 2016 -0700
@@ -136,6 +136,7 @@
   jc.can_get_owned_monitor_stack_depth_info = 1;
   jc.can_get_current_contended_monitor = 1;
   jc.can_generate_early_vmstart = 1;
+  jc.can_generate_early_class_hook_events = 1;
   return jc;
 }
 
@@ -456,6 +457,8 @@
     log_trace(jvmti)("can_generate_resource_exhaustion_threads_events");
   if (cap->can_generate_early_vmstart)
     log_trace(jvmti)("can_generate_early_vmstart");
+  if (cap->can_generate_early_class_hook_events)
+    log_trace(jvmti)("can_generate_early_class_hook_events");
 }
 
 #endif