7174718: [macosx] Regression in 7u6 b12: PopupFactory leaks DefaultFrames.
Summary: Fix memory management
Reviewed-by: art, serb
--- 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();
}
});
--- 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);
+}
+