<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">what happens if an exception is thrown?  </blockquote><div><br></div><div>In normal STM, if an exception occurs during a transaction, the transaction is gracefully aborted & none of its effects are made visible. Exactly the same thing is true in the presence of finalizers: if an exception occurs in the finalizer, the transaction is aborted & its effects discarded (you are still responsible for cleaning up any side effects that happened as part of the I/O action, of course).</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">what are the retry semantics?  </blockquote><div><br></div><div>The finalizer is only run once the transaction is guaranteed to commit.</div><div><br></div><div>The STM part of the transaction might retry many times, but once the system determines there are no conflicts, it runs the finalizer. When the finalizer has finished, the transaction commits & makes its effects visible. If during the time the finalizer is running another transaction comes along and makes a conflicting write and tries to commit, the other transaction has to retry (in reality, the other transaction's thread is put to sleep and woken up once it actually has a chance to commit, i.e. once the finalizer of the first transaction has finished).</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">is there a at-most-once guarantees for the IO action?</blockquote></div><br>Yes (see above).</div><div class="gmail_extra"><br></div><div class="gmail_extra"><br></div><div class="gmail_extra">A much more detailed description of all of this can be found in Sections 2.4 and 2.5 of my thesis [1], in which I give a complete formal semantics of STM with finalizers.</div><div class="gmail_extra"><br></div><div class="gmail_extra">[1]: <a href="https://github.com/mcschroeder/thesis">https://github.com/mcschroeder/thesis</a></div></div>