o
    "if                     @  s  d Z ddlmZ ddlZ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dlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ G dd deZG dd deZG dd deZG dd deZG dd dejdZG dd deZG dd deZG dd deZG dd  d eZdd$d%Z G d&d' d'Z!G d(d) d)Z"e#e$fZ%ej&'d*Z(e) Z*e(d+krdd/d0Z+n&e(rddlZddl,Z,ej-.e,/ d1e* Z0e1e0d2Z2dd3d0Z+nd4d5  Z3Z+G d6d7 d7Z4G d8d9 d9Z5G d:d; d;e6Z7ej8e%fddAdBZ9G dCdD dDe6Z:G dEdF dFe;Z<e= Z>G dGdH dHZ?e= Z@dIZAdJZBG dKdL dLZCG dMdN dNZDG dOdP dPeDZEG dQdR dReDZFG dSdT dTZGG dUdV dVeGZHG dWdX dXe6ZIG dYdZ dZeIZJG d[d\ d\eIZKdd`daZLeLdbZMdcZNddZOePeOZQdeZRePeRZSG dfdg dge6ZTG dhdi diZUG djdk dkZVddmdnZWddodpZX	qdddwdxZY	qdddzd{ZZ		ddd~dZ[dddZ\G dd dZ]dddZ^dddZ_dS )zBase execnet gateway code send to the other side for bootstrapping.

:copyright: 2004-2015
:authors:
    - Holger Krekel
    - Armin Rigo
    - Benjamin Peterson
    - Ronny Pfannschmidt
    - many others
    )annotationsN)interrupt_main)BytesIO)Any)Callable)Iterator)Literal)
MutableSet)Protocol)cast)overloadc                   @     e Zd ZdddZdS )	WriteIOdatabytesreturnNonec                C     d S N selfr   r   r   M/var/www/html/corbot_env/lib/python3.10/site-packages/execnet/gateway_base.pywrite!       zWriteIO.writeNr   r   r   r   )__name__
__module____qualname__r   r   r   r   r   r           r   c                   @  r   )	ReadIOnumbytesintr   r   c                C  r   r   r   r   r!   r   r   r   read%   r   zReadIO.readNr!   r"   r   r   )r   r   r   r$   r   r   r   r   r    $   r   r    c                   @  sR   e Zd ZU ded< dddZdddZdddZdddZdddZdddZ	dS )IO	ExecModel	execmodelr!   r"   r   r   c                C  r   r   r   r#   r   r   r   r$   +   r   zIO.readr   r   c                C  r   r   r   r   r   r   r   r   -   r   zIO.writec                 C  r   r   r   r   r   r   r   
close_read/   r   zIO.close_readc                 C  r   r   r   r)   r   r   r   close_write1   r   zIO.close_write
int | Nonec                 C  r   r   r   r)   r   r   r   wait3   r   zIO.waitc                 C  r   r   r   r)   r   r   r   kill5   r   zIO.killNr%   r   r   r   )r   r,   )
r   r   r   __annotations__r$   r   r*   r+   r-   r.   r   r   r   r   r&   (   s   
 




r&   c                   @  s:   e Zd ZdZdddZdddZdd	d
ZddddZdS )Eventz3Protocol for types which look like threading.Event.r   boolc                 C  r   r   r   r)   r   r   r   is_set;   r   zEvent.is_setr   c                 C  r   r   r   r)   r   r   r   set=   r   z	Event.setc                 C  r   r   r   r)   r   r   r   clear?   r   zEvent.clearNtimeoutfloat | Nonec                 C  r   r   r   r   r6   r   r   r   r-   A   r   z
Event.waitr   r2   r/   r   r6   r7   r   r2   )r   r   r   __doc__r3   r4   r5   r-   r   r   r   r   r1   8   s    


r1   c                   @  s   e Zd Zeejd$ddZd$ddZeejdd Zeejd	d
 Z	eejdd Z
ejd%d&ddZejd'ddZejd(ddZejd)ddZejdd Zejdd Zejd*d!d"Zd#S )+r'   r   strc                 C     t  r   NotImplementedErrorr)   r   r   r   backendE      zExecModel.backendc                 C  s
   d| j  S )Nz<ExecModel %r>r@   r)   r   r   r   __repr__J      
zExecModel.__repr__c                 C  r=   r   r>   r)   r   r   r   queueM   rA   zExecModel.queuec                 C  r=   r   r>   r)   r   r   r   
subprocessR   rA   zExecModel.subprocessc                 C  r=   r   r>   r)   r   r   r   socketW   rA   zExecModel.socketr   r   c                 C  r=   r   r>   )r   funcargsr   r   r   start\      zExecModel.startr"   c                 C  r=   r   r>   r)   r   r   r   	get_ident`   rK   zExecModel.get_identdelayfloatc                 C  r=   r   r>   )r   rM   r   r   r   sleepd   rK   zExecModel.sleep   Tc                 C  r=   r   r>   )r   fdmodebufsizeclosefdr   r   r   fdopenh   rK   zExecModel.fdopenc                 C  r=   r   r>   r)   r   r   r   Lockl   rK   zExecModel.Lockc                 C  r=   r   r>   r)   r   r   r   RLockp   rK   zExecModel.RLockr1   c                 C  r=   r   r>   r)   r   r   r   r1   t   rK   zExecModel.EventNr   r<   r   r/   r   r"   rM   rN   r   r   rP   T)r   r1   )r   r   r   propertyabcabstractmethodr@   rC   rE   rF   rG   rJ   rL   rO   rU   rV   rW   r1   r   r   r   r   r'   D   s8    


r'   )	metaclassc                   @  v   e Zd ZdZedd Zedd Zedd Zdd
dZd ddZ	d!d"ddZ
d#ddZdd Zdd Zdd ZdS )$ThreadExecModelthreadc                 C     dd l }|S Nr   )rE   )r   rE   r   r   r   rE   |      zThreadExecModel.queuec                 C  rd   re   )rF   )r   rF   r   r   r   rF      rf   zThreadExecModel.subprocessc                 C  rd   re   )rG   )r   rG   r   r   r   rG      rf   zThreadExecModel.socketr   r"   c                 C     dd l }| S re   )_threadrL   )r   rh   r   r   r   rL         zThreadExecModel.get_identrM   rN   r   c                 C     dd l }|| d S re   )timerO   )r   rM   rk   r   r   r   rO         zThreadExecModel.sleepr   c                 C  s   dd l }||| d S re   )rh   start_new_thread)r   rH   rI   rh   r   r   r   rJ      s   zThreadExecModel.startrP   Tc                 C  s   dd l }|j|||d|dS )Nr   utf-8)encodingrT   )osrU   )r   rQ   rR   rS   rT   rp   r   r   r   rU      s   zThreadExecModel.fdopenc                 C  rg   re   	threadingrW   r   rr   r   r   r   rV      ri   zThreadExecModel.Lockc                 C  rg   re   rq   rs   r   r   r   rW      ri   zThreadExecModel.RLockc                 C  rg   re   )rr   r1   rs   r   r   r   r1      ri   zThreadExecModel.EventNrZ   r[   rY   r/   r\   r   r   r   r@   r]   rE   rF   rG   rL   rO   rJ   rU   rV   rW   r1   r   r   r   r   rb   y       





