--- old/src/share/vm/services/gcNotifier.cpp Fri Feb 10 14:30:23 2012 +++ new/src/share/vm/services/gcNotifier.cpp Fri Feb 10 14:30:22 2012 @@ -179,11 +179,28 @@ 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); @@ -190,9 +207,9 @@ 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(), @@ -213,11 +230,6 @@ vmSymbols::createGCNotification_signature(), &args, CHECK); - if (HAS_PENDING_EXCEPTION) { - CLEAR_PENDING_EXCEPTION; - } - - delete request; } }