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

Ömer Sinan Ağacan omeragacan at gmail.com
Thu Jul 19 14:40:41 UTC 2018


I created https://ghc.haskell.org/trac/ghc/ticket/15417 for this.

Ömer

Simon Marlow <marlowsd at gmail.com>, 19 Tem 2018 Per, 13:52 tarihinde şunu yazdı:
>
> 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
>
>


More information about the ghc-devs mailing list