RE: [Haskell-cafe] STM, orElse and timed read from a channel

| > I think you are really asking for some way to create top-level | > transactional variables? | | 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. I've also added a SourceForge bug to remind us to fail more tidily if you do atomically inside atomically. Simon

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
participants (2)
-
Simon Peyton-Jones
-
Tomasz Zielonka