Hello. I investigated ref leak report related to thread. Please run python regrtest.py -R :: test_leak.py (attached file) Sometimes ref leak is reported. # I saw this as regression failure on python-checkins.
# total ref count 92578 -> 92669
_Condition 2
Thread 6
_Event 1
bool 10
instancemethod 1
code 2
dict 9
file 1
frame 3
function 2
int 1
list 2
builtin_function_or_method 5
NoneType 2
str 27
thread.lock 7
tuple 5
type 5
Probably this happens because threading.Thread is implemented as Python
code,
(expecially threading.Thread#join), the code of regrtest.py
if i >= nwarmup:
deltas.append(sys.gettotalrefcount() - rc - 2)
can run before thread really quits. (before Moudles/threadmodule.c
t_bootstrap()'s
Py_DECREF(boot->func);
Py_DECREF(boot->args);
Py_XDECREF(boot->keyw);
runs)
So I experimentally inserted the code to wait for thread termination.
(attached file experimental.patch) And I confirmed error was gone.
# Sorry for hackish patch which only runs on windows. It should run
# on other platforms if you replace Sleep() in Python/sysmodule.c
# sys_debug_ref_leak_leave() with appropriate function.
import threading
import time
import unittest
from test import test_support
class Thread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self._stop = False
self.ready = threading.Event()
def stop(self):
self._stop = True
self.join()
def run(self):
self.ready.set()
while not self._stop:
time.sleep(0.5)
class LeakTests(unittest.TestCase):
def test_leak(self):
def foo():
raise RuntimeError("foo")
self.assertRaises(RuntimeError, foo)
def setUp(self):
self._thread = Thread()
self._thread.start()
self._thread.ready.wait()
def tearDown(self):
self._thread.stop()
def test_main():
test_support.run_unittest(LeakTests)
if __name__ == "__main__":
test_main()
experimental.patch
Description: Binary data
_______________________________________________ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
