Fix busy-wait in SysTools.builderMainLoop
authorDouglas Wilson <douglas.wilson@gmail.com>
Thu, 20 Jul 2017 12:48:12 +0000 (08:48 -0400)
committerBen Gamari <ben@smart-cactus.org>
Thu, 20 Jul 2017 12:48:13 +0000 (08:48 -0400)
commit194384f1318e0553e0c5ce621ca0903b55862eb3
tree349d79c464898c26049ea05e290b0eb8a2d626fd
parenta85a5959d2c00dff609e5945787803423bf3423e
Fix busy-wait in SysTools.builderMainLoop

Test T13701 was failing sporadically. The problem manifested while the
test was run on a system under load. Profiling showed the increased
allocations were in SysTools.builderMainLoop.loop, during calls to the
assembler. This was due to loop effectively busy-waiting from when both
stdin and stderr handles were closed, until getProcessExitCode
succeeded.

This is fixed by removing exit code handling from loop. We now wait for
loop to finish, then read the exit code with waitForProcess.

Some exception safety is added: the readerProc threads will now be
killed and the handles will be closed if an exception is thrown.

A TODO saying that threads dying is not accounted for is removed. I
believe that this case is handled by readerProc sending EOF in a finally
clause.

Test Plan:
Replicate test failures using procedure on the ticket, verify that they
do not occur with this patch.

Reviewers: austin, bgamari

Reviewed By: bgamari

Subscribers: rwbarton, thomie

GHC Trac Issues: #13987

Differential Revision: https://phabricator.haskell.org/D3748
compiler/main/SysTools.hs
testsuite/tests/perf/compiler/all.T