[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