The [[design/assistant]] would be better if git-annex used ghc's threaded
runtime (`ghc -threaded`).

Currently, whenever the assistant code runs some external command, all
threads are blocked waiting for it to finish.

For transfers, the assistant works around this problem by forking separate
upload processes, and not waiting on them until it sees an indication that
they have finished the transfer. While this works, it's messy.. threaded
would be better.

When pulling, pushing, and merging, the assistant runs external git
commands, and this does block all other threads. The threaded runtime would
really help here.

[[done]]; the assistant now builds with the threaded runtime.
Some work still remains to run certian long-running external git commands
in their own threads to prevent them blocking things, but that is easy to
do, now. --[[Joey]] 

---

Currently, git-annex seems unstable when built with the threaded runtime.
The test suite tends to hang when testing add. `git-annex` occasionally
hangs, apparently in a futex lock. This is not the assistant hanging, and
git-annex does not otherwise use threads, so this is surprising. --[[Joey]]

> I've spent a lot of time debugging this, and trying to fix it, in the
> "threaded" branch. There are still deadlocks. --[[Joey]]

>> Fixed, by switching from `System.Cmd.Utils` to `System.Process`
>> --[[Joey]] 

---

It would be possible to not use the threaded runtime. Instead, we could
have a child process pool, with associated continuations to run after a
child process finishes. Then periodically do a nonblocking waitpid on each
process in the pool in turn (waiting for any child could break anything not
using the pool!). This is probably a last resort...
