Windows: Fix hang when adding several files at once.

This commit is contained in:
Joey Hess 2013-06-14 17:35:45 -04:00
parent e02fdd2270
commit 0e05613083
4 changed files with 35 additions and 17 deletions

View file

@ -43,7 +43,7 @@ start restartable cmd params env = do
start' :: CoProcessSpec -> IO CoProcessState
start' s = do
(to, from, _err, pid) <- runInteractiveProcess (coProcessCmd s) (coProcessParams s) Nothing (coProcessEnv s)
(pid, to, from) <- startInteractiveProcess (coProcessCmd s) (coProcessParams s) (coProcessEnv s)
return $ CoProcessState pid to from s
stop :: CoProcessHandle -> IO ()

View file

@ -26,7 +26,7 @@ module Utility.Process (
withBothHandles,
withQuietOutput,
createProcess,
runInteractiveProcess,
startInteractiveProcess,
stdinHandle,
stdoutHandle,
stderrHandle,
@ -34,7 +34,7 @@ module Utility.Process (
import qualified System.Process
import System.Process as X hiding (CreateProcess(..), createProcess, runInteractiveProcess, readProcess, readProcessWithExitCode, system, rawSystem, runInteractiveCommand, runProcess)
import System.Process hiding (createProcess, runInteractiveProcess, readProcess)
import System.Process hiding (createProcess, readProcess)
import System.Exit
import System.IO
import System.Log.Logger
@ -300,17 +300,19 @@ createProcess p = do
debugProcess p
System.Process.createProcess p
runInteractiveProcess
:: FilePath
-> [String]
-> Maybe FilePath
-> Maybe [(String, String)]
-> IO (Handle, Handle, Handle, ProcessHandle)
runInteractiveProcess f args c e = do
debugProcess $ (proc f args)
{ std_in = CreatePipe
, std_out = CreatePipe
, std_err = CreatePipe
, env = e
}
System.Process.runInteractiveProcess f args c e
{- Starts an interactive process. Unlike runInteractiveProcess in
- System.Process, stderr is inherited. -}
startInteractiveProcess
:: FilePath
-> [String]
-> Maybe [(String, String)]
-> IO (ProcessHandle, Handle, Handle)
startInteractiveProcess cmd args environ = do
let p = (proc cmd args)
{ std_in = CreatePipe
, std_out = CreatePipe
, std_err = Inherit
, env = environ
}
(Just from, Just to, _, pid) <- createProcess p
return (pid, to, from)

1
debian/changelog vendored
View file

@ -20,6 +20,7 @@ git-annex (4.20130602) UNRELEASED; urgency=low
with git annex sync or by the assistant.
* Android: Fix use of cp command to not try to use features present
only on build system.
* Windows: Fix hang when adding several files at once.
-- Joey Hess <joeyh@debian.org> Mon, 10 Jun 2013 12:52:44 -0400

View file

@ -180,3 +180,18 @@ info"]
# End of transcript or log.
"""]]
> Reproduced this, and git update-index was in fact not hanging.
> Instead, after that was done, it tried to stop the git hash-object
> process, and this hung.
>
> It seems that the use of runInteractiveProcess is at fault somehow,
> and I guess it must be due to it opening a pipe for stderr, which
> I don't need or want. Perhaps I need to ensure I read from that pipe,
> or windows keeps the process from terminating. (Unix would just toss the piped
> data away.)
>
> That was the only place runInteractiveProcess was used, so I replaced
> it with an alternative that lets stderr be inherited. With this change,
> I have successfully added 1000 files to the annex in one go, with no
> hang. Provisionally [[done]]. --[[Joey]]