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

Bug 182935

Summary: [implementation] SynchronizedDocument should use lock object when accessing line tracker
Product: [Eclipse Project] Platform Reporter: Dani Megert <daniel_megert>
Component: TextAssignee: Dani Megert <daniel_megert>
Status: RESOLVED FIXED QA Contact:
Severity: normal    
Priority: P3 CC: b.muskalla, benno.baumgartner, christian.dietrich.opensource, francisu, loskutov, markus.kell.r, michschn, mik.kersten, steffen.pingel, thatnitind, utilisateur_768, zverinski
Version: 3.3   
Target Milestone: 3.5 M1   
Hardware: PC   
OS: Windows XP   
See Also: https://bugs.eclipse.org/bugs/show_bug.cgi?id=474373
Whiteboard:
Attachments:
Description Flags
Fix none

Description Dani Megert CLA 2007-04-18 08:18:18 EDT
I20070417-0800.

The SynchronizedDocument should use lock object when accessing line tracker other wise bad things can happen (this probably accounts for several CCMEs, NPEs and assertion failure bugs we have).

Example from the performance tests on the fast Linux box:
java.lang.NullPointerException
at org.eclipse.jface.text.AbstractLineTracker.flushRewriteSession(AbstractLineTracker.java:293)
at org.eclipse.jface.text.AbstractLineTracker.checkRewriteSession(AbstractLineTracker.java:315)
at org.eclipse.jface.text.AbstractLineTracker.getLineInformationOfOffset(AbstractLineTracker.java:144)
at org.eclipse.jface.text.AbstractDocument.getLineInformationOfOffset(AbstractDocument.java:863)
at org.eclipse.jface.text.source.projection.ProjectionViewer.toLineStart(ProjectionViewer.java:687)
at org.eclipse.jface.text.source.projection.ProjectionViewer.addMasterDocumentRange(ProjectionViewer.java:630)
at org.eclipse.jface.text.source.projection.ProjectionViewer.executeProjectionCommands(ProjectionViewer.java:1018)
at org.eclipse.jface.text.source.projection.ProjectionViewer.catchupWithProjectionAnnotationModel(ProjectionViewer.java:1000)
at org.eclipse.jface.text.source.projection.ProjectionViewer.processCatchupRequest(ProjectionViewer.java:872)
at org.eclipse.jface.text.source.projection.ProjectionViewer$AnnotationModelListener.processModelChanged(ProjectionViewer.java:118)
at org.eclipse.jface.text.source.projection.ProjectionViewer$AnnotationModelListener.modelChanged(ProjectionViewer.java:110)
at org.eclipse.jface.text.source.AnnotationModel.fireModelChanged(AnnotationModel.java:453)
at org.eclipse.jface.text.source.AnnotationModel$InternalModelListener.modelChanged(AnnotationModel.java:107)
at org.eclipse.jface.text.source.AnnotationModel.fireModelChanged(AnnotationModel.java:453)
at org.eclipse.jface.text.source.AnnotationModel.fireModelChanged(AnnotationModel.java:419)
at org.eclipse.jface.text.source.projection.ProjectionAnnotationModel.expandAll(ProjectionAnnotationModel.java:162)
at org.eclipse.jface.text.source.projection.ProjectionAnnotationModel.expandAll(ProjectionAnnotationModel.java:99)
at org.eclipse.jface.text.source.projection.ProjectionViewer.exposeModelRange(ProjectionViewer.java:1285)
at org.eclipse.jface.text.source.projection.ProjectionViewer.findAndSelect(ProjectionViewer.java:1739)
at org.eclipse.jface.text.TextViewer$FindReplaceTarget.findAndSelect(TextViewer.java:849)
at org.eclipse.ui.texteditor.FindReplaceTarget.findAndSelect(FindReplaceTarget.java:88)
at org.eclipse.ui.texteditor.FindReplaceDialog.findAndSelect(FindReplaceDialog.java:802)
at org.eclipse.ui.texteditor.FindReplaceDialog.replaceAll(FindReplaceDialog.java:1390)
at org.eclipse.ui.texteditor.FindReplaceDialog.access$39(FindReplaceDialog.java:1367)
at org.eclipse.ui.texteditor.FindReplaceDialog$1$ReplaceAllRunnable.run(FindReplaceDialog.java:1232)
at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:67)
at org.eclipse.ui.texteditor.FindReplaceDialog.performReplaceAll(FindReplaceDialog.java:1238)
at org.eclipse.ui.texteditor.FindReplaceDialog.access$31(FindReplaceDialog.java:1221)
at org.eclipse.ui.texteditor.FindReplaceDialog$4.widgetSelected(FindReplaceDialog.java:335)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:227)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1097)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3287)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2948)
at org.eclipse.jdt.text.tests.performance.DisplayHelper.driveEventQueue(DisplayHelper.java:158)
at org.eclipse.jdt.text.tests.performance.DisplayHelper.waitForCondition(DisplayHelper.java:75)
at org.eclipse.jdt.text.tests.performance.AbstractJavaReplaceAllTest.measure(AbstractJavaReplaceAllTest.java:115)
at org.eclipse.jdt.text.tests.performance.AbstractJavaReplaceAllTest.test(AbstractJavaReplaceAllTest.java:71)
at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
at junit.extensions.TestSetup.run(TestSetup.java:25)
at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
at junit.extensions.TestSetup.run(TestSetup.java:25)
at org.eclipse.test.EclipseTestRunner.run(EclipseTestRunner.java:332)
at org.eclipse.test.EclipseTestRunner.run(EclipseTestRunner.java:202)
at org.eclipse.test.UITestApplication$3.run(UITestApplication.java:195)
at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:123)
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3264)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2951)
at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2365)
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2329)
at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2204)
at org.eclipse.ui.internal.Workbench$4.run(Workbench.java:466)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:289)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:461)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:101)
at org.eclipse.test.UITestApplication.runApplication(UITestApplication.java:138)
at org.eclipse.test.UITestApplication.run(UITestApplication.java:60)
at org.eclipse.test.UITestApplication.start(UITestApplication.java:210)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:153)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:106)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:76)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:359)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:174)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:475)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:415)
at org.eclipse.equinox.launcher.Main.run(Main.java:1140)
at org.eclipse.equinox.launcher.Main.main(Main.java:1115)
at org.eclipse.core.launcher.Main.main(Main.java:24)
Comment 1 Dani Megert CLA 2007-04-18 08:21:00 EDT
We have to do this early 3.4 to gather feedback (deadlocks, performance).
Comment 2 Dani Megert CLA 2008-02-14 04:38:42 EST
*** Bug 218725 has been marked as a duplicate of this bug. ***
Comment 3 Dani Megert CLA 2008-04-24 06:31:10 EDT
>We have to do this early 3.4 to gather feedback (deadlocks, performance).
Indeed - but mussed it. Let's try for 3.5.
Comment 4 Dani Megert CLA 2008-05-08 03:30:49 EDT
*** Bug 230933 has been marked as a duplicate of this bug. ***
Comment 5 Dani Megert CLA 2008-05-26 04:28:59 EDT
*** Bug 233907 has been marked as a duplicate of this bug. ***
Comment 6 Dani Megert CLA 2008-06-13 08:40:21 EDT
*** Bug 236967 has been marked as a duplicate of this bug. ***
Comment 7 Dani Megert CLA 2008-06-13 08:42:47 EDT
*** Bug 236405 has been marked as a duplicate of this bug. ***
Comment 8 Dani Megert CLA 2008-06-13 08:43:41 EDT
The following methods need to be added to the SynchronizableDocument:
getLineInformationOfOffset
getLineInformationOfOffset
getLineOfOffset
getLineDelimiter
getDefaultLineDelimiter
computePartitioning
startRewriteSessionOnPartitioners
stopRewriteSessionOnPartitioners

