Jan-Willem Maessen wrote:
On Dec 5, 2007, at 3:58 AM, Simon Marlow wrote:
Ah, so I was thinking of the following readIVar:
readIVar = unsafePerformIO . readIVarIO
But clearly there's a better one. Fair enough.
Hmm, so unsafePerformIO doesn't deal with any operation that blocks?
Well, operations that block inside unsafePerformIO do block the whole
thread, yes, and that may lead to a deadlock if the blocking operation is
waiting to be unblocked by its own thread. It sounds like you want to back
off from any earlier-than-necessary evaluation at this point. Fortunately
this problem doesn't arise, because GHC won't commute evaluation past an IO
operation.
I'm wondering about related sorts of examples now, as well:
do
x <- newIVar
y <- unsafeInterleaveIO (readIVarIO x)
writeIVar x 3
print y
Or the equivalent things to the above with MVars.
Yes, this suffers from the same problem. If the compiler were to eagerly
evaluate y, then you'll get deadlock.
Cheers,
Simon
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe