discard any exception thrown while trying to kill worker threads

Since there's a race here, and since Kyle saw an exception leak out,
which I have not been able to reproduce that. See my comment for what
I think might be going on.

Note that, I used tryNonAsync, because it seems a later tryNonAsync
caught the exception. I don't actually understand how it did, as I
understand exception classification, it's the data type, not the way it
was thrown. One possibility is that the async exception may have been wrapped
in some other, non-async exception, and Show displayed it the same way.
This commit is contained in:
Joey Hess 2020-08-10 16:18:47 -04:00
parent 020e588262
commit c59a51a065
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
2 changed files with 17 additions and 1 deletions

View file

@ -328,7 +328,7 @@ outputFilter cmd params environ outfilter errfilter =
-- maximum for them to finish and then cancel them.
-- (One program that has behaved this way in the past is
-- openssh.)
race_
void $ tryNonAsync $ race_
(wait outt >> wait errt)
(threadDelaySeconds (Seconds 2) >> cancel outt >> cancel errt)
return ret

View file

@ -0,0 +1,16 @@
[[!comment format=mdwn
username="joey"
subject="""comment 15"""
date="2020-08-10T20:06:28Z"
content="""
Hmm, come to think of it, `wait errt` is racing
`cancel errt`, so what if cancel kills the errt thread,
and before `race` noticed cancel is done, the wait thread
sees errt, died of an an AsyncCancelled exception and rethrows that?
Result could be the exception leaking out, perhaps.
It might be that async now avoids that, and some other version didn't, or
you could be getting unlucky with the race.
So, I've added something to catch that exception in case it leaks.
"""]]