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