Community
Participate
Working Groups
RC1: I'm seeing very poor interactive response while editing a document that takes a non-trivial amunt of time to parse. Tnhe problem seems to be that a Worker thread gets tasked with reparsing, and then the hover text on the main thread locks out waiting for the reparse. The UI thread when suspended for examination shows me: Thread [main] (Suspended) Unsafe.park(boolean, long) line: not available [native method] LockSupport.park(Object) line: 158 ReentrantReadWriteLock$NonfairSync(AbstractQueuedSynchronizer).parkAndCheckInterrupt() line: 811 ReentrantReadWriteLock$NonfairSync(AbstractQueuedSynchronizer).doAcquireShared(int) line: 941 ReentrantReadWriteLock$NonfairSync(AbstractQueuedSynchronizer).acquireShared(int) line: 1261 ReentrantReadWriteLock$ReadLock.lock() line: 594 XtextDocument$XtextDocumentLocker(AbstractReadWriteAcces<P>).readOnly(IUnitOfWork<T,P>) line: 28 BaseDocument(XtextDocument).readOnly(IUnitOfWork<T,XtextResource>) line: 78 DispatchingEObjectTextHover(AbstractEObjectHover).getHoverRegion(ITextViewer, int) line: 52 DefaultCompositeHover(AbstractCompositeHover).getHoverRegion(ITextViewer, int) line: 62 TextViewerHoverManager.computeInformation() line: 140 TextViewerHoverManager(AbstractInformationControlManager).doShowInformation() line: 1131 AbstractHoverInformationControlManager$MouseTracker.mouseHover(MouseEvent) line: 519 TypedListener.handleEvent(Event) line: 208 EventTable.sendEvent(Event) line: 84 The worker thread show me: Thread [Worker-12] (Suspended) InternalCompleteOCLParser.rulePrimaryExpCS() line: 13446 InternalCompleteOCLParser.rulePrefixedExpCS() line: 12887 InternalCompleteOCLParser.synpred105_InternalCompleteOCL_fragment() line: 17075 InternalCompleteOCLParser.synpred105_InternalCompleteOCL() line: 18284 InternalCompleteOCLParser$DFA63.specialStateTransition(int, IntStream) line: 18821 InternalCompleteOCLParser$DFA63(DFA).predict(IntStream) line: 80 InternalCompleteOCLParser.ruleExpCS() line: 12097 InternalCompleteOCLParser.ruleNestedExpCS() line: 16816 InternalCompleteOCLParser.rulePrimaryExpCS() line: 14861 InternalCompleteOCLParser.rulePrimaryExpOrLetExpCS() line: 14984 InternalCompleteOCLParser.rulePrefixedExpOrLetExpCS() line: 13136 InternalCompleteOCLParser.synpred105_InternalCompleteOCL_fragment() line: 17133 InternalCompleteOCLParser.synpred105_InternalCompleteOCL() line: 18284 InternalCompleteOCLParser$DFA63.specialStateTransition(int, IntStream) line: 18716 InternalCompleteOCLParser$DFA63(DFA).predict(IntStream) line: 80 InternalCompleteOCLParser.ruleExpCS() line: 12097 InternalCompleteOCLParser.ruleNestedExpCS() line: 16816 InternalCompleteOCLParser.rulePrimaryExpCS() line: 14861 InternalCompleteOCLParser.rulePrefixedExpCS() line: 12887 InternalCompleteOCLParser.synpred104_InternalCompleteOCL_fragment() line: 16990 InternalCompleteOCLParser.synpred104_InternalCompleteOCL() line: 18256 InternalCompleteOCLParser$DFA61.specialStateTransition(int, IntStream) line: 19824 InternalCompleteOCLParser$DFA61(DFA).predict(IntStream) line: 80 InternalCompleteOCLParser.ruleExpCS() line: 12128 InternalCompleteOCLParser.ruleNavigatingArgExpCS() line: 5721 InternalCompleteOCLParser.ruleNavigatingBarArgCS() line: 15384 InternalCompleteOCLParser.rulePrimaryExpCS() line: 14471 InternalCompleteOCLParser.rulePrimaryExpOrLetExpCS() line: 14984 InternalCompleteOCLParser.rulePrefixedExpOrLetExpCS() line: 13136 InternalCompleteOCLParser.synpred105_InternalCompleteOCL_fragment() line: 17133 InternalCompleteOCLParser.synpred105_InternalCompleteOCL() line: 18284 InternalCompleteOCLParser$DFA63.specialStateTransition(int, IntStream) line: 18716 InternalCompleteOCLParser$DFA63(DFA).predict(IntStream) line: 80 InternalCompleteOCLParser.ruleExpCS() line: 12097 InternalCompleteOCLParser.ruleNavigatingArgExpCS() line: 5721 InternalCompleteOCLParser.ruleNavigatingBarArgCS() line: 15384 InternalCompleteOCLParser.rulePrimaryExpCS() line: 14471 InternalCompleteOCLParser.rulePrefixedExpCS() line: 12887 InternalCompleteOCLParser.synpred104_InternalCompleteOCL_fragment() line: 16990 InternalCompleteOCLParser.synpred104_InternalCompleteOCL() line: 18256 InternalCompleteOCLParser$DFA105.specialStateTransition(int, IntStream) line: 20298 InternalCompleteOCLParser$DFA105(DFA).predict(IntStream) line: 80 InternalCompleteOCLParser.synpred105_InternalCompleteOCL_fragment() line: 17058 InternalCompleteOCLParser.synpred105_InternalCompleteOCL() line: 18284 InternalCompleteOCLParser$DFA63.specialStateTransition(int, IntStream) line: 18716 InternalCompleteOCLParser$DFA63(DFA).predict(IntStream) line: 80 InternalCompleteOCLParser.ruleExpCS() line: 12097 InternalCompleteOCLParser.ruleLetExpCS() line: 16475 InternalCompleteOCLParser.rulePrimaryExpOrLetExpCS() line: 15011 InternalCompleteOCLParser.ruleExpCS() line: 12396 InternalCompleteOCLParser.ruleLetExpCS() line: 16475 InternalCompleteOCLParser.rulePrimaryExpOrLetExpCS() line: 15011 InternalCompleteOCLParser.ruleExpCS() line: 12396 InternalCompleteOCLParser.ruleNavigatingArgExpCS() line: 5721 InternalCompleteOCLParser.ruleNavigatingBarArgCS() line: 15384 InternalCompleteOCLParser.synpred128_InternalCompleteOCL_fragment() line: 17969 InternalCompleteOCLParser.synpred128_InternalCompleteOCL() line: 18242 InternalCompleteOCLParser$DFA83.specialStateTransition(int, IntStream) line: 19976 InternalCompleteOCLParser$DFA83(DFA).predict(IntStream) line: 80 InternalCompleteOCLParser.rulePrimaryExpCS() line: 13522 InternalCompleteOCLParser.rulePrimaryExpOrLetExpCS() line: 14984 InternalCompleteOCLParser.rulePrefixedExpOrLetExpCS() line: 13136 InternalCompleteOCLParser.synpred105_InternalCompleteOCL_fragment() line: 17133 InternalCompleteOCLParser.synpred105_InternalCompleteOCL() line: 18284 InternalCompleteOCLParser$DFA63.specialStateTransition(int, IntStream) line: 18716 InternalCompleteOCLParser$DFA63(DFA).predict(IntStream) line: 80 InternalCompleteOCLParser.ruleExpCS() line: 12097 InternalCompleteOCLParser.ruleLetExpCS() line: 16475 InternalCompleteOCLParser.rulePrimaryExpOrLetExpCS() line: 15011 InternalCompleteOCLParser.ruleExpCS() line: 12396 InternalCompleteOCLParser.ruleSpecificationCS() line: 5514 InternalCompleteOCLParser.ruleInvCS() line: 3598 InternalCompleteOCLParser.ruleClassifierContextDeclCS() line: 1511 InternalCompleteOCLParser.ruleContextDeclCS() line: 1714 InternalCompleteOCLParser.rulePackageDeclarationCS() line: 4363 InternalCompleteOCLParser.ruleCompleteOCLDocumentCS() line: 407 InternalCompleteOCLParser.entryRuleCompleteOCLDocumentCS() line: 175 NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method] NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39 DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25 Method.invoke(Object, Object...) line: 597 InternalCompleteOCLParser(AbstractInternalAntlrParser).parse(String) line: 532 CompleteOCLRuntimeModule$RetokenizingCompleteOCLParser(AbstractAntlrParser).doParse(String, CharStream, NodeModelBuilder, int) line: 102 CompleteOCLRuntimeModule$RetokenizingCompleteOCLParser(AbstractAntlrParser).parse(String, CharStream) line: 84 CompleteOCLRuntimeModule$RetokenizingCompleteOCLParser(AbstractAntlrParser).doParse(Reader) line: 62 CompleteOCLRuntimeModule$RetokenizingCompleteOCLParser(AbstractParser).parse(Reader) line: 27 PartialParsingHelper.fullyReparse(IParser, IParseResult, ReplaceRegion) line: 171 PartialParsingHelper.reparse(IParser, IParseResult, ReplaceRegion) line: 101 CompleteOCLRuntimeModule$RetokenizingCompleteOCLParser(AbstractAntlrParser).doReparse(IParseResult, ReplaceRegion) line: 136 CompleteOCLRuntimeModule$RetokenizingCompleteOCLParser(AbstractParser).reparse(IParseResult, ReplaceRegion) line: 40 CompleteOCLCSResource(XtextResource).update(int, int, String) line: 217 XtextReconcilerUnitOfWork.process(XtextResource) line: 50 XtextReconcilerUnitOfWork.process(Object) line: 1 XtextReconcilerUnitOfWork(IUnitOfWork$Void<T>).exec(T) line: 36 XtextDocument$XtextDocumentLocker(AbstractReadWriteAcces<P>).modify(IUnitOfWork<T,P>) line: 49 XtextDocument$XtextDocumentLocker.modify(IUnitOfWork<T,XtextResource>) line: 181 BaseDocument(XtextDocument).internalModify(IUnitOfWork<T,XtextResource>) line: 90 XtextDocumentReconcileStrategy.reconcile(IRegion) line: 44 XtextReconciler.run(IProgressMonitor) line: 254 Worker.run() line: 54
Disabling hover doesn't help. Problem then just mives to a select on the main UI waiting for the long worker parse with read-write lock out.
RC4: The problem is that I am parsing a 5000 line file and it takes 30 to 60 seconds to perform an internalModify on a Worker thread. As soon as anything does a readOnly on the main thread the user is locked out. Perhaps non-critical readOnly activities should use a readOnlyIfIdle to - skip Hover text/Quick Fix - put up a "Sorry I'm busy" for Completion Assist with deferred update - defer Outline update etc