rb   c                   @     e Zd ZdZdS )MainThreadOnlyExecModelmain_thread_onlyN)r   r   r   r@   r   r   r   r   rw          rw   c                   @  ra   )$EventletExecModeleventletc                 C     dd l }|jS re   )r{   rE   r   r{   r   r   r   rE         zEventletExecModel.queuec                 C     dd l }|jjS re   )eventlet.green.subprocessgreenrF   r}   r   r   r   rF         zEventletExecModel.subprocessc                 C  r   re   )eventlet.green.socketr   rG   r}   r   r   r   rG      r   zEventletExecModel.socketr   r"   c                 C     dd l }|jj S re   )eventlet.green.threadr   rc   rL   r}   r   r   r   rL         zEventletExecModel.get_identrM   rN   r   c                 C  rj   re   )r{   rO   )r   rM   r{   r   r   r   rO      rl   zEventletExecModel.sleepr   c                 C     dd l }|j|g|R   d S re   )r{   spawn_n)r   rH   rI   r{   r   r   r   rJ         zEventletExecModel.startrP   Tc                 C  s   dd l }|jjj||||dS Nr   rT   )eventlet.green.osr   rp   rU   )r   rQ   rR   rS   rT   r{   r   r   r   rU      r   zEventletExecModel.fdopenc                 C  r   re   eventlet.green.threadingr   rr   rW   r}   r   r   r   rV      r   zEventletExecModel.Lockc                 C  r   re   r   r}   r   r   r   rW      r   zEventletExecModel.RLockc                 C  r   re   )r   r   rr   r1   r}   r   r   r   r1      r   zEventletExecModel.EventNrZ   r[   rY   r/   r\   rt   r   r   r   r   rz      ru   rz   c                   @  ra   )$GeventExecModelgeventc                 C  r|   re   )gevent.queuerE   r   r   r   r   r   rE      r~   zGeventExecModel.queuec                 C  r|   re   )gevent.subprocessrF   r   r   r   r   rF      r~   zGeventExecModel.subprocessc                 C  r|   re   )r   rG   r   r   r   r   rG      r~   zGeventExecModel.socketr   r"   c                 C     dd l }|j S re   )gevent.threadrc   rL   r   r   r   r   rL        
zGeventExecModel.get_identrM   rN   r   c                 C  rj   re   )r   rO   )r   rM   r   r   r   r   rO   	  rl   zGeventExecModel.sleepr   c                 C  r   re   )r   spawn)r   rH   rI   r   r   r   r   rJ     r   zGeventExecModel.startrP   Tc                 C  s   dd l }|jj||||dS r   )gevent.fileobject
fileobjectFileObjectThread)r   rQ   rR   rS   rT   r   r   r   r   rU     s   zGeventExecModel.fdopenc                 C  r   re   gevent.locklockrW   r   r   r   r   rV     r   zGeventExecModel.Lockc                 C  r   re   r   r   r   r   r   rW     r   zGeventExecModel.RLockc                 C  r   re   )gevent.eventeventr1   r   r   r   r   r1   #  r   zGeventExecModel.EventNrZ   r[   rY   r/   r\   rt   r   r   r   r   r      s    





r   r@   str | ExecModelr   c                 C  sT   t | tr| S | dkrt S | dkrt S | dkrt S | dkr#t S td| )Nrc   rx   r{   r   zunknown execmodel )
isinstancer'   rb   rw   rz   r   
ValueErrorrB   r   r   r   get_execmodel)  s   
r   c                   @  s<   e Zd ZdZdddZddddZddddZdddZdS )ReplyzhProvide access to the result of a function execution that got dispatched
    through WorkerPool.spawn().threadmodelr'   r   r   c                 C  s   || _ | | _d| _d S NT)taskr1   _result_readyrunning)r   r   r   r   r   r   __init__<  s   

zReply.__init__Nr6   r7   c                 C  s*   |  | z| jW S  ty   | jdw )zget the result object from an asynchronous function execution.
        if the function execution raised an exception,
        then calling get() will reraise that exception
        including its traceback.
        N)
waitfinish_resultAttributeError_excr8   r   r   r   getA  s   
z	Reply.getc                 C  s    | j |std| jd S )Nztimeout waiting for )r   r-   OSErrorr   r8   r   r   r   r   M  s   zReply.waitfinishc              
   C  s   | j \}}}z6z
||i || _W n ty& } z	|| _W Y d }~nd }~ww W | j  d| _d S W | j  d| _d S | j  d| _w NF)r   r   BaseExceptionr   r   r4   r   )r   rH   rI   kwargsexcr   r   r   runQ  s    




z	Reply.run)r   r'   r   r   r   )r6   r7   r6   r7   r   r   r/   )r   r   r   r;   r   r   r   r   r   r   r   r   r   8  s    
r   c                   @  sz   e Zd ZU dZded< d#d$ddZd%ddZd%ddZd&ddZd'ddZ	d(ddZ
d)ddZd*d+dd Zd*d+d!d"ZdS ),
WorkerPoola  A WorkerPool allows to spawn function executions
    to threads, returning a reply object on which you
    can ask for the result (and get exceptions reraised).

    This implementation allows the main thread to integrate
    itself into performing function execution through
    calling integrate_as_primary_thread() which will return
    when the pool received a trigger_shutdown().

    By default allows unlimited number of spawns.
    zReply | None_primary_thread_taskFr(   r'   
hasprimaryr2   r   r   c                 C  sX   || _ | j  | _t | _d| _g | _|r'| j jdvrtd| j 	 | _
d S d | _
d S )NFrc   rx   z%hasprimary=True requires thread model)r(   rV   _running_lockr4   _running_shuttingdown_waitall_eventsr@   r   r1   _primary_thread_task_ready)r   r(   r   r   r   r   r   l  s   
zWorkerPool.__init__c                 C  s   | j jdv sJ | j | j}|dusJ 	 |  | j}|du r"dS | | | j | jr7	 W d   dS || ju r@|  W d   n1 sJw   Y  q)zyIntegrate the thread with which we are called as a primary
        thread for executing functions triggered with spawn().r   N)	r(   r@   r   r-   r   _perform_spawnr   r   r5   )r   primary_thread_task_readyreplyr   r   r   integrate_as_primary_thready  s$   

z&WorkerPool.integrate_as_primary_threadc                 C  s\   | j ! d| _| jd urd | _| j  W d    d S W d    d S 1 s'w   Y  d S r   )r   r   r   r   r4   r)   r   r   r   trigger_shutdown  s   
"zWorkerPool.trigger_shutdownr"   c                 C  s
   t | jS r   )lenr   r)   r   r   r   active_count  rD   zWorkerPool.active_countr   r   c                 C  s   |   | j1 | j| | js(| jr0| j }|  | jsW d    d S W d    d S W d    d S 1 s;w   Y  d S r   )r   r   r   remover   popr4   )r   r   waitall_eventr   r   r   r     s   
"zWorkerPool._perform_spawnc                 C  s^   | j }|d ur-| s|| _|  dS | jjdkr-| jd ur-| j  || _|  dS dS )NTrx   F)r   r3   r   r4   r(   r@   r   )r   r   r   r   r   r   _try_send_to_primary_thread  s   

