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

Bug 271393

Summary: NullPointerException when closing the CVS compare editor.
Product: [Eclipse Project] PDE Reporter: Leo Dos Santos <leo.dos.santos>
Component: UIAssignee: PDE-UI-Inbox <pde-ui-inbox>
Status: RESOLVED FIXED QA Contact:
Severity: normal    
Priority: P3 CC: daniel_megert, darin.eclipse, eclipse.felipe, jamesblackburn+eclipse, jeffmcaffer, markus.kell.r, pwebster, robert.elves, tomasz.zarna
Version: 3.5   
Target Milestone: 3.5 M7   
Hardware: All   
OS: Mac OS X   
Whiteboard:
Attachments:
Description Flags
Fix
none
Fix 2
none
Fix for PluginContentMergeViewer none

Description Leo Dos Santos CLA 2009-04-06 20:39:49 EDT
I've been seeing NPE exceptions with the Cocoa build when closing the CVS compare editor. I'm not sure if this belongs to SWT, but I figure it's a good place to start. Stack forthcoming.

Version: 3.5.0
Build id: I20090401-1325
Comment 1 Leo Dos Santos CLA 2009-04-06 20:41:01 EDT
eclipse.buildId=I20090401-1325
java.version=1.5.0_16
java.vendor=Apple Inc.
BootLoader constants: OS=macosx, ARCH=x86, WS=cocoa, NL=en_CA
Framework arguments:  -product org.eclipse.sdk.ide
Command-line arguments:  -product org.eclipse.sdk.ide -data /Users/leods/Development/Eclipse-3.5/Launching/../Bootstrap -dev file:/Users/leods/Development/Eclipse-3.5/Launching/.metadata/.plugins/org.eclipse.pde.core/Extras/dev.properties -os macosx -ws cocoa -arch x86


Error
Mon Apr 06 17:36:54 PDT 2009
An unexpected exception was thrown.

