Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 329499

Summary: Resizable Tracker leaks Curser on Mac OSX
Product: [Eclipse Project] Platform Reporter: Craig Reichenbach <creichen>
Component: SWTAssignee: 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    

Description Craig Reichenbach CLA 2010-11-04 17:41:20 EDT
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.
Comment 1 Craig Reichenbach CLA 2010-11-04 17:43:49 EDT
Note that adding tracker.dispose() to the snippet below inside createResizableTracker() makes no difference, the NSCurser is still leaked.
Comment 2 Scott Kovatch CLA 2010-11-08 12:53:10 EST
This has to be on Cocoa, if 4.1 is the version. I can reproduce on 3.7m3 Cocoa. Fixed > 20101108.
Comment 3 Craig Reichenbach CLA 2010-11-08 15:11:08 EST
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.