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

Bug 343473

Summary: Waiting for stalled shell pipe blocks the UI
Product: [Technology] JGit Reporter: Nitin Dahyabhai <thatnitind>
Component: JGitAssignee: Project Inbox <jgit.core-inbox>
Status: CLOSED DUPLICATE QA Contact:
Severity: normal    
Priority: P3 CC: remy.suen, robin.rosenberg
Version: 0.11   
Target Milestone: ---   
Hardware: PC   
OS: Windows XP   
URL: http://egit.eclipse.org/r/3193
Whiteboard:

Description Nitin Dahyabhai CLA 2011-04-20 23:29:57 EDT
0.11.3
On my Windows XP system with Cygwin, but not git, installed, the shell executions buried in jGit's FS class and synchronized through GitProvider.getData() cause my UI to block on startup.  Patch forthcoming.


	org.eclipse.equinox.launcher.Main at localhost:2418 (Suspended)	
		Daemon System Thread [Attach Listener] (Suspended)	
		Daemon System Thread [Signal Dispatcher] (Suspended)	
		Daemon System Thread [Finalizer] (Suspended)	
		Daemon System Thread [Reference Handler] (Suspended)	
		Thread [main] (Suspended)	
			waiting for: org.eclipse.egit.core.GitProvider  (id=82)	
				owned by: Thread [Worker-5] (Suspended)	
			org.eclipse.egit.core.GitProvider.getData() line: 77	
			org.eclipse.egit.core.project.RepositoryMapping.getMapping(org.eclipse.core.resources.IResource) line: 224	
			org.eclipse.egit.ui.internal.actions.CommitActionHandler(org.eclipse.egit.ui.internal.actions.RepositoryActionHandler).getProjectsInRepositoryOfSelectedResources(org.eclipse.jface.viewers.IStructuredSelection) line: 158	
			org.eclipse.egit.ui.internal.actions.CommitActionHandler(org.eclipse.egit.ui.internal.actions.RepositoryActionHandler).getProjectsInRepositoryOfSelectedResources() line: 140	
			org.eclipse.egit.ui.internal.actions.CommitActionHandler.isEnabled() line: 37	
			org.eclipse.ui.internal.handlers.HandlerProxy.isEnabled() line: 320	
			org.eclipse.core.commands.Command.isEnabled() line: 833	
			org.eclipse.core.commands.Command.setHandler(org.eclipse.core.commands.IHandler) line: 996	
			org.eclipse.ui.internal.handlers.HandlerAuthority.updateCommand(java.lang.String, org.eclipse.ui.handlers.IHandlerActivation) line: 459	
			org.eclipse.ui.internal.handlers.HandlerAuthority.processChangedCommands() line: 638	
			org.eclipse.ui.internal.handlers.HandlerAuthority.access$1(org.eclipse.ui.internal.handlers.HandlerAuthority) line: 610	
			org.eclipse.ui.internal.handlers.HandlerAuthority$1.propertyChange(org.eclipse.jface.util.PropertyChangeEvent) line: 175	
			org.eclipse.ui.internal.services.EvaluationAuthority$1.run() line: 252	
			org.eclipse.core.runtime.SafeRunner.run(org.eclipse.core.runtime.ISafeRunnable) line: 42	
			org.eclipse.ui.internal.services.EvaluationAuthority.fireServiceChange(java.lang.String, java.lang.Object, java.lang.Object) line: 246	
			org.eclipse.ui.internal.services.EvaluationAuthority.endSourceChange(java.lang.String[]) line: 197	
			org.eclipse.ui.internal.services.EvaluationAuthority.sourceChanged(java.lang.String[]) line: 135	
			org.eclipse.ui.internal.services.EvaluationAuthority(org.eclipse.ui.internal.services.ExpressionAuthority).sourceChanged(int, java.lang.String[]) line: 311	
			org.eclipse.ui.internal.services.EvaluationAuthority(org.eclipse.ui.internal.services.ExpressionAuthority).sourceChanged(int, java.lang.String, java.lang.Object) line: 302	
			org.eclipse.ui.internal.services.WorkbenchSourceProvider(org.eclipse.ui.AbstractSourceProvider).fireSourceChanged(int, java.lang.String, java.lang.Object) line: 80	
			org.eclipse.ui.internal.services.WorkbenchSourceProvider.selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection) line: 177	
			org.eclipse.ui.internal.WindowSelectionService(org.eclipse.ui.internal.AbstractSelectionService).fireSelection(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection) line: 156	
			org.eclipse.ui.internal.AbstractSelectionService$1.selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent) line: 62	
			org.eclipse.jface.viewers.Viewer$2.run() line: 164	
			org.eclipse.core.runtime.SafeRunner.run(org.eclipse.core.runtime.ISafeRunnable) line: 42	
			org.eclipse.ui.internal.JFaceUtil$1.run(org.eclipse.core.runtime.ISafeRunnable) line: 49	
			org.eclipse.jface.util.SafeRunnable.run(org.eclipse.core.runtime.ISafeRunnable) line: 175	
			org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart$PackageExplorerProblemTreeViewer(org.eclipse.jface.viewers.Viewer).fireSelectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent) line: 162	
			org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart$PackageExplorerProblemTreeViewer(org.eclipse.jface.viewers.StructuredViewer).updateSelection(org.eclipse.jface.viewers.ISelection) line: 2188	
			org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart$PackageExplorerProblemTreeViewer(org.eclipse.jface.viewers.StructuredViewer).handleSelect(org.eclipse.swt.events.SelectionEvent) line: 1211	
			org.eclipse.jface.viewers.StructuredViewer$4.widgetSelected(org.eclipse.swt.events.SelectionEvent) line: 1241	
			org.eclipse.jface.util.OpenStrategy.fireSelectionEvent(org.eclipse.swt.events.SelectionEvent) line: 239	
			org.eclipse.jface.util.OpenStrategy.access$4(org.eclipse.jface.util.OpenStrategy, org.eclipse.swt.events.SelectionEvent) line: 233	
			org.eclipse.jface.util.OpenStrategy$1.handleEvent(org.eclipse.swt.widgets.Event) line: 403	
			org.eclipse.swt.widgets.EventTable.sendEvent(org.eclipse.swt.widgets.Event) line: 84	
			org.eclipse.swt.widgets.Tree(org.eclipse.swt.widgets.Widget).sendEvent(org.eclipse.swt.widgets.Event) line: 1053	
			org.eclipse.swt.widgets.Display.runDeferredEvents() line: 4163	
			org.eclipse.swt.widgets.Display.readAndDispatch() line: 3752	
			org.eclipse.ui.internal.Workbench.runEventLoop(org.eclipse.jface.window.Window$IExceptionHandler, org.eclipse.swt.widgets.Display) line: 2696	
			org.eclipse.ui.internal.Workbench.runUI() line: 2660	
			org.eclipse.ui.internal.Workbench.access$4(org.eclipse.ui.internal.Workbench) line: 2494	
			org.eclipse.ui.internal.Workbench$7.run() line: 674	
			org.eclipse.core.databinding.observable.Realm.runWithDefault(org.eclipse.core.databinding.observable.Realm, java.lang.Runnable) line: 332	
			org.eclipse.ui.internal.Workbench.createAndRunWorkbench(org.eclipse.swt.widgets.Display, org.eclipse.ui.application.WorkbenchAdvisor) line: 667	
			org.eclipse.ui.PlatformUI.createAndRunWorkbench(org.eclipse.swt.widgets.Display, org.eclipse.ui.application.WorkbenchAdvisor) line: 149	
			org.eclipse.ui.internal.ide.application.IDEApplication.start(org.eclipse.equinox.app.IApplicationContext) line: 123	
			org.eclipse.equinox.internal.app.EclipseAppHandle.run(java.lang.Object) line: 196	
			org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(java.lang.Object) line: 110	
			org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(java.lang.Object) line: 79	
			org.eclipse.core.runtime.adaptor.EclipseStarter.run(java.lang.Object) line: 344	
			org.eclipse.core.runtime.adaptor.EclipseStarter.run(java.lang.String[], java.lang.Runnable) line: 179	
			sun.reflect.NativeMethodAccessorImpl.invoke0(java.lang.reflect.Method, java.lang.Object, java.lang.Object[]) line: not available [native method]	
			sun.reflect.NativeMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) line: 39	
			sun.reflect.DelegatingMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) line: 25	
			java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object...) line: 597	
			org.eclipse.equinox.launcher.Main.invokeFramework(java.lang.String[], java.net.URL[]) line: 622	
			org.eclipse.equinox.launcher.Main.basicRun(java.lang.String[]) line: 577	
			org.eclipse.equinox.launcher.Main.run(java.lang.String[]) line: 1410	
			org.eclipse.equinox.launcher.Main.main(java.lang.String[]) line: 1386	
		Thread [Framework Active Thread] (Suspended)	
		Daemon Thread [Framework Event Dispatcher] (Suspended)	
		Daemon Thread [Start Level Event Dispatcher] (Suspended)	
		Daemon Thread [[Timer] - Main Queue Handler] (Suspended)	
		Daemon Thread [[ThreadPool Manager] - Idle Thread] (Suspended)	
		Thread [Worker-JM] (Suspended)	
		Thread [Worker-0] (Suspended)	
		Thread [Worker-1] (Suspended)	
		Daemon Thread [Java indexing] (Suspended)	
		Thread [Worker-3] (Suspended)	
		Thread [Worker-2] (Suspended)	
		Thread [Worker-4] (Suspended)	
		Thread [Worker-5] (Suspended)	
			owns: java.io.BufferedInputStream  (id=72)	
			owns: java.io.InputStreamReader  (id=74)	
			owns: org.eclipse.egit.core.RepositoryCache  (id=80)	
				waited by: Thread [Worker-3] (Suspended)	
			owns: java.lang.Class<T> (org.eclipse.egit.core.project.GitProjectData) (id=62)	
			owns: org.eclipse.egit.core.GitProvider  (id=82)	
				waited by: Thread [main] (Suspended)	
			java.io.FileInputStream.readBytes(byte[], int, int) line: not available [native method]	
			java.io.FileInputStream.read(byte[], int, int) line: 199	
			java.io.BufferedInputStream.read1(byte[], int, int) line: 256	
			java.io.BufferedInputStream.read(byte[], int, int) line: 317	
			sun.nio.cs.StreamDecoder.readBytes() line: 264	
			sun.nio.cs.StreamDecoder.implRead(char[], int, int) line: 306	
			sun.nio.cs.StreamDecoder.read(char[], int, int) line: 158	
			java.io.InputStreamReader.read(char[], int, int) line: 167	
			java.io.BufferedReader.fill() line: 136	
			java.io.BufferedReader.readLine(boolean) line: 299	
			java.io.BufferedReader.readLine() line: 362	
			{bash,--login,-c,which git}
			org.eclipse.jgit.util.FS.readPipe(java.io.File, java.lang.String[], java.lang.String) line: 272	
			org.eclipse.jgit.util.FS_Win32_Cygwin(org.eclipse.jgit.util.FS_Win32).discoverGitPrefix() line: 106	
			org.eclipse.jgit.util.FS_Win32_Cygwin(org.eclipse.jgit.util.FS).gitPrefix() line: 305	
			org.eclipse.jgit.util.SystemReader$1.openSystemConfig(org.eclipse.jgit.lib.Config, org.eclipse.jgit.util.FS) line: 77	
			org.eclipse.jgit.storage.file.FileRepository.<init>(org.eclipse.jgit.lib.BaseRepositoryBuilder) line: 157	
			org.eclipse.jgit.storage.file.FileRepository.<init>(java.io.File) line: 128	
			org.eclipse.egit.core.RepositoryCache.lookupRepository(java.io.File) line: 52	
			org.eclipse.egit.core.project.GitProjectData.map(org.eclipse.egit.core.project.RepositoryMapping) line: 471	
			org.eclipse.egit.core.project.GitProjectData.remapAll() line: 434	
			org.eclipse.egit.core.project.GitProjectData.load() line: 427	
			org.eclipse.egit.core.project.GitProjectData.get(org.eclipse.core.resources.IProject) line: 168	
			org.eclipse.egit.core.GitProvider.getData() line: 78	
			org.eclipse.egit.core.project.RepositoryMapping.getMapping(org.eclipse.core.resources.IResource) line: 224	
			org.eclipse.egit.ui.internal.decorators.GitLightweightDecorator.decorate(java.lang.Object, org.eclipse.jface.viewers.IDecoration) line: 229	
			org.eclipse.ui.internal.decorators.LightweightDecoratorDefinition.decorate(java.lang.Object, org.eclipse.jface.viewers.IDecoration) line: 263	
			org.eclipse.ui.internal.decorators.LightweightDecoratorManager$LightweightRunnable.run() line: 81	
			org.eclipse.core.runtime.SafeRunner.run(org.eclipse.core.runtime.ISafeRunnable) line: 42	
			org.eclipse.ui.internal.decorators.LightweightDecoratorManager.decorate(java.lang.Object, org.eclipse.ui.internal.decorators.DecorationBuilder, org.eclipse.ui.internal.decorators.LightweightDecoratorDefinition) line: 365	
			org.eclipse.ui.internal.decorators.LightweightDecoratorManager.getDecorations(java.lang.Object, org.eclipse.ui.internal.decorators.DecorationBuilder) line: 347	
			org.eclipse.ui.internal.decorators.DecorationScheduler$1.ensureResultCached(java.lang.Object, boolean, org.eclipse.jface.viewers.IDecorationContext) line: 370	
			org.eclipse.ui.internal.decorators.DecorationScheduler$1.run(org.eclipse.core.runtime.IProgressMonitor) line: 330	
			org.eclipse.core.internal.jobs.Worker.run() line: 54	
		Thread [Worker-6] (Suspended)	
			waiting for: org.eclipse.core.internal.jobs.WorkerPool  (id=51)	
			java.lang.Object.wait(long) line: not available [native method]	
			org.eclipse.core.internal.jobs.WorkerPool.sleep(long) line: 188	
			org.eclipse.core.internal.jobs.WorkerPool.startJob(org.eclipse.core.internal.jobs.Worker) line: 220	
			org.eclipse.core.internal.jobs.Worker.run() line: 50	
	D:\jdk6_20\bin\javaw.exe (Apr 19, 2011 5:02:05 PM)
