I was wondering if it was possible to implement synchronous channels
within STM. In particular, I'd like to have CSP-like send and recv primitives
on a channel that each block until the other side arrives to complete
the transaction.

Assuming that retry blocks until something changes, you could associate
a channel with a thread that encapsulates the transaction. Somewhat like this?

import Control.Concurrent.STM
import Control.Concurrent

sender write confirm = do
 atomically $ putTMVar write "hi"
 atomically $ takeTMVar confirm
 putStrLn "sender done"
receiver read = do
 r <- atomically $ takeTMVar read
 putStrLn $ "receiver done: "++r

channel read write confirm = atomically $ do
 w <- takeTMVar write
 putTMVar read w
 putTMVar confirm ()

main = do (read,write,confirm) <- atomically $ do
   read <- newEmptyTMVar
   write <- newEmptyTMVar
   confirm <- newEmptyTMVar
   return (read,write,confirm)
 forkIO (channel read write confirm)
 forkIO (threadDelay 3000000 >> receiver read)
 threadDelay 5000000 >> sender write confirm

You might also be interested in http://hackage.haskell.org/cgi-bin/hackage-scripts/package/chp

Claus


_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to