< prev index next >

src/hotspot/share/prims/jvmtiImpl.cpp

Print this page

        

@@ -941,10 +941,20 @@
   event._event_data.dynamic_code_generated.code_begin = code_begin;
   event._event_data.dynamic_code_generated.code_end = code_end;
   return event;
 }
 
+JvmtiDeferredEvent JvmtiDeferredEvent::class_unload_event(const char* name) {
+  JvmtiDeferredEvent event = JvmtiDeferredEvent(TYPE_CLASS_UNLOADED);
+  // Need to make a copy of the name since we don't know how long
+  // the event poster will keep it around after we enqueue the
+  // deferred event and return. strdup() failure is handled in
+  // the post() routine below.
+  event._event_data.class_unloaded.name = os::strdup(name);
+  return event;
+}
+
 void JvmtiDeferredEvent::post() {
   assert(ServiceThread::is_service_thread(Thread::current()),
          "Service thread must post enqueued events");
   switch(_type) {
     case TYPE_COMPILED_METHOD_LOAD: {

@@ -974,10 +984,21 @@
         // release our copy
         os::free((void *)_event_data.dynamic_code_generated.name);
       }
       break;
     }
+    case TYPE_CLASS_UNLOADED: {
+      JvmtiExport::post_class_unload_internal(
+        // if strdup failed give the event a default name
+        (_event_data.class_unloaded.name == NULL)
+          ? "unknown_class" : _event_data.class_unloaded.name);
+      if (_event_data.class_unloaded.name != NULL) {
+        // release our copy
+        os::free((void *)_event_data.class_unloaded.name);
+      }
+      break;
+    }
     default:
       ShouldNotReachHere();
   }
 }
 
< prev index next >