[Haskell-cafe] STM and unsafePerformIO/bracket
John Wiegley
johnw at fpcomplete.com
Mon Feb 3 11:17:04 UTC 2014
>>>>> Rob Leslie <rob at mars.org> writes:
> Is this expected behavior? I realize performing any IO within an STM
> transaction is inherently unsafe, but I am a little surprised that ‘bracket’
> fails here.
>
> Is there a better way to do what I’m trying to accomplish? How can I provide
> a pure interface to my foreign function that will work within an STM
> transaction?
If your foreign function "depends on some global state in a way that
compromises thread safety", I would hestitate to simply tell the FFI that it
is pure.
Instead, you can break up your STM transaction into two pieces: A first part
that sets up the transaction and sets a guard variable so other transactions
cannot proceed until the second part is completed, then perform the FFI call,
then the second part of the transaction. For example:
atomically $ do
m <- readTVar mutex
check (not m)
writeTVar m True
... do whatever STM setup work is needed here ...
ffiCall
atomically $ do
... do whatever STM cleanup work is needed here ...
writeTVar m False
This way your ffiCall is conceptually within a larger transactional block.
John
More information about the Haskell-Cafe
mailing list