mirror of
https://github.com/python/cpython.git
synced 2025-12-08 06:10:17 +00:00
gh-129441: Fix some flakiness in test_instrumentation (gh-141881)
Most of the `self.assertTrue(self.called)` checks are flaky because the worker threads may sometimes finish before the main thread calls `self.during_threads()`.
This commit is contained in:
parent
c490ffb7ac
commit
71126ab19c
1 changed files with 6 additions and 23 deletions
|
|
@ -35,10 +35,10 @@ def work(self, n, funcs):
|
||||||
return n
|
return n
|
||||||
return self.work(n - 1, funcs) + self.work(n - 2, funcs)
|
return self.work(n - 1, funcs) + self.work(n - 2, funcs)
|
||||||
|
|
||||||
def start_work(self, n, funcs):
|
def start_work(self, n, funcs, barrier):
|
||||||
# With the GIL builds we need to make sure that the hooks have
|
# With the GIL builds we need to make sure that the hooks have
|
||||||
# a chance to run as it's possible to run w/o releasing the GIL.
|
# a chance to run as it's possible to run w/o releasing the GIL.
|
||||||
time.sleep(0.1)
|
barrier.wait()
|
||||||
self.work(n, funcs)
|
self.work(n, funcs)
|
||||||
|
|
||||||
def after_test(self):
|
def after_test(self):
|
||||||
|
|
@ -53,14 +53,16 @@ def test_instrumentation(self):
|
||||||
exec("def f(): pass", x)
|
exec("def f(): pass", x)
|
||||||
funcs.append(x["f"])
|
funcs.append(x["f"])
|
||||||
|
|
||||||
|
barrier = Barrier(self.thread_count + 1)
|
||||||
threads = []
|
threads = []
|
||||||
for i in range(self.thread_count):
|
for i in range(self.thread_count):
|
||||||
# Each thread gets a copy of the func list to avoid contention
|
# Each thread gets a copy of the func list to avoid contention
|
||||||
t = Thread(target=self.start_work, args=(self.fib, list(funcs)))
|
t = Thread(target=self.start_work, args=(self.fib, list(funcs), barrier))
|
||||||
t.start()
|
t.start()
|
||||||
threads.append(t)
|
threads.append(t)
|
||||||
|
|
||||||
self.after_threads()
|
self.after_threads()
|
||||||
|
barrier.wait()
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
any_alive = False
|
any_alive = False
|
||||||
|
|
@ -120,7 +122,6 @@ class MonitoringMultiThreaded(
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super().setUp()
|
super().setUp()
|
||||||
self.set = False
|
self.set = False
|
||||||
self.called = False
|
|
||||||
monitoring.register_callback(
|
monitoring.register_callback(
|
||||||
self.tool_id, monitoring.events.LINE, self.callback
|
self.tool_id, monitoring.events.LINE, self.callback
|
||||||
)
|
)
|
||||||
|
|
@ -130,10 +131,7 @@ def tearDown(self):
|
||||||
super().tearDown()
|
super().tearDown()
|
||||||
|
|
||||||
def callback(self, *args):
|
def callback(self, *args):
|
||||||
self.called = True
|
pass
|
||||||
|
|
||||||
def after_test(self):
|
|
||||||
self.assertTrue(self.called)
|
|
||||||
|
|
||||||
def during_threads(self):
|
def during_threads(self):
|
||||||
if self.set:
|
if self.set:
|
||||||
|
|
@ -151,16 +149,11 @@ class SetTraceMultiThreaded(InstrumentationMultiThreadedMixin, TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.set = False
|
self.set = False
|
||||||
self.called = False
|
|
||||||
|
|
||||||
def after_test(self):
|
|
||||||
self.assertTrue(self.called)
|
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
sys.settrace(None)
|
sys.settrace(None)
|
||||||
|
|
||||||
def trace_func(self, frame, event, arg):
|
def trace_func(self, frame, event, arg):
|
||||||
self.called = True
|
|
||||||
return self.trace_func
|
return self.trace_func
|
||||||
|
|
||||||
def during_threads(self):
|
def during_threads(self):
|
||||||
|
|
@ -177,16 +170,11 @@ class SetProfileMultiThreaded(InstrumentationMultiThreadedMixin, TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.set = False
|
self.set = False
|
||||||
self.called = False
|
|
||||||
|
|
||||||
def after_test(self):
|
|
||||||
self.assertTrue(self.called)
|
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
sys.setprofile(None)
|
sys.setprofile(None)
|
||||||
|
|
||||||
def trace_func(self, frame, event, arg):
|
def trace_func(self, frame, event, arg):
|
||||||
self.called = True
|
|
||||||
return self.trace_func
|
return self.trace_func
|
||||||
|
|
||||||
def during_threads(self):
|
def during_threads(self):
|
||||||
|
|
@ -203,16 +191,11 @@ class SetProfileAllThreadsMultiThreaded(InstrumentationMultiThreadedMixin, TestC
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.set = False
|
self.set = False
|
||||||
self.called = False
|
|
||||||
|
|
||||||
def after_test(self):
|
|
||||||
self.assertTrue(self.called)
|
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
threading.setprofile_all_threads(None)
|
threading.setprofile_all_threads(None)
|
||||||
|
|
||||||
def trace_func(self, frame, event, arg):
|
def trace_func(self, frame, event, arg):
|
||||||
self.called = True
|
|
||||||
return self.trace_func
|
return self.trace_func
|
||||||
|
|
||||||
def during_threads(self):
|
def during_threads(self):
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue