| Summary: | Resizable Tracker leaks Curser on Mac OSX | ||
|---|---|---|---|
| Product: | [Eclipse Project] Platform | Reporter: | Craig Reichenbach <creichen> |
| Component: | SWT | Assignee: | Scott Kovatch <skovatch> |
| Status: | RESOLVED FIXED | QA Contact: | |
| Severity: | normal | ||
| Priority: | P3 | CC: | kleind, skovatch, wtracey |
| Version: | 4.1 | ||
| Target Milestone: | 3.7 M4 | ||
| Hardware: | Macintosh | ||
| OS: | Mac OS X | ||
| Whiteboard: | |||
| Bug Depends on: | |||
| Bug Blocks: | 335891 | ||
Note that adding tracker.dispose() to the snippet below inside createResizableTracker() makes no difference, the NSCurser is still leaked. This has to be on Cocoa, if 4.1 is the version. I can reproduce on 3.7m3 Cocoa. Fixed > 20101108. This is actually an issue for us with org.eclipse.swt_3.6.1, carbon. Can this also be fixed in the carbon code? (In reply to comment #2) > This has to be on Cocoa, if 4.1 is the version. I can reproduce on 3.7m3 Cocoa. > Fixed > 20101108. |
Build Identifier: org.eclipse.swt_3.6.1 When creating and resizing a Tracker on Mac OSX, a Cursor is leaked. package st.snippets; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.DeviceData; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Tracker; public class TrackerMouseDown2 { //Adapted from Snippet23.java //http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet23.java private static Point initialPoint = new Point(0, 0); private static boolean createResizableTracker = true; public static void main(String[] args) { DeviceData data = new DeviceData(); data.tracking = true; Display display = new Display(data); Sleak sleak = new Sleak(); sleak.open(); final Shell shell = new Shell(display); shell.open(); shell.addListener(SWT.MouseDown, new Listener() { public void handleEvent(Event e) { initialPoint = Display.getDefault().getCursorLocation(); if (createResizableTracker) { createResizableTracker(); } else { createStaticTracker(e); } } }); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } private static void createStaticTracker(Event e) { final Tracker tracker = new Tracker(Display.getDefault(), SWT.NONE); tracker.setRectangles(new Rectangle[] { new Rectangle(e.x, e.y, 100, 100), }); System.out.println("Opening static tracker"); tracker.open(); } private static void createResizableTracker() { final Tracker tracker = new Tracker(Display.getDefault(), SWT.RESIZE); // tracker.setStippled(true); tracker.setRectangles(new Rectangle[] { new Rectangle(initialPoint.x, initialPoint.y, 1, 1) }); System.out.println("Opening resizable tracker"); tracker.open(); try { System.out.println("Would open edit snapshot shell here"); } catch (Throwable t) { t.printStackTrace(); } } Reproducible: Always Steps to Reproduce: See snippet above, which uses Sleak: http://www.eclipse.org/articles/swt-design-2/sleak.htm Start snippet to reveal canvas. "Snap" Sleak Click on canvas and drag the tracker. Repeat "Diff" Sleak For each tracker created there is a leaked NSCursor.