z&WorkerPool._try_send_to_primary_threadc                 O  s   t |||f| j}| j, | jrtd| j| | |s0| j| j	|f W d   |S W d   |S 1 s;w   Y  |S )zAAsynchronously dispatch func(*args, **kwargs) and return a Reply.zpool is shutting downN)
r   r(   r   r   r   r   addr   rJ   r   )r   rH   rI   r   r   r   r   r   r     s   


zWorkerPool.spawnNr6   r7   c                 C  s   |    | j|dS )z;Trigger shutdown and wait for completion of all executions.r6   )r   waitallr8   r   r   r   	terminate  s   zWorkerPool.terminatec                 C  s`   | j  | js	 W d   dS | j }| j| W d   n1 s%w   Y  |j|dS )z5Wait until all active spawns have finished executing.NTr   )r   r   r(   r1   r   appendr-   )r   r6   my_waitall_eventr   r   r   r     s   
zWorkerPool.waitallF)r(   r'   r   r2   r   r   r/   rZ   )r   r   r   r   )r   r   r   r2   )r   r   r   r:   )r   r   r   r;   r0   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ]  s   
 




	
r   EXECNET_DEBUG2msgobjectr   c                  G  sP   zd tt| }tjdt d| d tj  W d S  ty'   Y d S w )N [z] 
)	joinmapr<   sysstderrr   pidflush	Exception)r   liner   r   r   trace  s   r   zexecnet-debug-%dwc                  G  s   zd tt| }t|d  t  W d S  tyI } z'ztjdt	 d|d W n	 ty6   Y nw W Y d }~d S W Y d }~d S d }~ww )Nr   r   r   z] exception during tracing: )
r   r   r<   	debugfiler   r   r   r   r   r   )r   r   r   r   r   r   r     s   c                  G  r   r   r   r   r   r   r   <lambda>  r   r   c                   @  sH   e Zd ZeeefZdddZdd
dZdddZ	dddZ
dddZdS )Popen2IOr(   r'   r   r   c              	   C  s   ||| _ | _tjdkr0dd l}z|| tj || tj W n t	t
fy/   Y nw t|d|j| _t|d|j| _|| _d S )Nwin32r   buffer)outfileinfiler   platformmsvcrtsetmodefilenorp   O_BINARYr   r   getattrr$   _readr   _writer(   )r   r   r   r(   r   r   r   r   r     s   

zPopen2IO.__init__r!   r"   r   c                 C  sR   d}|t |kr'| |t | }|std|t |f ||7 }|t |ks|S )z,Read exactly 'numbytes' bytes from the pipe.    zexpected %d bytes, got %d)r   r   EOFError)r   r!   bufr   r   r   r   r$     s   zPopen2IO.readr   c                 C  s&   t |tsJ | | | j  dS )zWrite out all data bytes.N)r   r   r   r   r   r   r   r   r   r     s   
zPopen2IO.writec                 C     | j   d S r   )r   closer)   r   r   r   r*   "     zPopen2IO.close_readc                 C  r   r   )r   r   r)   r   r   r   r+   %  r   zPopen2IO.close_writeN)r(   r'   r   r   r%   r   r/   )r   r   r   IOErrorr   r   errorr   r$   r   r*   r+   r   r   r   r   r     s    




r   c                   @  s&  e Zd ZU dZi Zded< d>d?ddZed@ddZdAddZ	dBddZ
dCddZdDddZdZd efee< dDd!d"Zd#Zd$efee< dDd%d&Zd'Zd(efee< dDd)d*Zd+Zd,efee< dDd-d.Zd/Zd0efee< dDd1d2Zd3Zd4efee< dDd5d6Zd7Zd8efee< dDd9d:Zd;Zd<efee< d=S )EMessagez.Encapsulates Messages and their wire protocol.z=dict[int, tuple[str, Callable[[Message, BaseGateway], None]]]_typesr   r   msgcoder"   	channelidr   r   r   r   c                 C  s   || _ || _|| _d S r   )r   r   r   )r   r   r   r   r   r   r   r   /  s   
zMessage.__init__ior    c              
   C  sl   z|  d}|stdW n ty# } z
td|jd  d d }~ww td|\}}}t|||  |S )N	   z
empty readzcouldn't load message header, r   !bii)r$   r   rI   structunpackr   )r   headeremsgtypechannelpayloadr   r   r   from_io4  s   
zMessage.from_ior   c                 C  s.   t d| j| jt| j}||| j  d S )Nr  )r  packr   r   r   r   r   )r   r   r  r   r   r   to_io?  s   zMessage.to_iogatewayBaseGatewayc                 C  s   | j | j d }|| | d S )NrP   )r   r   )r   r  handlerr   r   r   receivedC     zMessage.receivedr<   c                 C  s0   | j | j d }d| d| j dt| j dS )Nr   z	<Message z	 channel=z	 lendata=>)r   r   r   r   r   )r   namer   r   r   rC   G  s    zMessage.__repr__messagec                 C  sH   t |jj|j |jjd}|tj	| j
t| |tj| j
 d S )N)numchannelsnumexecutingr(   )r   _channelfactory	_channels	_execpoolr   r(   r@   _sendr   CHANNEL_DATAr   dumps_internalCHANNEL_CLOSE)r  r  dr   r   r   _statusK  s   
zMessage._statusSTATUSc                 C  sF   t | j|}t|tsJ |}| jdkr||_d S ||j| j_d S re   )loads_internalr   r   tupler   
_strconfigr  new)r  r  r   	strconfigr   r   r   _reconfigureZ  s   

zMessage._reconfigurerP   RECONFIGUREc                 C  s   t |r   )GatewayReceivedTerminater  r  r   r   r   _gateway_terminatef  s   zMessage._gateway_terminate   GATEWAY_TERMINATEc                 C  s"   |j | j}|j|| jd d S )N)r  
sourcetask)r  r#  r   _local_schedulexecr   )r  r  r  r   r   r   _channel_execl  s   zMessage._channel_exec   CHANNEL_EXECc                 C  s   |j | j| j d S r   )r  _local_receiver   r   r(  r   r   r   _channel_datas     zMessage._channel_data   r  c                 C  s   |j | j d S r   r  _local_closer   r(  r   r   r   _channel_closey     zMessage._channel_close   r  c                 C  s4   t | j}t|tsJ t|}|j| j| d S r   )r   r   r   r<   RemoteErrorr  r6  r   )r  r  error_messageremote_errorr   r   r   _channel_close_error  s   
zMessage._channel_close_error   CHANNEL_CLOSE_ERRORc                 C  s   |j j| jdd d S NT)sendonlyr5  r(  r   r   r   _channel_last_message  r3  zMessage._channel_last_message   CHANNEL_LAST_MESSAGENr   r   r   r"   r   r"   r   r   r   r   )r   r    r   r   )r   r   r   r   )r  r  r   r   rX   )r  r   r  r  r   r   )r   r   r   r;   r   r0   r   staticmethodr	  r  r  rC   r  r  r%  r&  r)  r+  r.  r0  r2  r  r7  r  r=  r?  rB  rD  r   r   r   r   r   )  sB   
 





	





r   c                   @  rv   )r'  z'Receiverthread got termination message.Nr   r   r   r;   r   r   r   r   r'    ry   r'  r   r   sysextuple[type[BaseException], ...]r<   c                 C  sZ   z|t | | | j}d|}W |S  |y     ty,   t | j d|  }Y |S w )N : )type__traceback__r   r   r   )r   format_exceptionrI  l	errortextr   r   r   geterrortext  s   rR  c                      s@   e Zd ZdZd fddZddd	Zdd
dZdddZ  ZS )r:  z=Exception containing a stringified error from the other side.	formattedr<   r   r   c                   s   t    || _d S r   )superr   rS  )r   rS  	__class__r   r   r     s   

zRemoteError.__init__c                 C     | j S r   )rS  r)   r   r   r   __str__  s   zRemoteError.__str__c                 C  s   | j j d| j S )NrL  )rV  r   rS  r)   r   r   r   rC     s   zRemoteError.__repr__c                 C  s0   | j tkrtjdt  d| d d S d S )Nr   z] Warning: unhandled r   )rS  INTERRUPT_TEXTr   r   r   rp   getpidr)   r   r   r   warn  s   
"zRemoteError.warn)rS  r<   r   r   rX   r/   )	r   r   r   r;   r   rX  rC   r[  __classcell__r   r   rU  r   r:    s    

r:  c                   @  rv   )TimeoutErrorz0Exception indicating that a timeout was reached.NrH  r   r   r   r   r]    ry   r]  c                   @  s   e Zd ZdZeZeZdZdZdDd
dZdEddZ	e
fdFddZdGddZdHddZdd ZdIddZedJdKd$d%Ze		dLdMd(d%Z	)	dNdOd,d%ZdPdHd.d/ZdPdQd2d3ZdRd5d6ZdPdSd8d9ZdTd;d<ZdUd=d>ZeZ	dVdWdBdCZd-S )XChannelzFCommunication channel between two Python Interpreter execution points.i  Fr  r  idr"   r   r   c                 C  sd   t |tsJ t |trJ || _t|dd| _|| _| jjj	 | _
d| _| jj | _g | _dS )z	:private:r"  TFFN)r   r"   rM  r  r   r"  r_  r(   rE   Queue_items_closedr1   _receiveclosed_remoteerrors)r   r  r_  r   r   r   r     s   
zChannel.__init__r   r   c                 G  s   | j j| jg|R   d S r   )r  _tracer_  r   r   r   r   r   rf       zChannel._tracecallbackCallable[[Any], Any]	endmarkerc              	   C  s   | j jj}| j jb | jdu rt| d| j}d| _	 z|jdd}W n | j jjj	yC   | j
sA| j sA||| jf|| j< Y nw |tu rV|| |turU|| n|| qW d   dS W d   dS 1 snw   Y  dS )a  Set a callback function for receiving items.

        All already-queued items will immediately trigger the callback.
        Afterwards the callback will execute in the receiver thread
        for each received data item and calls to ``receive()`` will
        raise an error.
        If an endmarker is specified the callback will eventually
        be called with the endmarker when the channel closes.
        Nz  has callback already registeredrP   F)block)r  r  
_callbacks_receivelockrb  r   r   r(   rE   Emptyrc  rd  r3   r"  r_  	ENDMARKERputNO_ENDMARKER_WANTED)r   ri  rk  rm  itemsolditemr   r   r   setcallback  s2   



"zChannel.setcallbackr<   c                 C  s   |   rdpd}d| j|f S )Nclosedopenz<Channel id=%d %s>)isclosedr_  )r   flagr   r   r   rC     r  zChannel.__repr__c              	   C  s   | j d u rd S | d | jr| jD ]}|  qd S | j r"d S td urJ| jd u r/tj	}ntj
}z| j || j W d S  ttfyI   Y d S w d S )Nzchannel.__del__)r  rf  rc  re  r[  rd  r3   r   rb  rD  r  r  r_  r   r   )r   r   r   r   r   r   __del__  s&   





zChannel.__del__c                 C  sD   z| j dW S  ty!   z| jjW  Y S  ty    Y Y d S w w re   )re  r   
IndexErrorr  _errorr   r)   r   r   r   _getremoteerror  s   zChannel._getremoteerrorr2   c                 C  rW  )z^Return True if the channel is closed.

        A closed channel may still hold items.
        )rc  r)   r   r   r   rx  )  s   zChannel.isclosed.rR   Literal['r']
proxycloseChannelFileReadc                 C  r   r   r   r   rR   r  r   r   r   makefile0  s   zChannel.makefileLiteral['w']ChannelFileWritec                 C  r   r   r   r  r   r   r   r  4  s   r   Literal['r', 'w']"ChannelFileWrite | ChannelFileReadc                 C  s8   |dkr
t | |dS |dkrt| |dS td|d)zReturn a file-like object.

        mode can be 'w' or 'r' for writeable/readable files.
        If proxyclose is true, file.close() will also close the channel.
        r   )r  r  rzmode z not available)r  r  r   r  r   r   r   r  <  s
   
Nc                 C  s   | j rtd| jr| j| d | jsa| j s8| jj}|dur,|tj	| j
t| n|tj| j
 | d t|trC| j| d| _| j  | j}|durW|t | jj| j
 dS dS )zClose down this channel with an optional error message.

        Note that closing of a channel tied to remote_exec happens
        automatically at the end of execution and cannot
        be done explicitly.
        z2cannot explicitly close channel within remote_execz"ignoring redundant call to close()Nzsent channel close messageT)
_executingr   rc  r  rf  rd  r3   r  r   r?  r_  r  r  r   r:  re  r   r4   rb  rq  rp  r  _no_longer_opened)r   r   rq  rE   r   r   r   r   L  s(   




zChannel.closer6   r7   c                 C  s:   | j j|d | j  s| d| |  }|r|dS )a^  Wait until this channel is closed (or the remote side
        otherwise signalled that no more data was being sent).

        The channel may still hold receiveable items, but not receive
        any more after waitclose() has returned.

        Exceptions from executing code on the other side are reraised as local
        channel.RemoteErrors.

        EOFError is raised if the reading-connection was prematurely closed,
        which often indicates a dying process.

        self.TimeoutError is raised after the specified number of seconds
        (default is None, i.e. wait indefinitely).
        r   zTimeout after %r secondsN)rd  r-   r3   r]  r}  )r   r6   r   r   r   r   	waitclosem  s   
zChannel.waitcloseitemc                 C  s2   |   rtd| | jtj| jt| dS )a!  Sends the given item to the other side of the channel,
        possibly blocking if the sender queue is full.

        The item must be a simple Python type and will be
        copied to the other side by value.

        OSError is raised if the write pipe was prematurely closed.
        zcannot send to N)rx  r   r  r  r   r  r_  r  )r   r  r   r   r   send  s   	zChannel.sendr   c                 C  sr   | j }|du rtdz|j|d}W n | jjjjy&   | d| dw |tu r7|	| | 
 p6t |S )a  Receive a data item that was sent from the other side.

        timeout: None [default] blocked waiting. A positive number
        indicates the number of seconds after which a channel.TimeoutError
        exception will be raised if no item was received.

        Note that exceptions from the remotely executing code will be
        reraised as channel.RemoteError exceptions containing
        a textual representation of the remote traceback.
        Nz/cannot receive(), channel has receiver callbackr   zno item after %r seconds)rb  r   r   r  r(   rE   ro  r]  rp  rq  r}  r   )r   r6   	itemqueuexr   r   r   receive  s   
zChannel.receiveIterator[Any]c                 C  s   | S r   r   r)   r   r   r   __iter__     zChannel.__iter__c                 C  s    z|   W S  ty   td w r   )r  r   StopIterationr)   r   r   r   next  s
   
zChannel.nextTpy2str_as_py3strpy3str_as_py2strc                 C  s.   ||f| _ t| j }| jjtj| j|d dS )zSet the string coercion for this channel.

        The default is to try to convert py2 str as py3 str,
        but not to try and convert py3 str to py2 str
        )r   N)r"  r  r  r  r   r&  r_  )r   r  r  r   r   r   r   reconfigure  s   

zChannel.reconfigure)r  r  r_  r"   r   r   r   r   r   r   )ri  rj  rk  r   r   r   rX   r/   r9   ).)rR   r~  r  r2   r   r  )..)rR   r  r  r2   r   r  )r   F)rR   r  r  r2   r   r  r   r   )r  r   r   r   )r6   r7   r   r   )r   r  )r   r   r`  )r  r2   r  r2   r   r   )r   r   r   r;   r:  r]  _INTERNALWAKEUPr  r   rf  rr  ru  rC   rz  r}  rx  r   r  r   r  r  r  r  r  __next__r  r   r   r   r   r^    s@    


