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.
-- 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
--- /dev/null
+[[!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.
+"""]]