improve slightly

This probably avoids the situation that caused the exception to be
thrown. It also makes sure that both threads end up canceled in the end,
while before the exception from wait outt could have caused errt to
never be waited on.
This commit is contained in:
Joey Hess 2020-08-10 16:33:58 -04:00
parent c59a51a065
commit 4466c1001d
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38

View file

@ -319,6 +319,7 @@ outputFilter cmd params environ outfilter errfilter =
outt <- async $ tryIO (outfilter outh) >> hClose outh
errt <- async $ tryIO (errfilter errh) >> hClose errh
ret <- waitForProcess pid
-- Normally, now that the process has exited, the threads
-- will finish processing its output and terminate.
-- But, just in case the process did something evil like
@ -330,7 +331,10 @@ outputFilter cmd params environ outfilter errfilter =
-- openssh.)
void $ tryNonAsync $ race_
(wait outt >> wait errt)
(threadDelaySeconds (Seconds 2) >> cancel outt >> cancel errt)
(threadDelaySeconds (Seconds 2))
cancel outt
cancel errt
return ret
go _ _ _ _ = error "internal"