Bug 380767 - Hover locks out UI
Summary: Hover locks out UI
Status: NEW
Alias: None
Product: TMF
Classification: Modeling
Component: Xtext (show other bugs)
Version: 2.3.0   Edit
Hardware: PC Windows Vista
: P3 major (vote)
Target Milestone: ---   Edit
Assignee: Project Inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2012-05-27 08:01 EDT by Ed Willink CLA
Modified: 2012-06-14 09:15 EDT (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Ed Willink CLA 2012-05-27 08:01:06 EDT
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
Comment 1 Ed Willink CLA 2012-05-27 08:31:05 EDT
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.
Comment 2 Ed Willink CLA 2012-06-14 09:15:55 EDT
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