java.lang.NullPointerException
	at org.eclipse.swt.graphics.TextLayout.computeRuns(TextLayout.java:199)
	at org.eclipse.swt.graphics.TextLayout.getLineCount(TextLayout.java:934)
	at org.eclipse.swt.custom.StyledTextRenderer.getTextLayout(StyledTextRenderer.java:947)
	at org.eclipse.swt.custom.StyledTextRenderer.getTextLayout(StyledTextRenderer.java:702)
	at org.eclipse.swt.custom.StyledText.getPointAtOffset(StyledText.java:5285)
	at org.eclipse.swt.custom.StyledText.getLocationAtOffset(StyledText.java:4216)
	at org.eclipse.jface.text.CursorLinePainter.drawHighlightLine(CursorLinePainter.java:176)
	at org.eclipse.jface.text.CursorLinePainter.deactivate(CursorLinePainter.java:194)
	at org.eclipse.jface.text.PaintManager.removePainter(PaintManager.java:214)
	at org.eclipse.jface.text.TextViewer.removePainter(TextViewer.java:5040)
	at org.eclipse.ui.texteditor.SourceViewerDecorationSupport.hideCursorLine(SourceViewerDecorationSupport.java:709)
	at org.eclipse.ui.texteditor.SourceViewerDecorationSupport.updateTextDecorations(SourceViewerDecorationSupport.java:306)
	at org.eclipse.ui.texteditor.SourceViewerDecorationSupport.dispose(SourceViewerDecorationSupport.java:387)
	at org.eclipse.compare.contentmergeviewer.TextMergeViewer.handleDispose(TextMergeViewer.java:1852)
	at org.eclipse.pde.internal.ui.compare.ManifestContentMergeViewer.handleDispose(ManifestContentMergeViewer.java:60)
	at org.eclipse.jface.viewers.ContentViewer$2.widgetDisposed(ContentViewer.java:214)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:117)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1211)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1235)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1216)
	at org.eclipse.swt.widgets.Widget.release(Widget.java:1067)
	at org.eclipse.swt.widgets.Control.release(Control.java:2442)
	at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:753)
	at org.eclipse.swt.widgets.Widget.release(Widget.java:1070)
	at org.eclipse.swt.widgets.Control.release(Control.java:2442)
	at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:753)
	at org.eclipse.swt.widgets.Widget.release(Widget.java:1070)
	at org.eclipse.swt.widgets.Control.release(Control.java:2442)
	at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:753)
	at org.eclipse.swt.widgets.Widget.release(Widget.java:1070)
	at org.eclipse.swt.widgets.Control.release(Control.java:2442)
	at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:753)
	at org.eclipse.swt.widgets.Widget.release(Widget.java:1070)
	at org.eclipse.swt.widgets.Control.release(Control.java:2442)
	at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:753)
	at org.eclipse.swt.widgets.Widget.release(Widget.java:1070)
	at org.eclipse.swt.widgets.Control.release(Control.java:2442)
	at org.eclipse.swt.widgets.Widget.dispose(Widget.java:522)
	at org.eclipse.ui.internal.PartPane.dispose(PartPane.java:180)
	at org.eclipse.ui.internal.WorkbenchPartReference.dispose(WorkbenchPartReference.java:681)
	at org.eclipse.ui.internal.WorkbenchPage.disposePart(WorkbenchPage.java:1715)
	at org.eclipse.ui.internal.WorkbenchPage.handleDeferredEvents(WorkbenchPage.java:1422)
	at org.eclipse.ui.internal.WorkbenchPage.deferUpdates(WorkbenchPage.java:1406)
	at org.eclipse.ui.internal.WorkbenchPage.closeEditors(WorkbenchPage.java:1380)
	at org.eclipse.ui.internal.WorkbenchPage.closeEditor(WorkbenchPage.java:1435)
	at org.eclipse.ui.internal.EditorPane.doHide(EditorPane.java:61)
	at org.eclipse.ui.internal.PartStack.close(PartStack.java:543)
	at org.eclipse.ui.internal.EditorStack.close(EditorStack.java:206)
	at org.eclipse.ui.internal.PartStack$1.close(PartStack.java:122)
	at org.eclipse.ui.internal.presentations.util.TabbedStackPresentation$1.handleEvent(TabbedStackPresentation.java:83)
	at org.eclipse.ui.internal.presentations.util.AbstractTabFolder.fireEvent(AbstractTabFolder.java:270)
	at org.eclipse.ui.internal.presentations.util.AbstractTabFolder.fireEvent(AbstractTabFolder.java:279)
	at org.eclipse.ui.internal.presentations.defaultpresentation.DefaultTabFolder.access$1(DefaultTabFolder.java:1)
	at org.eclipse.ui.internal.presentations.defaultpresentation.DefaultTabFolder$1.closeButtonPressed(DefaultTabFolder.java:70)
	at org.eclipse.ui.internal.presentations.PaneFolder.notifyCloseListeners(PaneFolder.java:626)
	at org.eclipse.ui.internal.presentations.PaneFolder$3.close(PaneFolder.java:206)
	at org.eclipse.swt.custom.CTabFolder.onMouse(CTabFolder.java:2191)
	at org.eclipse.swt.custom.CTabFolder$1.handleEvent(CTabFolder.java:330)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1211)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1235)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1220)
	at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:1038)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3239)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2907)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2393)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2357)
	at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2209)
	at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:499)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:492)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:113)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:194)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:368)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:585)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:556)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:511)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1284)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1260)

Comment 2 Felipe Heidrich CLA 2009-04-07 09:53:41 EDT
This can happen if the application disposes a color that is still being used by TextLayout. Moving to Compare.
Comment 3 Tomasz Zarna CLA 2009-04-08 04:41:09 EDT
Don't you think it looks pretty much the same as bug 258114, which has been fixed in 3.5M4?
Comment 4 Leo Dos Santos CLA 2009-04-08 13:24:48 EDT
Yup looks like a duplicate, but the problem still exists post-M4. In my case, I see it when I close the compare editor to an outgoing change in any manifest.mf file.
Comment 5 Felipe Heidrich CLA 2009-04-16 10:53:25 EDT
The problem is probably somewhere here:
CursorLinePainter.drawHighlightLine(CursorLinePainter.java:176)
CursorLinePainter.deactivate(CursorLinePainter.java:194)
PaintManager.removePainter(PaintManager.java:214)


They dispose colors that are in use by StyledText. Very similar to bug 258114.