$

	!


r^  zkeyboard-interruptedzJconcurrent remote_exec would cause deadlock for main_thread_only execmodelc                   @  sX   e Zd Zdddd	Zd d!ddZd"ddZd#ddZd$d%ddZd#ddZd&ddZ	d
S )'ChannelFactoryrP   r  r  
startcountr"   r   r   c                 C  s8   t  | _i | _|j | _|| _|| _d| _	t
| _d S r   )weakrefWeakValueDictionaryr  rm  r(   rV   
_writelockr  countfinishedlist_list)r   r  r  r   r   r   r     s   
zChannelFactory.__init__Nr_  r,   r^  c              	   C  s   | j ? | jrtd| j |du r| j}|  jd7  _z| j| }W n ty8   t| j| }| j|< Y nw |W  d   S 1 sEw   Y  dS )z:Create a new Channel with 'id' (or create new id if None).zconnection already closed: Nr*  )r  r  r   r  r  r  KeyErrorr^  )r   r_  r  r   r   r   r#    s   $zChannelFactory.newlist[Channel]c                 C  s   |  | j S r   )r  r  valuesr)   r   r   r   channels     zChannelFactory.channelsc                 C  sd   z| j |= W n	 ty   Y nw z| j|\}}}W n
 ty%   Y d S w |tur0|| d S d S r   )r  r  rm  r   rr  )r   r_  ri  rk  r$  r   r   r   r    s   z ChannelFactory._no_longer_openedFrA  r2   c                 C  sx   | j |}|d u r|r|  | | d S |r|j| |j}|d ur+|t | | |s5d|_	|j
  d S r   )r  r   r[  r  re  r   rb  rq  rp  rc  rd  r4   )r   r_  remoteerrorrA  r  rE   r   r   r   r6    s   

