On 06/14/2010 05:08 PM, John Admanski wrote: > Note that if gc.collect is needed to collect garbage, that generally > means you have reference cycles, and if you have __del__ AND cycles then > even a gc.collect won't help you. A __del__ method will prevent the > proper collection of objects involved in a reference cycle. > > -- John
It isn't needed AFAIK, and I don't think I have any reference cycles. I did make sure that after applying the patch, my __del__ method is properly called before test termination, even without gc.collect(). The only reason I put gc.collect() there is that I'm not sure about python's garbage collection policy -- is garbage collection guaranteed to take place as soon as the reference count drops to zero? or does it perhaps depend on a clean exit? I thought it was slightly risky to rely on garbage collection immediately before an os._exit(). Please correct me if I'm wrong. > > On Sat, Jun 12, 2010 at 3:20 PM, Michael Goldish <[email protected] > <mailto:[email protected]>> wrote: > > If an exception is raised in a test, its traceback contains > references to > objects used in the test. These references prevent garbage > collection of the > objects. Normally this isn't a problem because when a program exits the > objects are garbage-collected anyway, but fork_start() calls > os._exit() which > skips normal exit processing. Thus we can't rely on objects' > __del__() methods > being called. > > The problem can be solved by calling sys.exc_clear() to clear exception > information before exiting. It also doesn't hurt to call > gc.collect() just to > be very sure that garbage collection takes place. > > Signed-off-by: Michael Goldish <[email protected] > <mailto:[email protected]>> > --- > client/bin/parallel.py | 6 +++++- > 1 files changed, 5 insertions(+), 1 deletions(-) > > diff --git a/client/bin/parallel.py b/client/bin/parallel.py > index 1ecc75f..47dd5cd 100644 > --- a/client/bin/parallel.py > +++ b/client/bin/parallel.py > @@ -2,7 +2,7 @@ > > __author__ = """Copyright Andy Whitcroft 2006""" > > -import sys, logging, os, pickle, traceback > +import sys, logging, os, pickle, traceback, gc > from autotest_lib.client.common_lib import error, utils > > def fork_start(tmp, l): > @@ -39,6 +39,10 @@ def fork_start(tmp, l): > sys.stdout.flush() > sys.stderr.flush() > finally: > + # clear exception information to allow garbage > collection of > + # objects referenced by the exception's traceback > + sys.exc_clear() > + gc.collect() > os._exit(1) > else: > try: > -- > 1.5.4.1 > > _______________________________________________ > Autotest mailing list > [email protected] <mailto:[email protected]> > http://test.kernel.org/cgi-bin/mailman/listinfo/autotest > > _______________________________________________ Autotest mailing list [email protected] http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