Comment 9 Dani Megert CLA 2008-06-13 08:45:51 EDT
*** Bug 226652 has been marked as a duplicate of this bug. ***
Comment 10 Dani Megert CLA 2008-06-13 10:45:22 EDT
Created attachment 104869 [details]
Fix

After committing that patch we have to watch for performance regression and deadlocks.
Comment 11 Dani Megert CLA 2008-06-17 06:03:20 EDT
*** Bug 237443 has been marked as a duplicate of this bug. ***
Comment 12 Dani Megert CLA 2008-06-20 10:05:21 EDT
Fixed in HEAD.
Available in builds > N20080619-2000.
Comment 13 Markus Keller CLA 2008-11-06 05:32:11 EST
*** Bug 253878 has been marked as a duplicate of this bug. ***
Comment 14 Andrey Loskutov CLA 2016-01-28 03:14:53 EST
Just got this stack on shutdown of Eclipse 3.8 (the bug is supposed to be fixed in 3.5?). Xtext editor is involved however, not sure if the problem on the xtext side or not:

Exception in thread "Thread-2515" java.lang.NullPointerException
        at org.eclipse.jface.text.AbstractLineTracker.flushRewriteSession(AbstractLineTracker.java:293)
        at org.eclipse.jface.text.AbstractLineTracker.checkRewriteSession(AbstractLineTracker.java:315)
        at org.eclipse.jface.text.AbstractLineTracker.getLineNumberOfOffset(AbstractLineTracker.java:160)
        at org.eclipse.jface.text.AbstractDocument.getLineOfOffset(AbstractDocument.java:915)
        at org.eclipse.xtext.ui.editor.folding.DefaultFoldedPosition.computeProjectionRegions(DefaultFoldedPosition.java:70)
        at org.eclipse.jface.text.source.projection.ProjectionViewer.computeCollapsedRegions(ProjectionViewer.java:1132)
        at org.eclipse.jface.text.source.projection.ProjectionSummary.createSummaries(ProjectionSummary.java:208)
        at org.eclipse.jface.text.source.projection.ProjectionSummary.internalUpdateSummaries(ProjectionSummary.java:157)
        at org.eclipse.jface.text.source.projection.ProjectionSummary.access$3(ProjectionSummary.java:147)
        at org.eclipse.jface.text.source.projection.ProjectionSummary$Summarizer.run(ProjectionSummary.java:72)
Comment 15 Dani Megert CLA 2016-01-28 04:52:34 EST
(In reply to Andrey Loskutov from comment #14)
> (the bug is supposed to be fixed in 3.5?).

Yes.
Comment 16 Christian Dietrich CLA 2017-08-10 04:23:28 EDT
@andrey. have you seen this issue again. see https://bugs.eclipse.org/bugs/show_bug.cgi?id=474373 as well
Comment 17 Andrey Loskutov CLA 2017-08-10 04:26:10 EDT
(In reply to Christian Dietrich from comment #16)
> @andrey. have you seen this issue again. see
> https://bugs.eclipse.org/bugs/show_bug.cgi?id=474373 as well

No, since we moved to 4.6.