Moving to UI, apparently the problem is in (JFace Text) CursorLinePainter.
Comment 6 Felipe Heidrich CLA 2009-04-16 10:54:07 EDT
*** Bug 272346 has been marked as a duplicate of this bug. ***
Comment 7 Dani Megert CLA 2009-04-17 03:38:44 EDT
Looks like a dup of bug 272011.
Comment 8 Jeff McAffer CLA 2009-04-27 03:05:10 EDT
these bugs are pointing to each other in a circular fashion.  The problem is still happening in i0421.  Would be great if someone took ownership and fixed it.
Comment 9 Dani Megert CLA 2009-04-27 03:13:37 EDT
>The problem is
>still happening in i0421.
Do you have steps? Are you also on Mac OS X - Cocoa?
Comment 10 Jeff McAffer CLA 2009-04-27 04:07:42 EDT
carbon as per Bug 272346 

Note that my original bug was closed as a dupe of this but my problem is on *opening* the compare editor.  It only happens sometimes but it is frequent (say every 5 or 10 compare editor opens).
Comment 11 Tomasz Zarna CLA 2009-04-27 11:03:16 EDT
I'm not sure why this have been sent back to Compare, even though it looks more like an UI issue (see comment 5). From my point of view, what was done wrong in Compare has been fixed on bug 258114, but I may be missing something... Anyway, having a set of reproducible steps would be great, no matter if this is a Compare or UI issue.
Comment 12 Jeff McAffer CLA 2009-04-27 11:12:43 EDT
Yup, steps would be great.  All I can offer is
- select some projects that have outgoing or incoming changes
- synchronize with HEAD (whatever)
- click around in the resultant compare browser
- observe random NPE while opening the editor.

For more information on my case see my original bug 272346 that was closed as a dup of this.
Comment 13 Leo Dos Santos CLA 2009-04-27 13:38:22 EDT
In my case I see this whenever I have outgoing changes in a manifest file. The NPE comes up when I close the compare editor.
Comment 14 Dani Megert CLA 2009-04-28 04:51:45 EDT
Markus, please try whether you can reproduce.
Comment 15 Tomasz Zarna CLA 2009-04-28 07:05:27 EDT
I managed to reproduce it in I20090427-1800 Cacoa basing on steps given by Markus on bug 273951, comment 1.
Comment 16 Markus Keller CLA 2009-04-28 07:59:21 EDT
Created attachment 133536 [details]
Fix

I can reproduce in I20090427-1800 Cocoa with these steps:
1. change a line in a MANIFEST.MF
2. close the MANIFEST.MF editor
3. in the Synchronize view, open the outgoing change
4. close the compare editor with Command+W

The problem only shows up on the Mac because TextLayout.computeRuns(..) on Cocoa actually accesses the content of colors, but the same method on Windows does not.

The bug is in the ManifestContentMergeViewer, which disposes colors before widgets that use this color are disposed.

I think TextMergeViewer.handleDispose(DisposeEvent) could have a similar problem (should dispose fColors at the very end), but I could not find steps to show this in real life.
Comment 17 Markus Keller CLA 2009-04-28 08:00:15 EDT
Moving to PDE to release the fix.
Comment 18 Markus Keller CLA 2009-04-28 08:15:07 EDT
Created attachment 133542 [details]
Fix 2

PluginContentMergeViewer has the same problem (bug 272011).
Comment 19 Darin Wright CLA 2009-04-28 13:48:00 EDT
Applied patch.
Comment 20 Markus Keller CLA 2009-04-28 17:24:47 EDT
Created attachment 133643 [details]
Fix for PluginContentMergeViewer

> PluginContentMergeViewer has the same problem (bug 272011).

Something went wrong when I created the Fix 2. It was the same as the first Fix (missing the change in PluginContentMergeViewer). Please release this one as well.
Comment 21 Markus Keller CLA 2009-04-28 17:25:27 EDT
.
Comment 22 Darin Wright CLA 2009-04-28 17:42:18 EDT
Applied patch.
Comment 23 Dani Megert CLA 2009-04-29 02:43:51 EDT
>I think TextMergeViewer.handleDispose(DisposeEvent) could have a similar
>problem (should dispose fColors at the very end), but I could not find steps to
>show this in real life.
Right. Filed bug 274239 to track this.