mirror of
https://github.com/python/cpython.git
synced 2025-08-31 05:58:33 +00:00
Merged revisions 75958 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r75958 | antoine.pitrou | 2009-10-30 18:07:08 +0100 (ven., 30 oct. 2009) | 7 lines Issue #7222: Make thread "reaping" more reliable so that reference leak-chasing test runs give sensible results. The previous method of reaping threads could return successfully while some Thread objects were still referenced. This also introduces a new private function: :func:hread._count(). ........
This commit is contained in:
parent
a2d1fe0b84
commit
65c9c6426b
5 changed files with 83 additions and 14 deletions
|
@ -947,24 +947,29 @@ def run_doctest(module, verbosity=None):
|
|||
#=======================================================================
|
||||
# Threading support to prevent reporting refleaks when running regrtest.py -R
|
||||
|
||||
def threading_setup():
|
||||
import threading
|
||||
return len(threading._active), len(threading._limbo)
|
||||
# NOTE: we use thread._count() rather than threading.enumerate() (or the
|
||||
# moral equivalent thereof) because a threading.Thread object is still alive
|
||||
# until its __bootstrap() method has returned, even after it has been
|
||||
# unregistered from the threading module.
|
||||
# thread._count(), on the other hand, only gets decremented *after* the
|
||||
# __bootstrap() method has returned, which gives us reliable reference counts
|
||||
# at the end of a test run.
|
||||
|
||||
def threading_cleanup(num_active, num_limbo):
|
||||
import threading
|
||||
def threading_setup():
|
||||
import _thread
|
||||
return _thread._count(),
|
||||
|
||||
def threading_cleanup(nb_threads):
|
||||
import _thread
|
||||
import time
|
||||
|
||||
_MAX_COUNT = 10
|
||||
count = 0
|
||||
while len(threading._active) != num_active and count < _MAX_COUNT:
|
||||
count += 1
|
||||
time.sleep(0.1)
|
||||
|
||||
count = 0
|
||||
while len(threading._limbo) != num_limbo and count < _MAX_COUNT:
|
||||
count += 1
|
||||
for count in range(_MAX_COUNT):
|
||||
n = _thread._count()
|
||||
if n == nb_threads:
|
||||
break
|
||||
time.sleep(0.1)
|
||||
# XXX print a warning in case of failure?
|
||||
|
||||
def reap_threads(func):
|
||||
@functools.wraps(func)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue