[Python-checkins] r85104 - in python/branches/py3k-issue9978/Lib/test: test_os.py win_console_handler.py

hirokazu.yamamoto python-checkins at python.org
Wed Sep 29 14:36:15 CEST 2010


Author: hirokazu.yamamoto
Date: Wed Sep 29 14:36:14 2010
New Revision: 85104

Log:
Wait for win_console_handler reaches before dead loop.
(Otherwise, test_os.py didn't fail on slow machine because
process was killed before wintypes.WINFUNCTYPE was reached)
# I suppose Win32 CreateEvent is better.

Modified:
   python/branches/py3k-issue9978/Lib/test/test_os.py
   python/branches/py3k-issue9978/Lib/test/win_console_handler.py

Modified: python/branches/py3k-issue9978/Lib/test/test_os.py
==============================================================================
--- python/branches/py3k-issue9978/Lib/test/test_os.py	(original)
+++ python/branches/py3k-issue9978/Lib/test/test_os.py	Wed Sep 29 14:36:14 2010
@@ -13,6 +13,7 @@
 import shutil
 from test import support
 import contextlib
+from win_console_handler import create_mmap
 
 # Detect whether we're on a Linux system that uses the (now outdated
 # and unmaintained) linuxthreads threading library.  There's an issue
@@ -1029,13 +1030,16 @@
         self._kill(100)
 
     def _kill_with_event(self, event, name):
+        m = create_mmap()
+        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")],
                    creationflags=subprocess.CREATE_NEW_PROCESS_GROUP)
         # Let the interpreter startup before we send signals. See #3137.
-        time.sleep(0.5)
+        while m[0] == 0:
+            time.sleep(0.5)
         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.

Modified: python/branches/py3k-issue9978/Lib/test/win_console_handler.py
==============================================================================
--- python/branches/py3k-issue9978/Lib/test/win_console_handler.py	(original)
+++ python/branches/py3k-issue9978/Lib/test/win_console_handler.py	Wed Sep 29 14:36:14 2010
@@ -8,36 +8,46 @@
 similar example in C.
 """
 
-from ctypes import wintypes
-import signal
-import ctypes
-
-# Function prototype for the handler function. Returns BOOL, takes a DWORD.
-HandlerRoutine = wintypes.WINFUNCTYPE(wintypes.BOOL, wintypes.DWORD)
-
-def _ctrl_handler(sig):
-    """Handle a sig event and return 0 to terminate the process"""
-    if sig == signal.CTRL_C_EVENT:
-        pass
-    elif sig == signal.CTRL_BREAK_EVENT:
-        pass
-    else:
-        print("UNKNOWN EVENT")
-    return 0
+import mmap
 
-ctrl_handler = HandlerRoutine(_ctrl_handler)
+def create_mmap():
+    return mmap.mmap(-1, 1, "Python/Lib/test/win_console_handler.py")
 
+if __name__ == "__main__":
+    from ctypes import wintypes
+    import signal
+    import ctypes
+
+    # Function prototype for the handler function. Returns BOOL, takes a DWORD.
+    HandlerRoutine = wintypes.WINFUNCTYPE(wintypes.BOOL, wintypes.DWORD)
+
+    def _ctrl_handler(sig):
+        """Handle a sig event and return 0 to terminate the process"""
+        if sig == signal.CTRL_C_EVENT:
+            pass
+        elif sig == signal.CTRL_BREAK_EVENT:
+            pass
+        else:
+            print("UNKNOWN EVENT")
+        return 0
+
+    ctrl_handler = HandlerRoutine(_ctrl_handler)
+
+
+    SetConsoleCtrlHandler = ctypes.windll.kernel32.SetConsoleCtrlHandler
+    SetConsoleCtrlHandler.argtypes = (HandlerRoutine, wintypes.BOOL)
+    SetConsoleCtrlHandler.restype = wintypes.BOOL
 
-SetConsoleCtrlHandler = ctypes.windll.kernel32.SetConsoleCtrlHandler
-SetConsoleCtrlHandler.argtypes = (HandlerRoutine, wintypes.BOOL)
-SetConsoleCtrlHandler.restype = wintypes.BOOL
 
-if __name__ == "__main__":
     # Add our console control handling function with value 1
     if not SetConsoleCtrlHandler(ctrl_handler, 1):
         print("Unable to add SetConsoleCtrlHandler")
         exit(-1)
 
+    # Awake waiting main process
+    m = create_mmap()
+    m[0] = 1
+
     # Do nothing but wait for the signal
     while True:
         pass


More information about the Python-checkins mailing list