Comment 1 Robin Rosenberg CLA 2011-04-24 17:16:30 EDT

*** This bug has been marked as a duplicate of bug 337533 ***
Comment 2 Nitin Dahyabhai CLA 2011-04-25 09:51:42 EDT
(In reply to comment #1)
> 
> *** This bug has been marked as a duplicate of bug 337533 ***

But I have no intention of changing my PATH variable, and that patch didn't look like it was even attempting to resolve this problem.
Comment 3 Robin Rosenberg CLA 2011-04-25 10:35:15 EDT
(In reply to comment #2)
> (In reply to comment #1)
> > 
> > *** This bug has been marked as a duplicate of bug 337533 ***
> 
> But I have no intention of changing my PATH variable, and that patch didn't
> look like it was even attempting to resolve this problem.

You don't need to change PATH to use the workaround. The other bug is still
open since the patch doesn't solve the problem, it merely allows a workaround.

The problem with this hanging process is that none of the developers have been able to replicate it.

You wrote "patch forthcoming"... Any idea why it hangs on your machine yet?
Comment 4 Nitin Dahyabhai CLA 2011-04-25 13:34:52 EDT
(In reply to comment #3)
> You wrote "patch forthcoming"... Any idea why it hangs on your machine yet?

Only that it blocks reading from the child process (which I observed long ago when trying to do something similar with "aspell" on the command line as an alternate spell checker--it would randomly try to run a process and just block forever waiting for input).  The patch is/was pushed to Gerrit, but not in the correct style and responded to some instruction to better reuse threading utlity classes already in the plug-in.  Following that suggestion resulted in the deadlock reappearing, though, and I haven't had more time to spend on it to understand why the suggested solution didn't actually work for me.