zChannelFactory._local_closec              
   C  s   | j |}z
| j| \}}}W n$ ty4   |d ur|jnd }|d u r'Y d S t||}|| Y d S w zt|||}|| W d S  tyt }	 z&| j	d|	  | j
|	}
| jtj|t|
 | ||
 W Y d }	~	d S d }	~	ww )Nzexception during callback: %s)r  r   rm  r  rb  r   rq  r   r  rf  _geterrortextr  r   r?  r  r6  )r   r_  r   r  ri  rk  r$  rE   r  r   rQ  r   r   r   r1    s,   
zChannelFactory._local_receivec                 C  sl   | j  d| _W d    n1 sw   Y  | | jD ]	}| j|dd q| | jD ]}| | q,d S r@  )r  r  r  r  r6  rm  r  )r   r_  r   r   r   _finished_receiving$  s   z"ChannelFactory._finished_receiving)rP   )r  r  r  r"   r   r   r   )r_  r,   r   r^  )r   r  )r_  r"   r   r   r   )r_  r"   rA  r2   r   r   r/   )
r   r   r   r   r#  r  r  r6  r1  r  r   r   r   r   r    s    


r  c                   @  s6   e Zd Zdddd	Zdd
dZdddZdddZdS )ChannelFileTr  r^  r  r2   r   r   c                 C  s   || _ || _d S r   )r  _proxycloser   r  r  r   r   r   r   .  s   
zChannelFile.__init__c                 C  s   dS r   r   r)   r   r   r   isatty2  r  zChannelFile.isattyc                 C  s   | j r
| j  d S d S r   )r  r  r   r)   r   r   r   r   5  s   zChannelFile.closer<   c                 C  s"   | j  rdpd}d| j j|f S )Nrv  rw  z<ChannelFile %d %s>)r  rx  r_  )r   stater   r   r   rC   9  s   zChannelFile.__repr__NTr  r^  r  r2   r   r   r9   r/   rX   )r   r   r   r   r  r   rC   r   r   r   r   r  -  s
    

r  c                   @  s    e Zd Zd
ddZdddZd	S )r  outr   r   r   c                 C  s   | j | d S r   )r  r  )r   r  r   r   r   r   ?  r  zChannelFileWrite.writec                 C  r   r   r   r)   r   r   r   r   B  r  zChannelFileWrite.flushN)r  r   r   r   r/   )r   r   r   r   r   r   r   r   r   r  >  s    
r  c                      s4   e Zd Zdd fdd	ZdddZdddZ  ZS )r  Tr  r^  r  r2   r   r   c                   s   t  || d | _d S r   )rT  r   _bufferr  rU  r   r   r   G  s   
zChannelFileRead.__init__nr"   r<   c                 C  s   z+| j d u rtt| j | _ t| j |k r*|  j tt| j 7  _ t| j |k sW n ty8   |   Y nw | j d u rBd}|S | j d | }| j |d  | _ |S )NrK  )r  r   r<   r  r  r   r   r   )r   r  retr   r   r   r$   K  s    

zChannelFileRead.readc                 C  s   | j d ur!| j d}|dkr| |d S | t| j d }n| d}|rD|d dkrD| d}|s8	 |S ||7 }|rD|d dks.|S )Nr   rP   )r  findr$   r   )r   ir   cr   r   r   readlineZ  s   


