
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