<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
U
    e5dè  ã                   @   s²   d dl Z d dlZd dlZd dlZd dlZddlmZ ddlmZ ddlm	Z	 dgZ
ejdkrxe
dg7 Z
G d	d„ deƒZne
d
g7 Z
G dd
„ d
eƒZG dd„ deƒZeƒ ZejZdS )é    Né   )Úprocess)Ú	reduction)ÚutilÚstopZwin32Ú	DupSocketc                   @   s   e Zd Zdd„ Zdd„ ZdS )r   c                    s(   |  ¡ ‰ ‡ fdd„}t |ˆ j¡| _d S )Nc                    s   ˆ   |¡}|  |¡ d S ©N)ÚshareZ
send_bytes)ÚconnÚpidr	   ©Znew_sock© ú7/usr/lib64/python3.8/multiprocessing/resource_sharer.pyÚsend   s    
z DupSocket.__init__.<locals>.send)ÚdupÚ_resource_sharerÚregisterÚcloseÚ_id)ÚselfZsockr   r   r   r   Ú__init__   s    zDupSocket.__init__c              
   C   s6   t  | j¡ }| ¡ }t |¡W  5 Q R £ S Q R X d S r   )r   Úget_connectionr   Z
recv_bytesÚsocketZ	fromshare)r   r
   r	   r   r   r   Údetach$   s    zDupSocket.detachN©Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r      s   ÚDupFdc                   @   s   e Zd Zdd„ Zdd„ ZdS )r   c                    s4   t  |¡‰ ‡ fdd„}‡ fdd„}t ||¡| _d S )Nc                    s   t  | ˆ |¡ d S r   )r   Zsend_handle)r
   r   ©Znew_fdr   r   r   1   s    zDupFd.__init__.<locals>.sendc                      s   t  ˆ ¡ d S r   )Úosr   r   r   r   r   r   3   s    zDupFd.__init__.<locals>.close)r    r   r   r   r   )r   Úfdr   r   r   r   r   r   /   s    
zDupFd.__init__c              
   C   s.   t  | j¡}t |¡W  5 Q R £ S Q R X d S r   )r   r   r   r   Zrecv_handle)r   r
   r   r   r   r   7   s    zDupFd.detachNr   r   r   r   r   r   -   s   c                   @   sJ   e Zd Zdd„ Zdd„ Zedd„ ƒZddd	„Zd
d„ Zdd„ Z	dd„ Z
dS )Ú_ResourceSharerc                 C   s@   d| _ i | _g | _t ¡ | _d | _d | _d | _t	 
| tj¡ d S )Nr   )Ú_keyÚ_cacheÚ
_old_locksÚ	threadingÚLockÚ_lockÚ	_listenerÚ_addressÚ_threadr   Zregister_after_forkr"   Ú
_afterfork)r   r   r   r   r   ?   s    
z_ResourceSharer.__init__c              
   C   sZ   | j J | jd kr|  ¡  |  jd7  _||f| j| j< | j| jfW  5 Q R £ S Q R X d S )Nr   )r(   r*   Ú_startr#   r$   )r   r   r   r   r   r   r   I   s    
z_ResourceSharer.registerc                 C   s<   ddl m} | \}}||t ¡ jd}| |t ¡ f¡ |S )Nr   ©ÚClient©Úauthkey)Ú
connectionr/   r   Úcurrent_processr1   r   r    Úgetpid)Zidentr/   ÚaddressÚkeyÚcr   r   r   r   R   s
    z_ResourceSharer.get_connectionNc              	   C   s¶   ddl m} | jš | jd k	r¨|| jt ¡ jd}| d ¡ | ¡  | j	 
|¡ | j	 ¡ rdt d¡ | j ¡  d | _	d | _d | _| j ¡ D ]\}\}}|ƒ  qŠ| j ¡  W 5 Q R X d S )Nr   r.   r0   z._ResourceSharer thread did not stop when asked)r2   r/   r(   r*   r   r3   r1   r   r   r+   ÚjoinZis_aliver   Zsub_warningr)   r$   ÚitemsÚclear)r   Ztimeoutr/   r7   r6   r   r   r   r   r   r   [   s$    
ÿ



z_ResourceSharer.stopc                 C   sj   | j  ¡ D ]\}\}}|ƒ  q
| j  ¡  | j | j¡ t ¡ | _| jd k	rT| j 	¡  d | _d | _
d | _d S r   )r$   r9   r:   r%   Úappendr(   r&   r'   r)   r   r*   r+   )r   r6   r   r   r   r   r   r,   p   s    



z_ResourceSharer._afterforkc                 C   sX   ddl m} t d¡ |t ¡ jd| _| jj| _	t
j| jd}d|_| ¡  || _d S )Nr   )ÚListenerz0starting listener and thread for sending handlesr0   )ÚtargetT)r2   r<   r   Údebugr   r3   r1   r)   r5   r*   r&   ZThreadÚ_serveZdaemonÚstartr+   )r   r<   Útr   r   r   r-   ~   s    

z_ResourceSharer._startc              	   C   s®   t tdƒrt tjt ¡ ¡ zh| j ¡ T}| ¡ }|d krHW 5 Q R £ W qª|\}}| j 	|¡\}}z|||ƒ W 5 |ƒ  X W 5 Q R X W q   t
 ¡ s¢tjt ¡ Ž  Y qX qd S )NÚpthread_sigmask)ÚhasattrÚsignalrB   Ú	SIG_BLOCKÚvalid_signalsr)   ZacceptZrecvr$   Úpopr   Z
is_exitingÚsysÚ
excepthookÚexc_info)r   r
   Úmsgr6   Zdestination_pidr   r   r   r   r   r?   ‰   s    
z_ResourceSharer._serve)N)r   r   r   r   r   Ústaticmethodr   r   r,   r-   r?   r   r   r   r   r"   =   s   
	

r"   )r    rD   r   rH   r&   Ú r   Úcontextr   r   Ú__all__ÚplatformÚobjectr   r   r"   r   r   r   r   r   r   Ú<module>   s    


`