[Haskell-cafe] more sharing in generated code
Peter Divianszky
divipp at gmail.com
Mon Nov 5 23:34:15 CET 2012
Hi Joachim,
> > ...
>
> I think one problem with this approach is that now, until "x r'" is
> evaluated, you keep both r and r' alive. If r was _not_ retained by
> anything else, then you are now preventing the GC from freeing it and
> hence increasing the memory footprint.
Good remark, this can be solved with weak pointers, although I don't
know how efficient they are.
----------------------
The next version of the proposal
Replace every record update
r' = r { x = y }
with
r' = r { x = update (weak r) r' (x r) y) }
in generated code if some sharing aware optimization flag is enabled.
Auxilary functions:
weak :: a -> Weak a
-- make a weak pointer which is not followed by GC
update :: Weak r -> r -> x -> x
update r_old r_new x_old x_new = unsafePerformIO $ do
eval x_new
b <- x_old === x_new
when b (replace r_new r_old)
return x_new
(===) :: a -> a -> IO Bool
-- pointer-equality for boxed values, equality for unboxed values
replace :: a -> Weak a -> IO ()
-- replace thunks in the heap
-- do nothing if the weak pointer was gone
Cheers,
Peter
More information about the Haskell-Cafe
mailing list