[Haskell-cafe] IORef memory leak

Jim Snow jsnow at cs.pdx.edu
Fri Jun 19 00:09:46 EDT 2009


Luke Palmer wrote:
> On Thu, Jun 18, 2009 at 9:55 PM, Ross Mellgren <rmm-haskell at z.odi.ac 
> <mailto:rmm-haskell at z.odi.ac>> wrote:
>
>     It looks offhand like you're not being strict enough when you put
>     things back in the IORef, and so it's building up thunks of (+1)...
>
>     With two slight mods:
>
>
>       go 0 = return ()
>       go n = do modifyIORef ior (+1)
>                 go (n-1)
>
>     -->
>
>       go 0 = return ()
>       go n = do modifyIORef ior (\ x -> let x' = x+1 in x `seq` x')
>                 go (n-1)
>
>
> Just a slight prettification of that line:
>
> modifyIORef ior ((1+) $!)
>
> Or applied prefix if you prefer.  Prefix ($!) has the nice 
> interpretation as the HOF that makes its argument into a strict function.
>
> Luke
>
    do modifyIORef ior (\ x -> let x' = x+1 in x `seq` x')
 
and

    do modifyIORef ior ((1+) $!)

both still leak memory for me.  However,

    do x <- readIORef ior
                 writeIORef ior $! x+1


runs in constant space.  I was able to fix my original program, and now 
it uses a predictable amount of memory.

Thanks!


-jim


More information about the Haskell-Cafe mailing list