zChannelFileRead.readliner  r  )r  r"   r   r<   rX   )r   r   r   r   r$   r  r\  r   r   rU  r   r  F  s    
r  c                   @  st   e Zd ZeZdZd)d*d	d
Zd+ddZd,ddZd,ddZ	d,ddZ
d-d.ddZd/d d!Zd0d"d#Zd1d2d'd(Zd$S )3r  z<worker>r*  r   r&   _startcountr"   r   r   c                 C  sV   |j | _ || _|| _tjtjf| _t| || _| j 	 | _
t| _t| _t| j | _d S r   )r(   _ior_  Unserializerr  r  r"  r  r  rW   rn  r   _BaseGateway__tracerR  r  r   _receivepool)r   r   r_  r  r   r   r   r   n  s   zBaseGateway.__init__r   r   c                 G  s   | j | jg|R   d S r   )r  r_  rg  r   r   r   rf  z  s   zBaseGateway._tracec                 C  s   | j | j d S r   )r  r   _thread_receiverr)   r   r   r   _initreceive}  r8  zBaseGateway._initreceivec              
     s:  d fdd}|d  j }z%	 t|}|d	|  j |  ~W d    n1 s.w   Y  q ttfy>   Y n1 tyV } z|d
 | _W Y d }~nd }~w t	yn } z| 
| W Y d }~nd }~ww |d  j  |d    |d  j   |d  j   |d  j  d S )Nr   r   r   r   c                    s    j dg| R   d S )Nz[receiver-thread]rf  r   r)   r   r   log  r3  z)BaseGateway._thread_receiver.<locals>.logzRECEIVERTHREAD: starting to runrP   r  z-EOF without prior gateway termination messagezfinishing receiving threadzterminating executionzclosing readzclosing writez#terminating our receive pseudo poolr  )r  r   r	  rn  r  KeyboardInterruptr'  r   r|  r   r  r  r  _terminate_executionr*   r+   r  r   )r   r  r   r   r   r   r)   r   r    s@   





