
On Thu, Oct 9, 2008 at 10:50, roger peppe
On Thu, Oct 9, 2008 at 9:15 AM, Ryan Ingram
wrote: I don't think what you want is possible if both sides are in STM. Other authors have posted solutions where one side or the other of the transaction is in I/O, but wholly inside STM it's not possible.
Thanks, that's what I thought, although I wasn't sure of it, being new to both Haskell and STM.
Presumably this result means that it's not possible to implement any bounded-buffer-type interface within (rather than on top of) STM.
Isn't that a rather serious restriction?
Sorry, I come into this discussion late. One-place buffers, or MVars, are indeed implemented over STM in the orignal paper [1]. Is that what you seek? Copied from the paper, it looks like this: type MVar a = TVar (Maybe a) newEmptyMVar :: STM (MVar a) newEmptyMVar = newTVar Nothing takeMVar :: MVar a -> STM a takeMVar mv = do v <- readTVar mv case v of Nothing -> retry Just val -> do writeTVar mv Nothing return val putMVar :: MVar a -> a -> STM () putMVar mv val = do v <- readTVar mv case v of Nothing -> writeTVar mv (Just val) Just _ -> retry Again, sorry if I'm missing your point. Note that transactions cannot "block" like threads, when they retry - they do block, but when they are unblocked they are retried from the top. This is naturally due to the requirement that a transaction must not be affected by something that happens concurrently. [1] also goes to implement buffered, multi-item, multi-cast channels. [1] Tim Harris, Simon Marlow, Simon Peyton Jones, Maurice Herlihy. Composable Memory Transactions. cheers, Arnar