Re: [Haskell-cafe] Relaxing atomicity of STM transactions

On Sep 28, 2010, at 6:36 PM, Tom Hawkins

On Tue, Sep 28, 2010 at 9:19 PM, Brandon Moore
On Sep 28, 2010, at 6:36 PM, Tom Hawkins
wrote: Thanks for the responses, but I think I should explain a bit more. I'm not interested in being able to read the live value of a TVar at any arbitrary time (via. unsafeIOToSTM). But rather I would like looslyReadTVar to have exactly the same semantics as readTVar, except that the STM runtime would not reject the transaction if the TVar is modified by another transaction before the atomic commit takes place.
Given the current implementation, I think the easiest way to get those semantics is to lift the untracked readTVarIO into STM with unsafeIOToSTM.
Even though I thought it was awsome up above, it is a really unsafe function with that implementation: ------- import GHC.Conc import Control.Monad readTVarLoose :: TVar a -> STM a readTVarLoose = unsafeIOToSTM . readTVarIO testAction tv = do readTVar tv >>= writeTVar tv . succ (,) `fmap` readTVar tv `ap` readTVarLoose tv main = do tv <- newTVarIO 3 (a,b) <- atomically $ testAction tv print a print b ------- What's happening is that readTVarIO doesn't know to hit the transaction log for the "true" value of the TVar. So we need something that will read previous entries in the transaction log, but will not write to the transaction log. You'll need a new primop for this, which would be implemented in rts/STM.c It looks like you would take most of stmReadTVar from STM.c, and get rid of everything that calls get_new_entry. Antoine
participants (2)
-
Antoine Latter
-
Brandon Moore