zBaseGateway._thread_receiverc                 C  r   r   r   r)   r   r   r   r    r  z BaseGateway._terminate_executionr   r   r   r   r   r   c              
   C  s`   t |||}z|| j | d| W d S  ttfy/ } z| d|| td|d }~ww )Nsentzfailed to sendzcannot send (already closed?))r   r  r  rf  r   r   )r   r   r   r   r  r  r   r   r   r    s   
zBaseGateway._sendr  r^  r,  c                 C  s   | d d S )Nzexecution disallowed)r   )r   r  r,  r   r   r   r-    r   zBaseGateway._local_schedulexecc                 C  s
   | j  S )z!Return a new independent channel.)r  r#  r)   r   r   r   
newchannel  s   
zBaseGateway.newchannelNr6   r7   c                 C  s   |  d | j| dS )z%Wait for receiverthread to terminate.z%waiting for receiver thread to finishN)rf  r  r   r8   r   r   r   r     s   
zBaseGateway.join)r*  )r   r&   r  r"   r   r   r  r/   rE  rF  r  r^  r,  r   r   r   )r   r^  r   r   )r   r   r   rI  _sysexr_  r   rf  r  r  r  r  r-  r  r   r   r   r   r   r  j  s    



 


r  c                   @  s4   e Zd ZdddZdd	d
ZdddZdddZdS )WorkerGatewayr  r^  r,  r   r   r   c                 C  sb   | j jjdkr!| jd usJ | jjdds|t d S | j  t|}| j 	| j
||f d S )Nrx   rP   r   )r  r(   r@   _executetask_completer-   r   MAIN_THREAD_ONLY_DEADLOCK_TEXTr5   r   r   executetask)r   r  r,  sourcetask_r   r   r   r-    s   

z WorkerGateway._local_schedulexecc                 C  s   |  d | j  | jdsF|  d tjdkr(|  d tt d nt	d ur4|  d t	  | jdsH|  d	 t
d
 d S d S d S )Nzshutting down execution poolg      @z5execution ongoing after 5 secs, trying interrupt_mainr   zsending ourselves a SIGINTr*  zcalling interrupt_main()g      $@z?execution did not finish in another 10 secs, calling os._exit()rP   )rf  r  r   r   r   r   rp   r.   rZ  r   _exitr)   r   r   r   r    s"   






z"WorkerGateway._terminate_executionc                   s   d fdd} j jdv }t j |d _d  _ j jd	kr) j   _ j  |d
    z|r=|d  j  |d  	  W d S  t
yU   |d Y d S w )Nr   r<   r   r   c                   s     d|   d S )Nz[serve] r  r   r)   r   r   r     r8  z"WorkerGateway.serve.<locals>.tracer   )r   rx   zspawning receiver threadzintegrating as primary threadzjoining receiver threadz,swallowing keyboardinterrupt, serve finished)r   r<   r   r   )r(   r@   r   r  r  r1   r4   r  r   r   r  )r   r   r   r   r)   r   serve  s$   

zWorkerGateway.server  Etuple[Channel, tuple[str, str | None, str | None, dict[str, object]]]c              
   C  sn  z^|\}\}}}}|dd}|  d|j dt|d d   d|_z0t|d |p+dd	}t|| |rJ|  d
||f  || }	|	|fi | W d|_|  d n	d|_|  d w W nF tyk   |t   t	y }
 z.t
|
ts|jjjs|  d|
 | |
}|| W Y d }
~
d S |  d W Y d }
~
nd }
~
ww |  | jd ur| j  d S d S )N__channelexec__)r  r   zexecution starts[z]: 2   Tr   z<remote exec>execzcalling %s(**%60r)Fzexecution finishedzgot exception: z,ignoring EOFError because receiving finished)rf  r_  reprr  compiler  r  r   rY  r   r   r   r  r  r  r  r  r4   )r   r  r  source	file_name	call_namer   loccofunctionr   rQ  r   r   r   r     sD   
$






zWorkerGateway.executetaskNr  r/   )r  r  r   r   )r   r   r   r-  r  r  r  r   r   r   r   r    s
    


r  c                   @     e Zd ZdS )DataFormatErrorNr   r   r   r   r   r   r   r  +      r  c                   @  rv   )	DumpErrorz"Error while serializing an object.NrH  r   r   r   r   r  /  ry   r  c                   @  rv   )	LoadErrorz$Error while unserializing an object.NrH  r   r   r   r   r  3  ry   r  r  r"   r   c                 C  s
   t | gS r   )r   )r  r   r   r   bchr7  rD   r  r*  iz!dz!ddc                   @  r  )_StopNr  r   r   r   r   r  E  r  r  c                   @  sd   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdS )opcodez#Container for name -> num mappings.   @   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P   Q   R   S   TN)r   r   r   r;   
BUILDTUPLEBYTESCHANNELFALSEFLOAT	FROZENSETINTLONGLONGINTLONGLONGNEWDICTNEWLISTNONE	PY2STRING	PY3STRINGSETSETITEMSTOPTRUEUNICODECOMPLEXr   r   r   r   r  I  s.    r  c                   @  s  e Zd ZU i Zded< dZdZ		dEdFddZdGdHddZdIddZ	e	ee
j< dIddZeee
j< dIddZeee
j< dIddZeee
j< dIddZeee
j< eZeee
j< eZeee
j< dIdd Zeee
j< dId!d"Zeee
j< dJd$d%ZdKd'd(ZdId)d*Zeee
j< dId+d,Z e ee
j!< dId-d.Z"e"ee
j#< dId/d0Z$e$ee
j%< dId1d2Z&e&ee
j'< dId3d4Z(e(ee
j)< dId5d6Z*e*ee
j+< dLd9d:Z,dId;d<Z-e-ee
j.< dId=d>Z/e/ee
j0< dId?d@Z1e1ee
j2< dIdAdBZ3e3ee
j4< dIdCdDZ5e5ee
j6< dS )Mr  z+dict[bytes, Callable[[Unserializer], None]]num2funcTFNstreamr    channel_or_gatewayChannel | BaseGateway | Noner$  tuple[bool, bool] | Noner   r   c                 C  sX   t |tr	|j}n|}|d ur|j}|r|\| _| _|| _|d u r&d | _d S |j| _d S r   )	r   r^  r  r"  r  r  r  channelfactoryr  )r   r  r  r$  gwr   r   r   r   h  s   

zUnserializer.__init__	versionedr2   r   c                 C  s   |r| j d}|tkrtd| g | _z(	 | j d}|s!tz| j| }W n ty8   td|dd w ||  q tyX   t	| jdkrPtdd | j
d Y S w )NrP   zwrong dumpformat version %rTzunknown opcode z - wire protocol corruption?zinternal unserialization errorr   )r  r$   DUMPFORMAT_VERSIONr  stackr   r  r  r  r   r   )r   r  verr  loaderr   r   r   load|  s4   

zUnserializer.loadc                 C  s   | j d  d S r   r  r   r)   r   r   r   	load_none  r  zUnserializer.load_nonec                 C     | j d d S r   r  r)   r   r   r   	load_true  r  zUnserializer.load_truec                 C  r   r   r  r)   r   r   r   
load_false  r  zUnserializer.load_falsec                 C     |   }| j| d S r   
_read_int4r  r   r   r  r   r   r   load_int     zUnserializer.load_intc                 C  s   |   }| jt| d S r   )_read_byte_stringr  r   r"   r   sr   r   r   load_longint  s   zUnserializer.load_longintc                 C  s(   | j t}| jtt|d  d S re   )r  r$   FLOAT_FORMAT_SIZEr  r   r  r  FLOAT_FORMATr   binaryr   r   r   
load_float     zUnserializer.load_floatc                 C  s(   | j t}| jttt|  d S r   )	r  r$   COMPLEX_FORMAT_SIZEr  r   complexr  r  COMPLEX_FORMATr/  r   r   r   load_complex  r2  zUnserializer.load_complexr"   c                 C  s   t d| jdd }|S )N!ir4  r   )r  r  r  r$   )r   valuer   r   r   r%    s   zUnserializer._read_int4r   c                 C  s   |   }| j|}|S r   )r%  r  r$   )r   lengthas_bytesr   r   r   r)    s   zUnserializer._read_byte_stringc                 C  s4   |   }| jr| j| d S | j|d d S Nrn   )r)  r  r  r   decode)r   r:  r   r   r   load_py3string  s   zUnserializer.load_py3stringc                 C  s.   |   }| jr|d}n|}| j| d S )Nzlatin-1)r)  r  r<  r  r   )r   r:  r+  r   r   r   load_py2string  s
   zUnserializer.load_py2stringc                 C  r#  r   )r)  r  r   r*  r   r   r   
load_bytes  r(  zUnserializer.load_bytesc                 C  s   | j |  d d S r;  )r  r   r)  r<  r)   r   r   r   load_unicode  rh  zUnserializer.load_unicodec                 C  s   |   }| jd g|  d S r   r$  )r   r9  r   r   r   load_newlist  s   zUnserializer.load_newlistc                 C  s<   t | jdk rtd| j }| j }|| jd |< d S )Nr/  znot enough items for setitemr  )r   r  r  r   )r   r8  keyr   r   r   load_setitem  s
   

zUnserializer.load_setitemc                 C  s   | j i  d S r   r  r)   r   r   r   load_newdict  r  zUnserializer.load_newdicttype_rM  c                 C  sP   |   }|r|| j| d  }| j| d = | j| d S | j|  d S r   r$  )r   rE  r9  resr   r   r   _load_collection  s   zUnserializer._load_collectionc                 C     |  t d S r   )rG  r!  r)   r   r   r   load_buildtuple  r   zUnserializer.load_buildtuplec                 C  rH  r   )rG  r4   r)   r   r   r   load_set  r   zUnserializer.load_setc                 C  rH  r   )rG  	frozensetr)   r   r   r   load_frozenset  r   zUnserializer.load_frozensetc                 C  s   t r   )r  r)   r   r   r   	load_stop  r  zUnserializer.load_stopc                 C  s2   |   }| jd usJ | j|}| j| d S r   )r%  r  r#  r  r   )r   r_  r  r   r   r   load_channel  s   zUnserializer.load_channelNN)r  r    r  r  r$  r  r   r   r   )r  r2   r   r   r/   rZ   )r   r   )rE  rM  r   r   )7r   r   r   r  r0   r  r  r   r  r  r  r  r!  r  r"  r  r'  r  r,  r  	load_longr  load_longlongr  r1  r   r6  r  r%  r)  r=  r
  r>  r	  r?  r  r@  r  rA  r  rC  r  rD  r  rG  rI  r  rJ  r  rL  r  rM  r  rN  r  r   r   r   r   r  c  sj   
 

































	







r  objc                 C  s   t  j| ddS )zSerialize the given obj to a bytestring.

    The obj and all contained objects must be of a builtin
    Python type (so nested dicts, sets, etc. are all OK but
    not user-level instances).
    Tr  _SerializersaverR  r   r   r   dumps#  s   rX  c                 C  s   t | jdj|dd dS )zCwrite a serialized bytestring of the given obj to the given stream.)r   TrS  N)rU  r   rV  )byteiorR  r   r   r   dump-  s   rZ  F
bytestringr  r2   r  r   c                 C  s   t | }t|||dS )aX  Deserialize the given bytestring to an object.

    py2str_as_py3str: If true then string (str) objects previously
                      dumped on Python2 will be loaded as Python3
                      strings which really are text objects.
    py3str_as_py2str: If true then string (str) objects previously
                      dumped on Python3 will be loaded as Python2
                      strings instead of unicode objects.

    If the bytestring was dumped with an incompatible protocol
    version or if the bytestring is corrupted, the
    ``execnet.DataFormatError`` will be raised.
    )r  r  )r   r  )r[  r  r  r   r   r   r   loads2  s   r\  r   c                 C  s   ||f}t | |djddS )z}Derserialize an object form the specified stream.

    Behaviour and parameters are otherwise the same as with ``loads``
    )r$  TrS  )r  r  )r   r  r  r$  r   r   r   r  H  s   r  r$  r  c                 C  s   t | }t||| S r   )r   r  r  )r[  r  r$  r   r   r   r   r   S  s   r   c                 C  s   t  | S r   rT  rW  r   r   r   r  \  s   r  c                   @  s  e Zd ZU i Zded< d[d\dd	Zd]d^ddZd_ddZd`ddZdaddZ	dbddZ
dcd d!Zdcd"d#Zdbd$d%Zddd*d+Zded,d-Zdfd/d0Zdgd3d4Zdhd7d8Zd9ef fdid;d<Zdjd?d@ZdkdCdDZdldGdHZdmdKdLZdndOdPZdodRdSZdpdUdVZdqdYdZZdS )rrU  z1dict[type, Callable[[_Serializer, object], None]]	_dispatchNr   Callable[[bytes], None] | Noner   r   c                 C  s    |d u rg | _ | j j}|| _d S r   )_streamlistr   r   )r   r   r   r   r   r   c  s   
z_Serializer.__init__FrR  r   r  r2   bytes | Nonec                 C  sN   |r|  t | | |  tj z| j}W n
 ty!   Y d S w d|S )Nr   )r   r  _saver  r  r_  r   r   )r   rR  r  
