On Tue, Sep 28, 2010 at 9:19 PM, Brandon Moore
<[email protected]> wrote:
>
>
> On Sep 28, 2010, at 6:36 PM, Tom Hawkins <[email protected]> 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
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to