You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			73 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
from __future__ import annotations
 | 
						|
 | 
						|
import sys
 | 
						|
 | 
						|
assert sys.platform == "win32"
 | 
						|
 | 
						|
from ctypes import pointer
 | 
						|
 | 
						|
from ..utils import SPHINX_AUTODOC_RUNNING
 | 
						|
 | 
						|
# Do not import win32-specific stuff when generating documentation.
 | 
						|
# Otherwise RTD would be unable to generate docs for this module.
 | 
						|
if not SPHINX_AUTODOC_RUNNING:
 | 
						|
    from ctypes import windll
 | 
						|
 | 
						|
from ctypes.wintypes import BOOL, DWORD, HANDLE
 | 
						|
 | 
						|
from prompt_toolkit.win32_types import SECURITY_ATTRIBUTES
 | 
						|
 | 
						|
__all__ = ["wait_for_handles", "create_win32_event"]
 | 
						|
 | 
						|
 | 
						|
WAIT_TIMEOUT = 0x00000102
 | 
						|
INFINITE = -1
 | 
						|
 | 
						|
 | 
						|
def wait_for_handles(handles: list[HANDLE], timeout: int = INFINITE) -> HANDLE | None:
 | 
						|
    """
 | 
						|
    Waits for multiple handles. (Similar to 'select') Returns the handle which is ready.
 | 
						|
    Returns `None` on timeout.
 | 
						|
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms687025(v=vs.85).aspx
 | 
						|
 | 
						|
    Note that handles should be a list of `HANDLE` objects, not integers. See
 | 
						|
    this comment in the patch by @quark-zju for the reason why:
 | 
						|
 | 
						|
        ''' Make sure HANDLE on Windows has a correct size
 | 
						|
 | 
						|
        Previously, the type of various HANDLEs are native Python integer
 | 
						|
        types. The ctypes library will treat them as 4-byte integer when used
 | 
						|
        in function arguments. On 64-bit Windows, HANDLE is 8-byte and usually
 | 
						|
        a small integer. Depending on whether the extra 4 bytes are zero-ed out
 | 
						|
        or not, things can happen to work, or break. '''
 | 
						|
 | 
						|
    This function returns either `None` or one of the given `HANDLE` objects.
 | 
						|
    (The return value can be tested with the `is` operator.)
 | 
						|
    """
 | 
						|
    arrtype = HANDLE * len(handles)
 | 
						|
    handle_array = arrtype(*handles)
 | 
						|
 | 
						|
    ret: int = windll.kernel32.WaitForMultipleObjects(
 | 
						|
        len(handle_array), handle_array, BOOL(False), DWORD(timeout)
 | 
						|
    )
 | 
						|
 | 
						|
    if ret == WAIT_TIMEOUT:
 | 
						|
        return None
 | 
						|
    else:
 | 
						|
        return handles[ret]
 | 
						|
 | 
						|
 | 
						|
def create_win32_event() -> HANDLE:
 | 
						|
    """
 | 
						|
    Creates a Win32 unnamed Event .
 | 
						|
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms682396(v=vs.85).aspx
 | 
						|
    """
 | 
						|
    return HANDLE(
 | 
						|
        windll.kernel32.CreateEventA(
 | 
						|
            pointer(SECURITY_ATTRIBUTES()),
 | 
						|
            BOOL(True),  # Manual reset event.
 | 
						|
            BOOL(False),  # Initial state.
 | 
						|
            None,  # Unnamed event object.
 | 
						|
        )
 | 
						|
    )
 |