# HG changeset patch # User anthony # Date 1340630824 -14400 # Node ID f409e6ef01852630d7861bdbbf079604802e98c2 # Parent 01bc14f0979101ad0f0427883c9d57ae01252378 7174718: [macosx] Regression in 7u6 b12: PopupFactory leaks DefaultFrames. Summary: Fix memory management Reviewed-by: art, serb diff -r 01bc14f09791 -r f409e6ef0185 jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java --- a/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Fri Jun 22 16:32:39 2012 +0400 +++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Mon Jun 25 17:27:04 2012 +0400 @@ -63,6 +63,7 @@ private static native void nativeSetNSWindowSecurityWarningPositioning(long nsWindowPtr, double x, double y, float biasX, float biasY); private static native void nativeSetEnabled(long nsWindowPtr, boolean isEnabled); private static native void nativeSynthesizeMouseEnteredExitedEvents(long nsWindowPtr); + private static native void nativeDispose(long nsWindowPtr); private static native int nativeGetNSWindowDisplayID_AppKitThread(long nsWindowPtr); @@ -423,6 +424,7 @@ EventQueue.invokeLater(new Runnable() { public void run() { contentView.dispose(); + nativeDispose(getNSWindowPtr()); CPlatformWindow.super.dispose(); } }); diff -r 01bc14f09791 -r f409e6ef0185 jdk/src/macosx/native/sun/awt/AWTWindow.m --- a/jdk/src/macosx/native/sun/awt/AWTWindow.m Fri Jun 22 16:32:39 2012 +0400 +++ b/jdk/src/macosx/native/sun/awt/AWTWindow.m Mon Jun 25 17:27:04 2012 +0400 @@ -228,6 +228,7 @@ } if (self.nsWindow == nil) return nil; // no hope either + [self.nsWindow release]; // the property retains the object already self.isEnabled = YES; self.javaPlatformWindow = platformWindow; @@ -677,9 +678,9 @@ styleBits:styleBits frameRect:frameRect contentView:contentView]; + // the window is released is CPlatformWindow.nativeDispose() - if (window) CFRetain(window); - [window release]; // GC + if (window) CFRetain(window.nsWindow); }]; JNF_COCOA_EXIT(env); @@ -1160,3 +1161,24 @@ JNF_COCOA_EXIT(env); } +JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CPlatformWindow_nativeDispose +(JNIEnv *env, jclass clazz, jlong windowPtr) +{ +JNF_COCOA_ENTER(env); + + NSWindow *nsWindow = OBJC(windowPtr); + [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ + AWTWindow *window = (AWTWindow*)[nsWindow delegate]; + + // AWTWindow holds a reference to the NSWindow in its nsWindow + // property. Unsetting the delegate allows it to be deallocated + // which releases the reference. This, in turn, allows the window + // itself be deallocated. + [nsWindow setDelegate: nil]; + + [window release]; + }]; + +JNF_COCOA_EXIT(env); +} +