Make lines stricter to fix a space leak
Daniel Fischer
daniel.is.fischer at web.de
Mon Oct 4 14:19:39 EDT 2010
On Monday 04 October 2010 19:32:54, Henning Thielemann wrote:
> Daniel Fischer schrieb:
> > On Monday 27 September 2010 22:18:40, Daniel Fischer wrote:
> >> Although the Core looks as though it might leak,
> >
> > And with 6.8.3 it does leak indeed, but no more with 6.10.* and
> > 6.12.*. All produced identical Core, so it's probably a change in the
> > garbage collector.
>
> How can we be sure it runs in constant memory in future GHC versions?
We can't.
> Or in other Haskell compilers?
Nor can we here. If it doesn't work for other compilers,
#ifdef __GLASGOW_HASKELL__
would be a workaround.
> Those fixes to memory leaks look very fragile to me.
Yes, they are fragile.
However, since (to my surprise) uncurry isn't available in Data.List, I've
tried with a special function for uncurry (:),
cons :: (a,[a]) -> [a]
cons (x,xs) = x : xs
vlines :: String -> [String]
vlines "" = []
vlines s = cons $ case break (== '\n') s of
(l, s') -> (l, case s' of
[] -> []
_:s'' -> vlines s'')
, which gives slightly less fragile looking Core (
case GHC.List.$wbreak @ GHC.Types.Char lvl_rjf wild_B1
of _ { (# ww1_aiR, ww2_aiS #) ->
GHC.Types.:
@ [GHC.Types.Char]
ww1_aiR
(case ww2_aiS of _ {
[] -> GHC.Types.[] @ [GHC.Types.Char];
: _ s''_adv -> VLines.vlines s''_adv
})
--the second argument of (:) doesn't contain a reference to the first
anymore).
Well, 6.8.3 does also leak with that, but that also leaks with a naked
case.
So yeah, it's a fragile fix, but IMO better than leaving the space leak
unattended because we haven't a perfect solution.
More information about the Libraries
mailing list