diff --git a/Lib/test/test_external_inspection.py b/Lib/test/test_external_inspection.py index 2f8f5f0e169339..01720457e61f5c 100644 --- a/Lib/test/test_external_inspection.py +++ b/Lib/test/test_external_inspection.py @@ -1751,14 +1751,23 @@ def busy(): break attempts = 10 + statuses = {} try: unwinder = RemoteUnwinder(p.pid, all_threads=True, mode=PROFILING_MODE_CPU, skip_non_matching_threads=False) for _ in range(attempts): traces = unwinder.get_stack_trace() - # Check if any thread is running - if any(thread_info.status == 0 for interpreter_info in traces - for thread_info in interpreter_info.threads): + # Find threads and their statuses + statuses = {} + for interpreter_info in traces: + for thread_info in interpreter_info.threads: + statuses[thread_info.thread_id] = thread_info.status + + # Check if sleeper thread is idle and busy thread is running + if (sleeper_tid in statuses and + busy_tid in statuses and + statuses[sleeper_tid] == 1 and + statuses[busy_tid] == 0): break time.sleep(0.5) # Give a bit of time to let threads settle except PermissionError: @@ -1766,13 +1775,6 @@ def busy(): "Insufficient permissions to read the stack trace" ) - - # Find threads and their statuses - statuses = {} - for interpreter_info in traces: - for thread_info in interpreter_info.threads: - statuses[thread_info.thread_id] = thread_info.status - self.assertIsNotNone(sleeper_tid, "Sleeper thread id not received") self.assertIsNotNone(busy_tid, "Busy thread id not received") self.assertIn(sleeper_tid, statuses, "Sleeper tid not found in sampled threads") @@ -1861,14 +1863,23 @@ def busy(): break attempts = 10 + statuses = {} try: unwinder = RemoteUnwinder(p.pid, all_threads=True, mode=PROFILING_MODE_GIL, skip_non_matching_threads=False) for _ in range(attempts): traces = unwinder.get_stack_trace() - # Check if any thread is running - if any(thread_info.status == 0 for interpreter_info in traces - for thread_info in interpreter_info.threads): + # Find threads and their statuses + statuses = {} + for interpreter_info in traces: + for thread_info in interpreter_info.threads: + statuses[thread_info.thread_id] = thread_info.status + + # Check if sleeper thread is idle (status 2 for GIL mode) and busy thread is running + if (sleeper_tid in statuses and + busy_tid in statuses and + statuses[sleeper_tid] == 2 and + statuses[busy_tid] == 0): break time.sleep(0.5) # Give a bit of time to let threads settle except PermissionError: @@ -1876,13 +1887,6 @@ def busy(): "Insufficient permissions to read the stack trace" ) - - # Find threads and their statuses - statuses = {} - for interpreter_info in traces: - for thread_info in interpreter_info.threads: - statuses[thread_info.thread_id] = thread_info.status - self.assertIsNotNone(sleeper_tid, "Sleeper thread id not received") self.assertIsNotNone(busy_tid, "Busy thread id not received") self.assertIn(sleeper_tid, statuses, "Sleeper tid not found in sampled threads")