| Server IP : 198.38.94.13 / Your IP : 216.73.217.33 Web Server : Apache System : Linux d4744.dxb1.stableserver.net 5.14.0-611.49.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Apr 21 16:39:08 EDT 2026 x86_64 User : revivere ( 1140) PHP Version : 8.2.33 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : /opt/saltstack/salt/lib/python3.10/site-packages/zmq/utils/__pycache__/ |
Upload File : |
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"