Community
Participate
Working Groups
CElementHyperlinkDetector may block UI thread for a long time if access to pdom database is slow. Here is an example stack: "main" prio=10 tid=0x080d4c00 nid=0x5970 waiting for monitor entry [0xff9ac000] java.lang.Thread.State: BLOCKED (on object monitor) at org.eclipse.cdt.internal.core.pdom.db.Database.getChunk(Database.java:270) - waiting to lock <0xbaf1c3b8> (a org.eclipse.cdt.internal.core.pdom.db.ChunkCache) at org.eclipse.cdt.internal.core.pdom.db.Database.getRecPtr(Database.java:476) at org.eclipse.cdt.internal.core.pdom.dom.PDOMInclude.isResolved(PDOMInclude.java:243) at org.eclipse.cdt.internal.core.index.CIndex.resolveInclude(CIndex.java:238) at org.eclipse.cdt.internal.core.index.IndexBasedFileContentProvider.collectFileContent(IndexBasedFileContentProvider.java:185) at org.eclipse.cdt.internal.core.index.IndexBasedFileContentProvider.collectFileContent(IndexBasedFileContentProvider.java:187) at org.eclipse.cdt.internal.core.index.IndexBasedFileContentProvider.collectFileContent(IndexBasedFileContentProvider.java:187) at org.eclipse.cdt.internal.core.index.IndexBasedFileContentProvider.getContentForInclusion(IndexBasedFileContentProvider.java:125) at org.eclipse.cdt.internal.core.parser.scanner.CPreprocessor$1.checkFile(CPreprocessor.java:103) at org.eclipse.cdt.internal.core.parser.scanner.CPreprocessor$1.checkFile(CPreprocessor.java:1) at org.eclipse.cdt.internal.core.parser.scanner.CPreprocessor.findInclusion(CPreprocessor.java:966) at org.eclipse.cdt.internal.core.parser.scanner.CPreprocessor.executeInclude(CPreprocessor.java:1251) at org.eclipse.cdt.internal.core.parser.scanner.CPreprocessor.executeDirective(CPreprocessor.java:1067) at org.eclipse.cdt.internal.core.parser.scanner.CPreprocessor.internalFetchToken(CPreprocessor.java:726) at org.eclipse.cdt.internal.core.parser.scanner.CPreprocessor.fetchToken(CPreprocessor.java:469) at org.eclipse.cdt.internal.core.parser.scanner.CPreprocessor.nextToken(CPreprocessor.java:563) at org.eclipse.cdt.internal.core.dom.parser.AbstractGNUSourceCodeParser.fetchToken(AbstractGNUSourceCodeParser.java:260) at org.eclipse.cdt.internal.core.dom.parser.AbstractGNUSourceCodeParser.nextToken(AbstractGNUSourceCodeParser.java:284) at org.eclipse.cdt.internal.core.dom.parser.AbstractGNUSourceCodeParser.acceptInactiveCodeBoundary(AbstractGNUSourceCodeParser.java:345) at org.eclipse.cdt.internal.core.dom.parser.AbstractGNUSourceCodeParser.declarationList(AbstractGNUSourceCodeParser.java:1283) at org.eclipse.cdt.internal.core.dom.parser.AbstractGNUSourceCodeParser.parseTranslationUnit(AbstractGNUSourceCodeParser.java:1253) at org.eclipse.cdt.internal.core.dom.parser.AbstractGNUSourceCodeParser.translationUnit(AbstractGNUSourceCodeParser.java:1248) at org.eclipse.cdt.internal.core.dom.parser.AbstractGNUSourceCodeParser.parse(AbstractGNUSourceCodeParser.java:645) at org.eclipse.cdt.core.dom.parser.AbstractCLikeLanguage.getASTTranslationUnit(AbstractCLikeLanguage.java:143) at org.eclipse.cdt.internal.core.model.TranslationUnit.getAST(TranslationUnit.java:806) at org.eclipse.cdt.internal.core.model.TranslationUnit.getAST(TranslationUnit.java:770) at org.eclipse.cdt.internal.core.model.ASTCache$1.run(ASTCache.java:295) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) at org.eclipse.cdt.internal.core.model.ASTCache.createAST(ASTCache.java:289) at org.eclipse.cdt.internal.core.model.ASTCache.getAST(ASTCache.java:168) at org.eclipse.cdt.internal.core.model.ASTCache.runOnAST(ASTCache.java:215) at org.eclipse.cdt.internal.ui.editor.ASTProvider.runOnAST(ASTProvider.java:344) at org.eclipse.cdt.internal.ui.editor.CElementHyperlinkDetector.detectHyperlinks(CElementHyperlinkDetector.java:76) at org.eclipse.ui.texteditor.HyperlinkDetectorRegistry$HyperlinkDetectorDelegate.detectHyperlinks(HyperlinkDetectorRegistry.java:80) at org.eclipse.jface.text.hyperlink.HyperlinkManager.findHyperlinks(HyperlinkManager.java:276) - locked <0xbeb7c668> (a [Lorg.eclipse.jface.text.hyperlink.IHyperlinkDetector;) at org.eclipse.jface.text.hyperlink.HyperlinkManager.mouseMove(HyperlinkManager.java:452) at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:205) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1258) at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3552) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3171) at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2629) at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2593) at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2427) at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:670) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:663) at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:115) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) 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:369) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) at (C/C++) _fini(Unknown Source) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:619) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:574) at org.eclipse.equinox.launcher.Main.run(Main.java:1407) CElementHyperlinkDetector should not wait for AST if it's not already available.
Hi Sergey, I think this is also part of bug 220585.
*** This bug has been marked as a duplicate of bug 220585 ***
Decided to track the issues in CElementHyperlinkDetector and in DefaultCFoldingStructureProvider separately.
*** cdt cvs genie on behalf of sprigogin *** Bug 324232 - CElementHyperlinkDetector blocks UI thread waiting for an AST [*] HyperlinkTest.java 1.10.2.1 http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.cdt-core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/HyperlinkTest.java?root=Tools_Project&r1=1.10&r2=1.10.2.1 [*] CElementHyperlinkDetector.java 1.18.6.1 http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.cdt-core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CElementHyperlinkDetector.java?root=Tools_Project&r1=1.18&r2=1.18.6.1
Created attachment 178685 [details] Fix CElementHyperlinkDetector no longer waits for AST.
Fixed in cdt_7_0 and HEAD.
*** cdt cvs genie on behalf of sprigogin *** Bug 324232 - CElementHyperlinkDetector blocks UI thread waiting for an AST [*] HyperlinkTest.java 1.11 http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.cdt/all/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/HyperlinkTest.java?root=Tools_Project&r1=1.10&r2=1.11 [*] CElementHyperlinkDetector.java 1.19 http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CElementHyperlinkDetector.java?root=Tools_Project&r1=1.18&r2=1.19