From 54c950f6b4e3e8449ba62c3e54445af9d273ae68 Mon Sep 17 00:00:00 2001 From: Hirokazu Yamamoto Date: Fri, 8 Oct 2010 08:38:15 +0000 Subject: Issue #9978: Wait until subprocess completes initialization. (Win32KillTests in test_os) --- Lib/test/test_os.py | 16 ++++++++++++++-- Lib/test/win_console_handler.py | 6 ++++++ Misc/NEWS | 3 +++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index d73bff2..342dada 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -13,6 +13,8 @@ import time import shutil from test import support import contextlib +import mmap +import uuid # Detect whether we're on a Linux system that uses the (now outdated # and unmaintained) linuxthreads threading library. There's an issue @@ -1029,13 +1031,23 @@ class Win32KillTests(unittest.TestCase): self._kill(100) def _kill_with_event(self, event, name): + tagname = "test_os_%s" % uuid.uuid1() + m = mmap.mmap(-1, 1, tagname) + m[0] = 0 # Run a script which has console control handling enabled. proc = subprocess.Popen([sys.executable, os.path.join(os.path.dirname(__file__), - "win_console_handler.py")], + "win_console_handler.py"), tagname], creationflags=subprocess.CREATE_NEW_PROCESS_GROUP) # Let the interpreter startup before we send signals. See #3137. - time.sleep(0.5) + count, max = 0, 20 + while count < max and proc.poll() is None: + if m[0] == 0: + break + time.sleep(0.5) + count += 1 + else: + self.fail("Subprocess didn't finish initialization") os.kill(proc.pid, event) # proc.send_signal(event) could also be done here. # Allow time for the signal to be passed and the process to exit. diff --git a/Lib/test/win_console_handler.py b/Lib/test/win_console_handler.py index 3c2bfa1..496873c 100644 --- a/Lib/test/win_console_handler.py +++ b/Lib/test/win_console_handler.py @@ -11,6 +11,8 @@ similar example in C. from ctypes import wintypes, WINFUNCTYPE import signal import ctypes +import mmap +import sys # Function prototype for the handler function. Returns BOOL, takes a DWORD. HandlerRoutine = WINFUNCTYPE(wintypes.BOOL, wintypes.DWORD) @@ -38,6 +40,10 @@ if __name__ == "__main__": print("Unable to add SetConsoleCtrlHandler") exit(-1) + # Awaken mail process + m = mmap.mmap(-1, 1, sys.argv[1]) + m[0] = 1 + # Do nothing but wait for the signal while True: pass diff --git a/Misc/NEWS b/Misc/NEWS index ade83bf..46042b4 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -311,6 +311,9 @@ Tools/Demos Tests ----- +- Issue #9978: Wait until subprocess completes initialization. (Win32KillTests + in test_os) + - Issue #7110: regrtest now sends test failure reports and single-failure tracebacks to stderr rather than stdout. -- cgit v0.12