bugs in `gc.get_referents()'
Martin von Loewis
loewis at informatik.hu-berlin.de
Mon Nov 26 13:26:27 EST 2001
Michael Hudson <mwh at python.net> writes:
> Wild, wild stab in the dark: try running gc.collect() first.
That shouldn't matter. Certainly, gc.get_referrers may return
referrers that the next collection would eliminate. However, if one
such object is found, it is added to the list that will be returned
from get_referrers, so it won't be collected as it is still referenced
from the result list.
Also, AFAICT, the only thing that could trigger a collection is the
allocation of the result list. However, that happens before the
generations are being traversed, so that could not cause problems,
either.
> I *doubt* threads are running during the call to gc.get_referrers.
> Could be wrong.
You are right. As every other C function, get_referrers holds the
interpreter lock.
> > Also some of those threads are using native code which might be
> > failing to DECREF properly.
>
> If that's the case, then you've got problems all your own, no?
That is my suspicion. get_referrers accesses every object that claims
to be a container, without attempting a garbage collection. Some
extension types may not expect that, but they would be broken already.
> > whether the code has been changed since 2.2b2,
>
> Only the name changes, I think.
Correct.
> > if there is any sort of "starting point" for digging into it that
> > they recommend, etc.
>
> $ less Modules/gcmodule.c
>
> I think.
Investigating the objects that are incorrectly returned as referrers
are a good starting point, also. Set a breakpoint on the tp_traverse
of these types, and watch it being called. Find out why it returns
non-zero.
Regards,
Martin
More information about the Python-list
mailing list