Object unloading confusion
Simon Marlow
marlowsd at gmail.com
Thu Apr 16 11:58:41 UTC 2020
Hi Omer
The point of the heap scan is to find *info pointers* into objects that we
want to unload, since we can't unload those.
What about static object pointers? Well, those would be found by traversing
the static_objects list, which we also do in checkUnload. Except that
static_objects doesn't contain all the static objects - that's one of the
problems identified by this ticket.
Primitive objects can't have an info pointer into a dynamically loaded
object, because all their info pointers point into the RTS.
Hope that helps!
Simon
On Wed, 15 Apr 2020 at 13:06, Ömer Sinan Ağacan <omeragacan at gmail.com>
wrote:
> To answer my own question
>
> > So if I see a constructor with a reference to an object code in its
> payload
> > I'll not mark the object code.
>
> We don't visit payload as objects pointed from the payload will be visited
> during the scan later (or they're already visited if they come before the
> constructor in a block).
>
> The 'prim' variable in that code is still a little bit confusing. For
> example we
> never check an MVAR for whether it's an unloadable object or not:
>
> case MVAR_CLEAN:
> case MVAR_DIRTY:
> prim = true;
> size = sizeW_fromITBL(info);
> break;
>
> ...
>
> if (!prim) {
> checkAddress(addrs,info, s_indices);
> }
>
> Would be good to know why it's fine to not check MVARs and other kinds of
> objects that we skip in that code.
>
> Ömer
>
> Ömer Sinan Ağacan <omeragacan at gmail.com>, 15 Nis 2020 Çar, 12:35
> tarihinde şunu yazdı:
> >
> > Hi Simon,
> >
> > I'm looking at object unloading code in CheckUnload.c. My understanding
> of how
> > unloading works is:
> >
> > - When unloading of an object is requested the object is added to
> > `unloaded_objects`.
> > - When `unloaded_objects` is not empty, after GC, we scan the heap for
> any
> > references to objects. This is done in `searchHeapBlocks` called by
> > `checkUnload`.
> > - When `searchHeapBlocks` finds a reference to an object code it marks
> the
> > object code.
> > - After scanning the heap any objects in `unloaded_objects` that are not
> marked
> > are unloaded.
> >
> > Does this sound right so far?
> >
> > What I'm confused about is `searchHeapBlocks`. As far as I can see it
> just skips
> > all objects other than stacks. For example here's the code for scanning a
> > constructor:
> >
> > case CONSTR:
> > case CONSTR_NOCAF:
> > case CONSTR_1_0:
> > case CONSTR_0_1:
> > case CONSTR_1_1:
> > case CONSTR_0_2:
> > case CONSTR_2_0:
> > size = sizeW_fromITBL(info);
> > break;
> >
> > So if I see a constructor with a reference to an object code in its
> payload I'll
> > not mark the object code. This looks wrong to me. I don't understand why
> we only
> > care about stacks and nothing else. Could you comment on this?
> >
> > Thanks,
> >
> > Ömer
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-devs/attachments/20200416/49ebe42a/attachment.html>
More information about the ghc-devs
mailing list