src/share/vm/services/gcNotifier.cpp

Print this page

        

@@ -177,24 +177,41 @@
                           CHECK_NH);
 
   return Handle(gcInfo_instance());
 }
 
+class NotificationMark : public StackObj {
+  // This class is used in GCNitifer::sendNotification to ensure that the
+  // GCNotificationRequest object is properly cleaned up, whatever path
+  // is used to exit the method.
+  GCNotificationRequest* _request;
+public:
+  NotificationMark(GCNotificationRequest* r) {
+    _request = r;
+  }
+  ~NotificationMark() {
+    assert(_request != NULL, "Sanity check");
+    delete _request;
+  }
+};
+
 void GCNotifier::sendNotification(TRAPS) {
   ResourceMark rm(THREAD);
+  HandleMark hm(THREAD);
   GCNotificationRequest *request = getRequest();
   if(request != NULL) {
-    Handle objGcInfo = createGcInfo(request->gcManager,request->gcStatInfo,THREAD);
+    NotificationMark nm(request);
+    Handle objGcInfo = createGcInfo(request->gcManager,request->gcStatInfo, CHECK);
 
     Handle objName = java_lang_String::create_from_platform_dependent_str(request->gcManager->name(), CHECK);
     Handle objAction = java_lang_String::create_from_platform_dependent_str(request->gcAction, CHECK);
     Handle objCause = java_lang_String::create_from_platform_dependent_str(request->gcCause, CHECK);
 
     klassOop k = Management::sun_management_GarbageCollectorImpl_klass(CHECK);
-    instanceKlassHandle gc_mbean_klass (THREAD, k);
+    instanceKlassHandle gc_mbean_klass(THREAD, k);
 
-    instanceOop gc_mbean = request->gcManager->get_memory_manager_instance(THREAD);
+    instanceOop gc_mbean = request->gcManager->get_memory_manager_instance(CHECK);
     instanceHandle gc_mbean_h(THREAD, gc_mbean);
     if (!gc_mbean_h->is_a(k)) {
       THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
                 "This GCMemoryManager doesn't have a GarbageCollectorMXBean");
     }

@@ -211,13 +228,8 @@
                             gc_mbean_klass,
                             vmSymbols::createGCNotification_name(),
                             vmSymbols::createGCNotification_signature(),
                             &args,
                             CHECK);
-    if (HAS_PENDING_EXCEPTION) {
-      CLEAR_PENDING_EXCEPTION;
     }
-
-    delete request;
-  }
 }