-
-
Notifications
You must be signed in to change notification settings - Fork 33k
Description
Bug report
Bug description:
If the test registers a callback with atexit
module, refleak test will consider it a leak.
def test_refleak(self):
atexit.register(lambda: None)
This is the root cause of the buildbot failure of #139185. It's a couple of coincidences that caused the seemingly unrelated issue. Basically, clearing the module cache in test_zipimport
made the module-level code in rlcompleter
, which includes a register to atexit
, run more than once.
There are a few possible approaches to fix this, but I did not find the solution that I'm immediately happy with.
I consider this a test framework bug as this should be a valid behavior. The ideal solution is to keep the atexit
callbacks before running test in a loop and restore it after. However, atexit
does not provide such an interface, public or private. You can either clear it or run it. The callbacks are stored in a state of the interpreter and we don't have any access to it.
Without that, we either need to somehow calculate the allocated memory by atexit
, or hope that no one writes a test that writes to atexit
. Of course there might be other ways that I did not think of.
CPython versions tested on:
CPython main branch
Operating systems tested on:
macOS