[kaffe] Re: Destroyed strings...
Timothy Stack
stack@cs.utah.edu
Wed, 5 Jun 2002 19:55:56 -0600 (MDT)
> Another possible less intrusive idea:
> Why not just hold the string intern lock while working off the
> must-free list. Take it before working off the list, release
> it afterwards.
I think we run into the same problem as before though, we can't take the
lock before RESUMEWORLD() because it could deadlock and we can't take it
after because of the race condition. In fact, if someone had the lock and
was looking up a string before the gc calls STOPWORLD() we'd lose
again.
U1 hashFindSlot("FooBar");
- thread switch "just" before it finds it, otherwise the collector
would see the reference on the thread stack.
GC STOPWORLD();
GC add "FooBar" to must free
GC RESUMEWORLD();
GC lockStaticMutex(&stringLock);
- GC blocks waiting for U1 to finish
U1 finds bogus "FooBar"
Now, the reason i brought up weak references was that they could behave
similarly:
weak ref (i probably way off on how this is supposed to work):
STOPWORLD();
weak ref (WR) placed on "post processing list"
WR.disable() nulls out the reference if it is white && <some other
conditions (e.g. low mem)>
RESUMEWORLD();
WR.destroy() puts the object on the ReferenceQueue (need to do it outside
the RESUMEWORLD(); because someone can have the queue locked).
interned string:
STOPWORLD();
interned string (IS) is white
IS.disable() nulls out the char[], preventing any matches. As stated
above, if the thread already found it, the collector would've traced it.
RESUMEWORLD();
IS.destroy() removes the string from the table.
this "seems" to work, and theres no locking problem, i think...
> - Godmar
tim stack