[Haskell-cafe] Stack overflow

Bertram Felgenhauer bertram.felgenhauer at googlemail.com
Wed May 27 14:59:31 EDT 2009


I wrote:
> Krzysztof Skrzętnicki wrote:
>> The code for modifying the counter:
>> (\ msg -> atomicModifyIORef ioref (\ cnt -> (cntMsg cnt msg,())))
>
> atomicModifyIORef does not force the new value of the IORef.
> If the previous contents of the IORef is x, the new contents
> will be a thunk,
>
>   (\ cnt -> (cntMsg cnt msg,())) x

Sorry, it's slightly worse than that. The contents becomes

    sel_0 (\ cnt -> (cntMsg cnt msg, ())) x

where sel_0 is basically an RTS internal version of fst.

Instead of reading the new value of the IORef, you could also force the
old one:

    atomicModifyIORef ioref (\ cnt -> (cntMsg cnt msg, msg)) >>= (return $!)

Bertram


More information about the Haskell-Cafe mailing list