On 11-02-01 02:58 PM, Warren Harris wrote:
I have an application that forks a thread to run an activity on a timer. (The 
activity happens to be Berkeley DB checkpointing, but that's actually beside 
the point here.) The problem is that when the application wants to quit, I 
would like my main thread to be able to tell the timer thread to shut down in a 
timely way. However, I don't see a primitive in haskell that allows me to both 
wait for a timeout, or a notification. (If I were to do this in java, I would 
use wait/notify.)

Use an MVar for signalling; use a two-valued data type to represent time-to-work or time-to-die. For extra correctness, use a second MVar to be notified that the child thread is really done --- because otherwise there would be the race condition of the child thread still in the middle of critical I/O when the program quits.

import Control.Concurrent
import Control.Exception(finally)

data DoOrDie = Do | Die

main = do
  v <- newEmptyMVar
  finale <- newEmptyMVar
  forkIO (timeloop v `finally` putMVar finale ())
  putStrLn "press enter to quit"
  getLine
  putMVar v Die
  takeMVar finale

timeloop v = run where
  run = do
    forkIO (threadDelay 15000000 >> putMVar v Do)
    m <- takeMVar v
    case m of
      Do -> putStrLn "checkpoint" >> run
      Die -> putStrLn "checkmate"

_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to