[Haskell-cafe] STM, orElse and timed read from a channel
Tomasz Zielonka
tomasz.zielonka at gmail.com
Mon Dec 5 06:27:35 EST 2005
On Mon, Dec 05, 2005 at 10:50:13AM -0000, Simon Peyton-Jones wrote:
> | Yes. Perhaps it would be easier to do it cleanly than arbitrary
> | top-level IO bindings?
>
> It turns out to be easy to provide
>
> newTVarIO :: a -> IO (TVar a)
>
> which you can call from inside 'unsafePerformIO'. That means you can
> allocate top-level TVars without fuss.
>
> The whole question of top-level IO remains open, but this will address
> the immediate question very nicely.
Unfortunately, in some cases, as in the TimeVar.hs example, the
initialization phase is a bit more complex - here I also spawn
a new thread.
But of course it would be a nice thing for the remaining 95% of cases.
Speaking about the whole thing of nested atomically blocks, now that I
know how to work around it, I can live with it.
> I've also added a SourceForge bug to remind us to fail more tidily if
> you do atomically inside atomically.
Great!
I have an idea going a bit further, but hopefully still quite easy to
implement. But I am not sure that it would be a sane thing to do:
On each "atomically" check if the current thread is already inside
"atomically". If so, then instead of rising an exception we could
spawn a new thread to perform the "atomically" block. The
result/exception would be propagated to the original thread on a
traditional MVar.
I think it could be implemented mostly in Haskell. The only missing
thing is an IO-primitive:
isInAtomicallyBlock :: IO Bool
But I fear that doing it this way could introduce a race condition.
Best regards
Tomasz
--
I am searching for a programmer who is good at least in some of
[Haskell, ML, C++, Linux, FreeBSD, math] for work in Warsaw, Poland
More information about the Haskell-Cafe
mailing list