[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: hash tables and GC



    Date: Wed, 31 Aug 88 21:47 EDT
    From: Barry Margolin <barmar@Think.COM>

    There's actually an even more trivial solution: don't implement them if
    you don't want to!

Of course.

    The difference between weak tables and ordinary tables is that the
    implementation is ALLOWED to GC entries in weak tables.  However, just
    as Common Lisp never actually says that an implementation MUST have a
    GC, it can't REQUIRE an implementation to GC entries in a weak table.
    So, if your GC is not easily extended to support weak tables, you can
    simply ignore the :WEAK (or whatever) option.  The only invalid way to
    implement weak tables is to implement them in such a way that they GC
    entries that they shouldn't; remembering too much should never bother a
    valid CL program (unless it runs out of memory, but that's outside the
    language spec).  (Hmm, this argument would justify a Lisp implementation
    that used only a reference-count GC, but I expect that there would be
    far fewer weak tables than circular structures, so the argument doesn't
    really scale up.)

    By the way, I assume that David meant that only key fields of tables
    should be skipped.  Otherwise you could end up with keys whose values
    have been GCed.

I can think of applications for weak-key, weak-value, and
weak-key-and-value hash tables.  Certainly weak-key is the most
generally useful.

    By the way, here is how I think weak tables could be implemented in a
    mark-sweep GC (are there any of those around any more?):

    During the mark phase, don't recurse through the keys of any weak
    tables.  Before the sweep phase, make another pass, deleting any weak
    table entries whose keys are not marked.

    The added passes of both the copying and mark/sweep GCs would be sped up
    significantly if the implementation maintained a list of all weak tables
    (or it could cons up such a list during the first pass), so that it
    wouldn't have to make a full pass through memory to find them.

Sounds reasonable given 10 seconds of thought.