On Apr 27, 2008, at 10:05 AM, Jake Mcarthur wrote:

On Apr 27, 2008, at 9:36 AM, Conal Elliott wrote:

I think we *do* want unsafeNewEmptyTMVar inlined. Here's a convenient caching wrapper:

   cached :: STM a -> TIVal a
   cached m = TIVal m (unsafePerformIO newEmptyTMVarIO)

Yes, this is essentially what I am working with in Reaction at the moment.

Actually, that is not quite what I have been doing. Here is what I had:

    cachedFuture :: STM (a, Time) -> Future a
cachedFuture stm = unsafePerformIO $ return . Future stm =<< newEmptyTMVarIO
    {-# NOINLINE cachedFuture #-}

(Clearly I am skipping right past an implementation of TIVals, despite the fact that they may be useful as a separate abstraction. This is just laziness.)

If I replace the above with...

    cachedFuture :: STM (a, Time) -> Future a
    cachedFuture stm = Future stm (unsafePerformIO newEmptyTMVarIO)

then my test program hangs, with or without the NOINLINE pragma. I can't guess why because, like I already said, I haven't yet thought all the way through the relationship between unsafePerformIO and NOINLINE.

- Jake
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to