File manager - Edit - /opt/saltstack/salt/lib/python3.10/site-packages/zmq/utils/__pycache__/win32.cpython-310.pyc
Back
o ;jL � @ s: d Z ddlmZ ddlZddlmZmZ G dd� d�ZdS )zWin32 compatibility utilities.� )�annotationsN)�Any�Callablec @ s4 e Zd ZdZdddd�Zd d � Zdd� Zd d� ZdS )�allow_interruptaD Utility for fixing CTRL-C events on Windows. On Windows, the Python interpreter intercepts CTRL-C events in order to translate them into ``KeyboardInterrupt`` exceptions. It (presumably) does this by setting a flag in its "console control handler" and checking it later at a convenient location in the interpreter. However, when the Python interpreter is blocked waiting for the ZMQ poll operation to complete, it must wait for ZMQ's ``select()`` operation to complete before translating the CTRL-C event into the ``KeyboardInterrupt`` exception. The only way to fix this seems to be to add our own "console control handler" and perform some application-defined operation that will unblock the ZMQ polling operation in order to force ZMQ to pass control back to the Python interpreter. This context manager performs all that Windows-y stuff, providing you with a hook that is called when a CTRL-C event is intercepted. This hook allows you to unblock your ZMQ poll operation immediately, which will then result in the expected ``KeyboardInterrupt`` exception. Without this context manager, your ZMQ-based application will not respond normally to CTRL-C events on Windows. If a CTRL-C event occurs while blocked on ZMQ socket polling, the translation to a ``KeyboardInterrupt`` exception will be delayed until the I/O completes and control returns to the Python interpreter (this may never happen if you use an infinite timeout). A no-op implementation is provided on non-Win32 systems to avoid the application from having to conditionally use it. Example usage: .. sourcecode:: python def stop_my_application(): # ... with allow_interrupt(stop_my_application): # main polling loop. In a typical ZMQ application, you would use the "self pipe trick" to send message to a ``PAIR`` socket in order to interrupt your blocking socket polling operation. In a Tornado event loop, you can use the ``IOLoop.stop`` method to unblock your I/O loop. N�action�Callable[[], Any] | None�return�Nonec C s t jdkrdS | �|� dS )a Translate ``action`` into a CTRL-C handler. ``action`` is a callable that takes no arguments and returns no value (returned value is ignored). It must *NEVER* raise an exception. If unspecified, a no-op will be used. �ntN)�os�name�_init_action)�selfr � r �C/opt/saltstack/salt/lib/python3.10/site-packages/zmq/utils/win32.py�__init__@ s zallow_interrupt.__init__c s� ddl m}m} ddlm}m} |�d�}|||�}|j }| _||f|_ ||_ � d u r0dd� � � | _|� fdd��} | | _d S ) Nr )�WINFUNCTYPE�windll)�BOOL�DWORD�kernel32c S s d S �Nr r r r r r ] s z,allow_interrupt._init_action.<locals>.actionc s | dkr� � dS )Nr r )�event�r r r �handleb s z,allow_interrupt._init_action.<locals>.handle) �ctypesr r Zctypes.wintypesr r �LoadLibrary�SetConsoleCtrlHandler�_SetConsoleCtrlHandler�argtypes�restyper r ) r r r r r r r ZPHANDLER_ROUTINEr r r r r r M s � zallow_interrupt._init_actionc C s. t jdkrdS | �| jd�}|dkrt� �dS )z"Install the custom CTRL-C handler.r N� r �r r r r �OSError)r �resultr r r � __enter__p � �zallow_interrupt.__enter__c G s. t jdkrdS | �| jd�}|dkrt� �dS )z!Remove the custom CTRL-C handler.r Nr r"