isAlive() too conservative -- does it cause leaks?

Simon Marlow marlowsd at gmail.com
Thu Jul 19 10:52:46 UTC 2018


On 19 July 2018 at 11:09, Ömer Sinan Ağacan <omeragacan at gmail.com> wrote:

> Hi Simon,
>
> Currently isAlive considers all static closures as being alive. The code:
>
>     // ignore static closures
>     //
>     // ToDo: This means we never look through IND_STATIC, which means
>     // isRetainer needs to handle the IND_STATIC case rather than
>     // raising an error.
>     //
>     // ToDo: for static closures, check the static link field.
>     // Problem here is that we sometimes don't set the link field, eg.
>     // for static closures with an empty SRT or CONSTR_NOCAFs.
>     //
>     if (!HEAP_ALLOCED_GC(q)) {
>         return p;
>     }
>
> I'd expect this to cause leaks when e.g. key of a WEAK is a static object.
> Is
> this not the case?


Correct, I believe weak pointers to static objects don't work (not sure if
there's a ticket for this, but if not there should be).

I think this is easy to fix but I may be missing something
> and wanted to ask before investing into it. The idea:
>
> - Evacuate all static objects in evacuate() (including the ones with no
> SRTs)
>   (assuming all static objects have a STATIC_FIELD, is this really the
> case?)
>

This would be expensive. We deliberately don't touch the static objects in
a minor GC because it adds potentially tens of ms to the GC time, and the
optimisation to avoid evacuating the static objects with no SRTs is an
important one.

Cheers
Simon

- In isAlive() check if (STATIC_FIELD & static_flag) != 0. If it is then the
>   object is alive.
>
> Am I missing anything?
>
> Thanks,
>
> Ömer
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-devs/attachments/20180719/c9344c07/attachment.html>


More information about the ghc-devs mailing list