[Haskell-cafe] STM commit hooks
Simon Marlow
simonmar at microsoft.com
Fri Dec 2 06:15:09 EST 2005
On 29 November 2005 12:40, Einar Karttunen wrote:
> Hello
>
> I have been playing with STM and want to log transactions to disk.
> Defining a logging function like:
>
> log h act = unsafeIOToSTM $ hPrint h act
>
> works most the time. Aborts can be handled with:
>
> abort h = log h Abort >> retry
> atomic' h act = atomically (act `orElse` abort h)
>
> But is it possible to handle a commit?
>
> commit h = unsafeIOToSTM (hPrint h Commit >> hSync h)
> atomically2 h act = atomically ((act >> commit h) `orElse` abort h)
>
> This won't work because the transaction is validated and
> maybe aborted after the commit is logged to disk.
>
> Another alternative would be:
>
> atomically3 h act = atomically (act `orElse` abort h) >> atomically
> (commit h)
If I'm understanding you correctly, what you need is to log the commit
operation before another thread commits and logs a transaction. So you
just need to close this race hole at the '>>' in the above definition.
How about this:
log_lock <- newTMVar ()
atomically3 h act = do
atomically (do act; takeTMVar log_lock `orElse` abort h)
hPrint h Commit
atomically (putTMVar log_lock ())
does that work?
Cheers,
Simon
More information about the Haskell-Cafe
mailing list