Concurrent question

Volker Stolz
Wed, 7 Nov 2001 12:59:17 +0100

In local.glasgow-haskell-users, you wrote:
> Suppose I have a program with two (ghc-)threads,
> one that does execute some  `system' commands, 
> and another one that accepts socket connections.
> While the system thread waits (for the system call to finish),
> will the other thread be awake (and accept new connections)?

As Simon already stated: no.
If you decide to use fork() in any way, be sure to implement
some kind of locking as *all* threads (including the thread
for the socket!) will be clowned, e.g.:

giant <- newMVar ()
takeMVar giant
pid <- fork
case pid of
  Nothing -> do -- Child
  Just p -> do -- Parent
    putMVar giant ()

and placing locks on 'giant' in the essential parts in every other
threads, e.g. before hGetLine. Ugly, but necessary for the worst

threadWaitRead fd
takeMVar giant
hGetLine h
putMVar giant ()

However, waiting on the system command to finish requires that you
use a sigCHLD signal handler which invokes get[Any]ProcessStatus
as you can't invoke waitpid in the parent.
Volker Stolz * * PGP + S/MIME