streamlistr   r   r   rV  i  s   



z_Serializer.savec                 C  sv   t |}z| j| }W n( ty3   d|j }t| j|d }|d u r*td| d | }| j|< Y nw || | d S )Nsave_zcan't serialize )rM  r]  r  r   r   rV  r  )r   rR  tpdispatch
methodnamemethr   r   r   ra  w  s   
z_Serializer._savenonc                 C  s   |  tj d S r   )r   r  r  )r   rh  r   r   r   save_NoneType  r  z_Serializer.save_NoneTypebooleanc                 C  s$   |r
|  tj d S |  tj d S r   )r   r  r  r  )r   rj  r   r   r   	save_bool  s   z_Serializer.save_boolbytes_r   c                 C     |  tj | | d S r   )r   r  r  _write_byte_sequencer   rl  r   r   r   
save_bytes     z_Serializer.save_bytesr+  r<   c                 C  rm  r   )r   r  r
  _write_unicode_stringr*  r   r   r   save_str  rq  z_Serializer.save_strc              
   C  s@   z| d}W n ty } ztd|d }~ww | | d S )Nrn   zstrings must be utf-8 encodable)encodeUnicodeEncodeErrorr  rn  )r   r+  r:  r  r   r   r   rr    s   
z!_Serializer._write_unicode_stringc                 C  s   |  t|d | | d S )Nzstring is too long)_write_int4r   r   ro  r   r   r   rn    r  z _Serializer._write_byte_sequencer  r"   short_oplong_opc                 C  sH   |t kr| | | | d S | | | t|dd d S )NLascii)FOUR_BYTE_INT_MAXr   rv  rn  r<   rstriprt  )r   r  rw  rx  r   r   r   _save_integral  s
   

z_Serializer._save_integralc                 C     |  |tjtj d S r   )r}  r  r  r  r&  r   r   r   save_int  r3  z_Serializer.save_intrP  c                 C  r~  r   )r}  r  r  r  )r   rP  r   r   r   	save_long  r3  z_Serializer.save_longfltrN   c                 C  s"   |  tj |  tt| d S r   )r   r  r   r  r
  r.  )r   r  r   r   r   
save_float  s   z_Serializer.save_floatcpxr4  c                 C  s(   |  tj |  tt|j|j d S r   )r   r  r  r  r
  r5  realimag)r   r  r   r   r   save_complex  r2  z_Serializer.save_complexzint must be less than %ir   c                 C  s&   |t krt|| td| d S )Nr7  )r{  r  r   r  r
  )r   r  r   r   r   r   rv    s   z_Serializer._write_int4ry  list[object]c                 C  s>   |  tj | t|d t|D ]
\}}| || qd S )Nzlist is too long)r   r  r  rv  r   	enumerate_write_setitem)r   ry  r  r  r   r   r   	save_list  s
   z_Serializer.save_listrB  r8  c                 C  s$   |  | |  | | tj d S r   )ra  r   r  r  )r   rB  r8  r   r   r   r    s   

z_Serializer._write_setitemr  dict[object, object]c                 C  s.   |  tj | D ]
\}}| || q
d S r   )r   r  r  rs  r  )r   r  rB  r8  r   r   r   	save_dict  s   z_Serializer.save_dicttuptuple[object, ...]c                 C  s4   |D ]}|  | q| tj | t|d d S )Nztuple is too long)ra  r   r  r  rv  r   )r   r  r  r   r   r   
save_tuple  s   z_Serializer.save_tupleset[object] | frozenset[object]opc                 C  s2   |D ]}|  | q| | | t|d d S )Nzset is too long)ra  r   rv  r   )r   r+  r  r  r   r   r   
_write_set  s   
z_Serializer._write_setset[object]c                 C     |  |tj d S r   )r  r  r  r*  r   r   r   save_set  r8  z_Serializer.save_setfrozenset[object]c                 C  r  r   )r  r  r  r*  r   r   r   save_frozenset  r8  z_Serializer.save_frozensetr  r^  c                 C  s   |  tj | |j d S r   )r   r  r  rv  r_  )r   r  r   r   r   save_Channel  s   z_Serializer.save_Channelr   )r   r^  r   r   r   )rR  r   r  r2   r   r`  rR  r   r   r   )rh  r   r   r   )rj  r2   r   r   )rl  r   r   r   )r+  r<   r   r   )r  r"   rw  r   rx  r   r   r   )r  r"   r   r   )rP  r"   r   r   )r  rN   r   r   )r  r4  r   r   )r  r"   r   r<   r   r   )ry  r  r   r   )rB  r   r8  r   r   r   )r  r  r   r   )r  r  r   r   )r+  r  r  r   r   r   )r+  r  r   r   )r+  r  r   r   )r  r^  r   r   )r   r   r   r]  r0   r   rV  ra  ri  rk  rp  rs  rr  rn  r}  r  r  r  r  r{  rv  r  r  r  r  r  r  r  r  r   r   r   r   rU  `  s4   
 


















rU  r(   c                 C  sD  t tdsttjtj| }dd l}|dt_|dt_|S ztj}W n t	y7   tj
dkr3d}nd}Y nw | tddd}t|tj}t|d t| | tddd}t|tj}t|d tj
dkr| td	ddt_t|d	 t| t||| }| jdddd
dt_| jdddd
dt_|S )Ndupr   r  r   ntNULz	/dev/nullrP   r*  Fr   )hasattrrp   r   r   stdoutstdintempfileTemporaryFiledevnullr   r  rU   r  rw  O_RDONLYdup2r   O_WRONLYr   )r(   r   r  r  r  rQ   r  r   r   r   init_popen_io  s:   





r  c                 C  s$   t d|  t| |dd  d S )Nzcreating workergateway on r*  )r   r_  r  )r   r  r  )r   r_  r   r   r   r    s   r  )r@   r   r   r'   r  )r   r   rI  rJ  r   r<   )r  r"   r   r   )rR  r   r   r   r  )FF)r[  r   r  r2   r  r2   r   r   )r   r    r  r2   r  r2   r   r   rO  )r[  r   r$  r  r   r   )r(   r'   r   r   )r   r&   r   r   )`r;   
__future__r   r^   rp   r  r   	tracebackr  rh   r   r   r   typingr   r   r   r   r	   r
   r   r   r   r    r&   r1   ABCMetar'   rb   rw   rz   r   r   r   r   r  
SystemExitrI  environr   DEBUGrZ  r   r   r  pathr   
gettempdirfnrw  r   notracer   r   r   r'  rO  rR  r:  r   r]  r   rr  r^  rp  rY  r  r  r  r  r  r  r  r  r  r  r  r  r{  r.  calcsizer-  r5  r3  r  r  r  rX  rZ  r\  r  r   r  rU  r  r  r   r   r   r   <module>   s    599
:%|
*f  d$Ul


 
A


	 
'