
    i                    
   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e          Z G d de          Z G d de          Z G d de          Z G d dej                  Z G d de          Z G d de          Z G d de          Z G d d e          Zd|d$Z  G d% d&          Z! G d' d(          Z"e#e$fZ%ej&        '                    d)          Z( ej)                    Z*e(d*k    rd}d.Z+nKe(rDddlZddl,Z,ej-        .                     e,j/                    d/e*z            Z0 e1e0d0          Z2d}d1Z+nd2 xZ3Z+ G d3 d4          Z4 G d5 d6          Z5 G d7 d8e6          Z7ej8        e%fd~d>Z9 G d? d@e6          Z: G dA dBe;          Z< e=            Z> G dC dD          Z? e=            Z@dEZAdFZB G dG dH          ZC G dI dJ          ZD G dK dLeD          ZE G dM dNeD          ZF G dO dP          ZG G dQ dReG          ZH G dS dTe6          ZI G dU dVeI          ZJ G dW dXeI          ZKdd\ZL eLd]          ZMd^ZNd_ZO ejP        eO          ZQd`ZR ejP        eR          ZS G da dbe6          ZT G dc dd          ZU G de df          ZVddhZWddiZX	 dddpZY	 dddrZZ	 	 ddduZ[ddvZ\ G dw dx          Z]ddzZ^dd{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ZdS )WriteIOdatabytesreturnNonec                   d S N selfr   s     [/home/ubuntu/.hermes/hermes-agent/venv/lib/python3.11/site-packages/execnet/gateway_base.pywritezWriteIO.write!             Nr   r   r   r   )__name__
__module____qualname__r   r   r   r   r   r       s        000000r   r   c                      e Zd ZddZdS )ReadIOnumbytesintr   r   c                   d S r   r   r   r#   s     r   readzReadIO.read%   r   r   Nr#   r$   r   r   )r   r   r    r'   r   r   r   r"   r"   $   s        222222r   r"   c                  J    e Zd ZU ded<   ddZdd
ZddZddZddZddZ	dS )IO	ExecModel	execmodelr#   r$   r   r   c                   d S r   r   r&   s     r   r'   zIO.read+   r   r   r   r   c                   d S r   r   r   s     r   r   zIO.write-   r   r   c                    d S r   r   r   s    r   
close_readzIO.close_read/   r   r   c                    d S r   r   r0   s    r   close_writezIO.close_write1   r   r   
int | Nonec                    d S r   r   r0   s    r   waitzIO.wait3   r   r   c                    d S r   r   r0   s    r   killzIO.kill5   r   r   Nr(   r   r   r   )r   r4   )
r   r   r    __annotations__r'   r   r1   r3   r6   r8   r   r   r   r*   r*   (   sf         22220000%%%%&&&&%%%%r   r*   c                  4    e Zd ZdZddZddZddZdddZdS )Eventz3Protocol for types which look like threading.Event.r   boolc                    d S r   r   r0   s    r   is_setzEvent.is_set;   r   r   r   c                    d S r   r   r0   s    r   setz	Event.set=   r   r   c                    d S r   r   r0   s    r   clearzEvent.clear?   r   r   Ntimeoutfloat | Nonec                    d S r   r   r   rD   s     r   r6   z
Event.waitA   r   r   r   r=   r9   r   rD   rE   r   r=   )r   r   r    __doc__r?   rA   rC   r6   r   r   r   r<   r<   8   sI        ==!!!!    =======r   r<   c                     e Zd Zeej        dd                        ZddZeej        d                         Zeej        d                         Z	eej        d                         Z
ej        ddd
            Zej        dd            Zej        dd            Zej        dd            Zej        d             Zej        d             Zej        dd            ZdS )r+   r   strc                    t                      r   NotImplementedErrorr0   s    r   backendzExecModel.backendE        "###r   c                    d| j         z  S )Nz<ExecModel %r>rP   r0   s    r   __repr__zExecModel.__repr__J   s    $,..r   c                    t                      r   rN   r0   s    r   queuezExecModel.queueM   rQ   r   c                    t                      r   rN   r0   s    r   
subprocesszExecModel.subprocessR   rQ   r   c                    t                      r   rN   r0   s    r   socketzExecModel.socketW   rQ   r   r   r   c                    t                      r   rN   )r   funcargss      r   startzExecModel.start\       !###r   r$   c                    t                      r   rN   r0   s    r   	get_identzExecModel.get_ident`   r_   r   delayfloatc                    t                      r   rN   )r   rb   s     r   sleepzExecModel.sleepd   r_   r      Tc                    t                      r   rN   )r   fdmodebufsizeclosefds        r   fdopenzExecModel.fdopenh   r_   r   c                    t                      r   rN   r0   s    r   LockzExecModel.Lockl   r_   r   c                    t                      r   rN   r0   s    r   RLockzExecModel.RLockp   r_   r   r<   c                    t                      r   rN   r0   s    r   r<   zExecModel.Eventt   r_   r   Nr   rL   r   r9   r   r$   rb   rc   r   r   rf   T)r   r<   )r   r   r    propertyabcabstractmethodrP   rT   rV   rX   rZ   r^   ra   re   rl   rn   rp   r<   r   r   r   r+   r+   D   s       $ $ $  X$/ / / / $ $  X$ $ $  X$ $ $  X$ 	$ $ $ $ $ 	$ $ $ $ 	$ $ $ $ 	$ $ $ $ 	$ $ $ 	$ $ $ 	$ $ $ $ $ $r   r+   )	metaclassc                      e Zd ZdZed             Zed             Zed             ZddZddZ	dddZ
ddZd Zd Zd ZdS )ThreadExecModelthreadc                    dd l }|S Nr   )rV   )r   rV   s     r   rV   zThreadExecModel.queue|   s    r   c                    dd l }|S r   )rX   )r   rX   s     r   rX   zThreadExecModel.subprocess   s    r   c                    dd l }|S r   )rZ   )r   rZ   s     r   rZ   zThreadExecModel.socket   s    r   r   r$   c                2    dd l }|                                S r   )_threadra   )r   r   s     r   ra   zThreadExecModel.get_ident   s      """r   rb   rc   r   c                8    dd l }|                    |           d S r   )timere   )r   rb   r   s      r   re   zThreadExecModel.sleep   s#    

5r   r   c                :    dd l }|                    ||           d S r   )r   start_new_thread)r   r\   r]   r   s       r   r^   zThreadExecModel.start   s'      t,,,,,r   rf   Tc                4    dd l } |j        |||d|          S )Nr   utf-8)encodingrk   )osrl   )r   rh   ri   rj   rk   r   s         r   rl   zThreadExecModel.fdopen   s(    			ryT7WgNNNNr   c                2    dd l }|                                S r   	threadingrp   r   r   s     r   rn   zThreadExecModel.Lock          r   c                2    dd l }|                                S r   r   r   s     r   rp   zThreadExecModel.RLock   r   r   c                2    dd l }|                                S r   )r   r<   r   s     r   r<   zThreadExecModel.Event   r   r   Nrt   ru   rs   r9   rv   r   r   r    rP   rw   rV   rX   rZ   ra   re   r^   rl   rn   rp   r<   r   r   r   r|   r|   y   s        G  X
   X
   X
# # # #
   
- - - - -
O O O O
! ! !
! ! !
! ! ! ! !r   r|   c                      e Zd ZdZdS )MainThreadOnlyExecModelmain_thread_onlyN)r   r   r    rP   r   r   r   r   r      s         GGGr   r   c                      e Zd ZdZed             Zed             Zed             ZddZddZ	dddZ
ddZd Zd Zd ZdS )EventletExecModeleventletc                    dd l }|j        S r   )r   rV   r   r   s     r   rV   zEventletExecModel.queue   s    ~r   c                "    dd l }|j        j        S r   )eventlet.green.subprocessgreenrX   r   s     r   rX   zEventletExecModel.subprocess   s    ((((~((r   c                "    dd l }|j        j        S r   )eventlet.green.socketr   rZ   r   s     r   rZ   zEventletExecModel.socket   s    $$$$~$$r   r   r$   c                F    dd l }|j        j                                        S r   )eventlet.green.threadr   r}   ra   r   s     r   ra   zEventletExecModel.get_ident   s%    $$$$~$..000r   rb   rc   r   c                8    dd l }|                    |           d S r   )r   re   )r   rb   r   s      r   re   zEventletExecModel.sleep   s#    ur   r   c                *    dd l } |j        |g|R   d S r   )r   spawn_n)r   r\   r]   r   s       r   r^   zEventletExecModel.start   s,    %%%%%%%r   rf   Tc                P    dd l }|j        j                            ||||          S Nr   rk   )eventlet.green.osr   r   rl   )r   rh   ri   rj   rk   r   s         r   rl   zEventletExecModel.fdopen   s0        ~ ''D'7'KKKr   c                F    dd l }|j        j                                        S r   eventlet.green.threadingr   r   rp   r   s     r   rn   zEventletExecModel.Lock   %    ''''~'--///r   c                F    dd l }|j        j                                        S r   r   r   s     r   rp   zEventletExecModel.RLock   r   r   c                F    dd l }|j        j                                        S r   )r   r   r   r<   r   s     r   r<   zEventletExecModel.Event   r   r   Nrt   ru   rs   r9   rv   r   r   r   r   r   r      s        G  X
 ) ) X)
 % % X%
1 1 1 1
   
& & & & &
L L L L
0 0 0
0 0 0
0 0 0 0 0r   r   c                      e Zd ZdZed             Zed             Zed             ZddZddZ	dddZ
ddZd Zd Zd ZdS )GeventExecModelgeventc                    dd l }|j        S r   )gevent.queuerV   r   r   s     r   rV   zGeventExecModel.queue   s    |r   c                    dd l }|j        S r   )gevent.subprocessrX   r   s     r   rX   zGeventExecModel.subprocess   s          r   c                    dd l }|j        S r   )r   rZ   r   s     r   rZ   zGeventExecModel.socket   s    }r   r   r$   c                <    dd l }|j                                        S r   )gevent.threadr}   ra   r   s     r   ra   zGeventExecModel.get_ident  s"    }&&(((r   rb   rc   r   c                8    dd l }|                    |           d S r   )r   re   )r   rb   r   s      r   re   zGeventExecModel.sleep	  s#    Ur   r   c                *    dd l } |j        |g|R   d S r   )r   spawn)r   r\   r]   r   s       r   r^   zGeventExecModel.start  s+    T!D!!!!!!r   rf   Tc                F    dd l }|j                            ||||          S r   )gevent.fileobject
fileobjectFileObjectThread)r   rh   ri   rj   rk   r   s         r   rl   zGeventExecModel.fdopen  s.         11"dGW1UUUr   c                <    dd l }|j                                        S r   gevent.locklockrp   r   s     r   rn   zGeventExecModel.Lock  "    {  """r   c                <    dd l }|j                                        S r   r   r   s     r   rp   zGeventExecModel.RLock  r   r   c                <    dd l }|j                                        S r   )gevent.eventeventr<   r   s     r   r<   zGeventExecModel.Event#  s"    |!!###r   Nrt   ru   rs   r9   rv   r   r   r   r   r   r      s        G  X
 ! ! X!
   X
) ) ) )
   
" " " " "
V V V V# # #
# # #
$ $ $ $ $r   r   rP   str | ExecModelr   c                    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|           )Nr}   r   r   r   zunknown execmodel )
isinstancer+   r|   r   r   r   
ValueErrorrS   s    r   get_execmodelr   )  s    '9%% (   	&	&	&&(((	J		 """	H		   9g99:::r   c                  6    e Zd ZdZddZddd
ZdddZddZdS )ReplyzhProvide access to the result of a function execution that got dispatched
    through WorkerPool.spawn().threadmodelr+   r   r   c                T    || _         |                                | _        d| _        d S NT)taskr<   _result_readyrunning)r   r   r   s      r   __init__zReply.__init__<  s(    	(..00r   NrD   rE   c                h    |                      |           	 | j        S # t          $ r	 | j        dw xY 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_excrG   s     r   getz	Reply.getA  sH     	   	&< 	& 	& 	&)%	&s    1c                h    | j                             |          st          d| j                  d S )Nztimeout waiting for )r   r6   OSErrorr   rG   s     r   r   zReply.waitfinishM  sA    !&&w// 	@>>>???	@ 	@r   c                   | j         \  }}}	 	  ||i || _        n# t          $ r}|| _        Y d }~nd }~ww xY w| j                                         d| _        d S # | j                                         d| _        w xY wNF)r   r   BaseExceptionr   r   rA   r   )r   r\   r]   kwargsexcs        r   runz	Reply.runQ  s    !YdF	! #tT4V44       						  ""$$$ DLLL ""$$$ DL    s%    A 
72A 7A "A>)r   r+   r   r   r   )rD   rE   rD   rE   r   r   r9   )r   r   r    rJ   r   r   r   r   r   r   r   r   r   8  s}        # #   

& 
& 
& 
& 
&@ @ @ @ @	! 	! 	! 	! 	! 	!r   r   c                  l    e Zd ZU dZded<   dddZddZddZddZddZ	ddZ
d dZd!d"dZ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+   
hasprimaryr=   r   r   c                   || _         | j                                         | _        t                      | _        d| _        g | _        |r=| j         j        dvrt          d          | j         	                                | _
        d S d | _
        d S )NFr}   r   z%hasprimary=True requires thread model)r,   rn   _running_lockrA   _running_shuttingdown_waitall_eventsrP   r   r<   _primary_thread_task_ready)r   r,   r   s      r   r   zWorkerPool.__init__l  s    "!^0022+.55",. 	3~%-KKK !HIII<@N<P<P<R<RD+++.2D+++r   c                `   | j         j        dv sJ | j                     | j        }|J 	 |                                 | j        }|dS |                     |           | j        5  | j        r	 ddd           dS || j        u r|                                 ddd           n# 1 swxY w Y   )zyIntegrate the thread with which we are called as a primary
        thread for executing functions triggered with spawn().r   N)	r,   rP   r   r6   r   _perform_spawnr   r   rC   )r   primary_thread_task_readyreplys      r   integrate_as_primary_threadz&WorkerPool.integrate_as_primary_thready  s2    ~%)GGGGGGG$($C!(444	6%**,,,-E}&&&# 6 6% 6 6 6 6 6 6 6 6 D555-335556 6 6 6 6 6 6 6 6 6 6 6 6 6 6	6s   %	B$;B$$B(+B(c                    | j         5  d| _        | j         d | _        | j                                         d d d            d S # 1 swxY w Y   d S r   )r   r   r   r   rA   r0   s    r   trigger_shutdownzWorkerPool.trigger_shutdown  s     	6 	6!%D.:,0)/33555		6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6s   /AAAr$   c                *    t          | j                  S r   )lenr   r0   s    r   active_countzWorkerPool.active_count  s    4=!!!r   r   r   c                &   |                                  | j        5  | j                            |           | j        s;| j        r4| j                                        }|                                 | j        4d d d            d S # 1 swxY w Y   d S r   )r   r   r   remover   poprA   )r   r   waitall_events      r   r   zWorkerPool._perform_spawn  s    		 	( 	(M  '''= (* ($($8$<$<$>$>M!%%''' * (	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(s   ABB
B
c                   | j         }|~|                                s|| _        |                                 dS | j        j        dk    r=| j        6| j                                         || _        |                                 dS dS )NTr   F)r   r?   r   rA   r,   rP   r   )r   r   r   s      r   _try_send_to_primary_threadz&WorkerPool._try_send_to_primary_thread  s     %)$C!$0,3355 ,1))--///t&*<<<-9)44666,1) *--///tur   c                @   t          |||f| j                  }| j        5  | j        rt	          d          | j                            |           |                     |          s!| j                            | j	        |f           ddd           n# 1 swxY w Y   |S )zAAsynchronously dispatch func(*args, **kwargs) and return a Reply.zpool is shutting downN)
r   r,   r   r   r   r   addr  r^   r   )r   r\   r]   r   r   s        r   r   zWorkerPool.spawn  s    tT6*DN;; 	D 	D! : !8999Me$$$33E:: D$$T%85(CCC	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D s   A'BBBNrD   rE   c                V    |                                   |                     |          S )z;Trigger shutdown and wait for completion of all executions.rD   )r   waitallrG   s     r   	terminatezWorkerPool.terminate  s(    ||G|,,,r   c                    | j         5  | j        s	 ddd           dS | j                                        }| j                            |           ddd           n# 1 swxY w Y   |                    |          S )z5Wait until all active spawns have finished executing.NTr  )r   r   r,   r<   r   appendr6   )r   rD   my_waitall_events      r   r  zWorkerPool.waitall  s     	: 	:= 	: 	: 	: 	: 	: 	: 	: 	:  $~3355 ''(8999	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	:  $$W$555s   	A3AA!$A!F)r,   r+   r   r=   r   r   r9   rt   )r   r   r   r   )r   r   r   r=   )r   r   r   rI   )r   r   r    rJ   r:   r   r   r   r   r   r  r   r  r  r   r   r   r   r   ]  s         
 
 '&&&3 3 3 3 36 6 6 6.6 6 6 6" " " "( ( ( (   2	 	 	 	- - - - -

6 
6 
6 
6 
6 
6 
6r   r   EXECNET_DEBUG2msgobjectr   c                    	 d                     t          t          |                     }t          j                            dt           d| d           t          j                                         d S # t          $ r Y d S w xY w)N [z] 
)	joinmaprL   sysstderrr   pidflush	Exception)r  lines     r   tracer    s    	88CSMM**DJ000000111J 	 	 	DD	s   A1A5 5
BBzexecnet-debug-%dwc                 z   	 d                     t          t          |                     }t                              |dz              t                                           d S # t          $ rN}	 t          j                            dt           d|d           n# t          $ r Y n
w xY wY d }~d S Y d }~d S d }~ww xY w)Nr  r  r  z] exception during tracing: )
r  r  rL   	debugfiler   r  r  r  r  r  )r  r  r   s      r   r  r    s    	88CSMM**DOOD4K(((OO 	 	 	
  !OS!O!Oc!O!O!OPPPP    QPPPPP		s6   AA" "
B:-+BB5
B&#B5%B&&B55B:c                     d S r   r   )r  s    r   <lambda>r"    s    4 r   c                  @    e Zd ZeeefZddZdd	ZddZ	ddZ
ddZdS )Popen2IOr,   r+   r   r   c                   ||c| _         | _        t          j        dk    rdd l}	 |                    |                                t          j                   |                    |                                t          j                   n# t          t          f$ r Y nw xY wt          |d|          j        | _        t          |d|          j        | _        || _        d S )Nwin32r   buffer)outfileinfiler  platformmsvcrtsetmodefilenor   O_BINARYr   r   getattrr'   _readr   _writer,   )r   r(  r)  r,   r+  s        r   r   zPopen2IO.__init__  s    $+V!dk<7""MMMv}}<<<w~~//===="G,   VXv66;
gx99?"s   A$B
 
BBr#   r$   r   c                    d}|t          |          k    r`|                     |t          |          z
            }|s!t          d|t          |          fz            ||z  }|t          |          k    `|S )z,Read exactly 'numbytes' bytes from the pipe.r   zexpected %d bytes, got %d)r   r0  EOFError)r   r#   bufr   s       r   r'   zPopen2IO.read  s     S!!::hS122D S:hC=QQRRR4KC	 S!!
 
r   r   c                    t          |t                    sJ |                     |           | j                                         dS )zWrite out all data bytes.N)r   r   r1  r(  r  r   s     r   r   zPopen2IO.write  sD    $&&&&&Dr   c                8    | j                                          d S r   )r)  closer0   s    r   r1   zPopen2IO.close_read"  s    r   c                8    | j                                          d S r   )r(  r7  r0   s    r   r3   zPopen2IO.close_write%  s    r   N)r,   r+   r   r   r(   r   r9   )r   r   r    IOErrorr   r3  errorr   r'   r   r1   r3   r   r   r   r$  r$    s        gx(E# # # #	 	 	 	           r   r$  c                  ,   e Zd ZU dZi Zded<   d1d2dZed3d            Zd4dZ	d5dZ
d6dZd7dZdZdefee<   d7dZdZdefee<   d7dZdZd efee<   d7d!Zd"Zd#efee<   d7d$Zd%Zd&efee<   d7d'Zd(Zd)efee<   d7d*Zd+Zd,efee<   d7d-Zd.Zd/efee<   d0S )8Messagez.Encapsulates Messages and their wire protocol.z=dict[int, tuple[str, Callable[[Message, BaseGateway], None]]]_typesr   r   msgcoder$   	channelidr   r   r   r   c                0    || _         || _        || _        d S r   )r>  r?  r   )r   r>  r?  r   s       r   r   zMessage.__init__/  s    "			r   ior"   c                ,   	 |                      d          }|st          d          n0# t          $ r#}t          d|j        d         z             d d }~ww xY wt          j        d|          \  }}}t          |||                      |                    S )N	   z
empty readzcouldn't load message header, r   !bii)r'   r3  r]   structunpackr<  )rA  headeremsgtypechannelpayloads         r   from_iozMessage.from_io4  s    	SWWQZZF -|,,,- 	S 	S 	S;afQiGHHdR	S$*M&&$A$A!'w)9)9:::s   &) 
AAAr   c                    t          j        d| j        | j        t	          | j                            }|                    || j        z              d S )NrD  )rE  packr>  r?  r   r   r   )r   rA  rG  s      r   to_iozMessage.to_io?  sB    VT\4>3ty>>RR
$)#$$$$$r   gatewayBaseGatewayc                N    | j         | j                 d         } || |           d S )Nrf   )r=  r>  )r   rP  handlers      r   receivedzMessage.receivedC  s-    +dl+A.gr   rL   c                x    | j         | j                 d         }d| d| j         dt          | j                   dS )Nr   z	<Message z	 channel=z	 lendata=>)r=  r>  r?  r   r   )r   names     r   rT   zMessage.__repr__G  s@    {4<(+T4TT$.TT3ty>>TTTTr   messagec                2   t          |j        j                  |j                                        |j        j        d}|                    t          j	        | j
        t          |                     |                    t          j        | j
                   d S )N)numchannelsnumexecutingr,   )r   _channelfactory	_channels	_execpoolr   r,   rP   _sendr<  CHANNEL_DATAr?  dumps_internalCHANNEL_CLOSE)rX  rP  ds      r   _statuszMessage._statusK  s     w6@AA#-::<< *2	
 
 	g*G,=~a?P?PQQQg+W->?????r   STATUSc                    t          | j        |          }t          |t                    sJ |}| j        dk    r	||_        d S ||j                            | j                  _        d S r   )loads_internalr   r   tupler?  
_strconfigr\  new)rX  rP  r   	strconfigs       r   _reconfigurezMessage._reconfigureZ  sl    glG44$&&&&&'+	!!!*GHQG#''(9::EEEr   rf   RECONFIGUREc                     t          |          r   )GatewayReceivedTerminaterX  rP  s     r   _gateway_terminatezMessage._gateway_terminatef  s    &w///r      GATEWAY_TERMINATEc                |    |j                             | j                  }|                    || j                   d S )N)rJ  
sourcetask)r\  rj  r?  _local_schedulexecr   )rX  rP  rJ  s      r   _channel_execzMessage._channel_execl  s<    )--g.?@@""7w|"LLLLLr      CHANNEL_EXECc                P    |j                             | j        | j                   d S r   )r\  _local_receiver?  r   rp  s     r   _channel_datazMessage._channel_datas  s&    ..w/@',OOOOOr      r`  c                D    |j                             | j                   d S r   r\  _local_closer?  rp  s     r   _channel_closezMessage._channel_closey  s"    ,,W->?????r      rb  c                    t          | j                  }t          |t                    sJ t	          |          }|j                            | j        |           d S r   )rg  r   r   rL   RemoteErrorr\  r  r?  )rX  rP  error_messageremote_errors       r   _channel_close_errorzMessage._channel_close_error  sV    &w|44------"=11,,W->MMMMMr      CHANNEL_CLOSE_ERRORc                H    |j                             | j        d           d S NT)sendonlyr  rp  s     r   _channel_last_messagezMessage._channel_last_message  s'    ,,W->,NNNNNr      CHANNEL_LAST_MESSAGENr   r   r>  r$   r?  r$   r   r   r   r   )rA  r"   r   r<  )rA  r   r   r   )rP  rQ  r   r   rr   )rX  r<  rP  rQ  r   r   )r   r   r    rJ   r=  r:   r   staticmethodrL  rO  rT  rT   rd  re  rl  rm  rq  rs  rw  ry  r|  r`  r  rb  r  r  r  r  r   r   r   r<  r<  )  s        88 MOFNNNN    
 ; ; ; \;% % % %   U U U U
@ 
@ 
@ 
@ F(F6NR R R R K(,7F;0 0 0 0 !46H IFM M M M L*M:F<P P P P L*M:F<@ @ @ @ M,n=F=N N N N #8:N"OFO O O O $:<Q#RF   r   r<  c                      e Zd ZdZdS )ro  z'Receiverthread got termination message.Nr   r   r    rJ   r   r   r   ro  ro    s        1111r   ro  r   r   sysextuple[type[BaseException], ...]rL   c                    	  |t          |           | | j                  }d                    |          }n.# |$ r  t          $ r t          |           j         d|  }Y nw xY w|S )N : )type__traceback__r  r   r   )r   format_exceptionr  l	errortexts        r   geterrortextr    s    
3 T#YYS->??GGAJJ		    3 3 3Cyy)22S22			3s   47 (A"!A"c                  <     e Zd ZdZd
 fdZddZddZdd	Z xZS )r  z=Exception containing a stringified error from the other side.	formattedrL   r   r   c                V    t                                                       || _        d S r   )superr   r  )r   r  	__class__s     r   r   zRemoteError.__init__  s$    "r   c                    | j         S r   )r  r0   s    r   __str__zRemoteError.__str__  s
    ~r   c                .    | j         j         d| j         S )Nr  )r  r   r  r0   s    r   rT   zRemoteError.__repr__  s    .)==T^===r   c                    | j         t          k    r9t          j                            dt          j                     d| d           d S d S )Nr  z] Warning: unhandled r  )r  INTERRUPT_TEXTr  r  r   r   getpidr0   s    r   warnzRemoteError.warn  sM    >^++JMMM4MMMNNNNN ,+r   )r  rL   r   r   rr   r9   )	r   r   r    rJ   r   r  rT   r  __classcell__r  s   @r   r  r    s        GG# # # # # #   > > > >O O O O O O O Or   r  c                      e Zd ZdZdS )TimeoutErrorz0Exception indicating that a timeout was reached.Nr  r   r   r   r  r    s        ::::r   r  c                      e Zd ZdZeZeZdZdZd5d
Zd6dZ	e
fd7dZd8dZd9dZd Zd:dZed;d<d            Ze	 	 d=d>d             Z	 	 d?d@d$ZdAd9d&ZdAdBd)ZdCd+ZdAdDd-ZdEd/ZdFd0ZeZ	 dGdHd4Zd%S )IChannelzFCommunication channel between two Python Interpreter execution points.i  FrP  rQ  idr$   r   r   c                \   t          |t                    sJ t          |t                    rJ || _        t	          |dd          | _        || _        | j        j        j        	                                | _
        d| _        | j        j                                        | _        g | _        dS )z	:private:ri  TFFN)r   r$   r  rP  r/  ri  r  r,   rV   Queue_items_closedr<   _receiveclosed_remoteerrors)r   rP  r  s      r   r   zChannel.__init__  s    "c"""""gt,,,,,!'<GGl,288::"l4::<<02r   r  r  c                6     | j         j        | j        g|R   d S r   )rP  _tracer  r   r  s     r   r  zChannel._trace  s'    DG*c******r   callbackCallable[[Any], Any]	endmarkerc                   | j         j        j        }| j         j        5  | j        t          | d          | j        }d| _        	 	 |                    d          }|t          u r*|                    |           |t          ur ||           n^ ||           nQ# | j         j
        j        j        $ r5 | j        s+| j                                        s||| j        f|| j        <   Y nw xY wddd           dS # 1 swxY w 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 registeredrf   F)block)rP  r\  
_callbacks_receivelockr  r   r   	ENDMARKERputNO_ENDMARKER_WANTEDr,   rV   Emptyr  r  r?   ri  r  )r   r  r  r  itemsolditems         r   setcallbackzChannel.setcallback  s    \1<
\& 	* 	*{"IIIJJJKEDK**#iiei44G )++		'***$,???$HY/// )))) |-39    L UD,?,F,F,H,H U/7DO.T
47+E*	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*s6   )C<B?C<AC+(C<*C++C<<D D rL   c                J    |                                  rdpd}d| j        |fz  S )Nclosedopenz<Channel id=%d %s>)isclosedr  )r   flags     r   rT   zChannel.__repr__  s*    ,H7#two55r   c                   | j         d S |                     d           | j        r | j        D ]}|                                 d S | j                                        rd S t          [| j        t          j	        }nt          j
        }	 | j                             || j                   d S # t          t          f$ r Y d S w xY wd S )Nzchannel.__del__)rP  r  r  r  r  r  r?   r<  r  r  rb  r_  r  r   r   )r   r:  r>  s      r   __del__zChannel.__del__  s    <F%&&&< 	+  

  '')) 	 D ";&%:GG%3GL&&w88888,   DD #"s   	 B+ +C ?C c                    	 | j                             d          S # t          $ r# 	 | j        j        cY S # t
          $ r Y nw xY wY d S w xY wr   )r  r   
IndexErrorrP  _errorr   r0   s    r   _getremoteerrorzChannel._getremoteerror  sv    	%))!,,, 	 	 	|****!   44	s.    
A	5A	
AA	AA	A	r=   c                    | j         S )z^Return True if the channel is closed.

        A closed channel may still hold items.
        )r  r0   s    r   r  zChannel.isclosed)  s    
 |r   .ri   Literal['r']
proxycloseChannelFileReadc                    d S r   r   r   ri   r  s      r   makefilezChannel.makefile0  s    r   Literal['w']ChannelFileWritec                    d S r   r   r  s      r   r  zChannel.makefile4  s	     	r   r  Literal['r', 'w']"ChannelFileWrite | ChannelFileReadc                    |dk    rt          | |          S |dk    rt          | |          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  )rJ  r  rzmode z not available)r  r  r   r  s      r   r  zChannel.makefile<  sV     3;;#DZHHHHS[["4JGGGG7777888r   Nc                   | j         rt          d          | j        r| j                            | d           | j        s| j                                        sh| j        j        }|* |t          j	        | j
        t          |                     n |t          j        | j
                   |                     d           t          |t                    r| j                            |           d| _        | j                                         | j        }||                    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   r  rP  r  r  r?   r_  r<  r  r  ra  rb  r   r  r  r
  rA   r  r  r  r\  _no_longer_opened)r   r:  r  rV   s       r   r7  zChannel.closeL  sU    ? 	PNOOO< 	LL&JKKK| 	D &--// :l($C3TWnU>S>STTTTC-tw7778999%-- 1"))%000DL##%%%KE 		)$$$L(::47CCCCC)	D 	Dr   rD   rE   c                    | j                             |           | j                                         s|                     d|z            |                                 }|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)r  r6   r?   r  r  )r   rD   r:  s      r   	waitclosezChannel.waitclosem  sx    " 	   111"))++ 	J##$>$HIII$$&& 	K	 	r   itemc                    |                                  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)r  r   rP  r_  r<  r`  r  ra  )r   r  s     r   sendzChannel.send  sX     ==?? 	64D445557/.:N:NOOOOOr   r   c                R   | j         }|t          d          	 |                    |          }n6# | j        j        j        j        $ r |                     d|z            dw xY w|t          u r7|	                    |           | 
                                pt                      |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)r  r   r   rP  r,   rV   r  r  r  r  r  r3  )r   rD   	itemqueuexs       r   receivezChannel.receive  s     K	KLLL	Tg..AA|%+1 	T 	T 	T##$>$HIItS	T	>>MM!&&((6HJJ6Hs	   1 3A$Iterator[Any]c                    | S r   r   r0   s    r   __iter__zChannel.__iter__  s    r   c                X    	 |                                  S # t          $ r	 t          d w xY wr   )r  r3  StopIterationr0   s    r   nextzChannel.next  s8    	*<<>>! 	* 	* 	*T)	*s    )Tpy2str_as_py3strpy3str_as_py2strc                    ||f| _         t          | j                   }| j                            t          j        | j        |           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)ri  ra  rP  r_  r<  rm  r  )r   r  r  r   s       r   reconfigurezChannel.reconfigure  sH     ,-=>do..7.dCCCCCr   )rP  rQ  r  r$   r   r   r  r  r   r   )r  r  r  r  r   r   rr   r9   rH   ).)ri   r  r  r=   r   r  )..)ri   r  r  r=   r   r  )r  F)ri   r  r  r=   r   r  r   r   )r  r  r   r   )rD   rE   r   r   )r   r  )r   r   r  )r  r=   r  r=   r   r   )r   r   r    rJ   r  r  _INTERNALWAKEUPr  r   r  r  r  rT   r  r  r  r   r  r7  r  r  r  r  r  __next__r  r   r   r   r  r    s       PPKLOJ3 3 3 3+ + + + 0"* "* "* "* "*H6 6 6 6   <          X  !    X #& 9 9 9 9 9 D D D D DB    0P P P P    0   * * * * H GL
D 
D 
D 
D 
D 
D 
Dr   r  zkeyboard-interruptedzJconcurrent remote_exec would cause deadlock for main_thread_only execmodelc                  L    e Zd ZdddZdddZddZddZdddZddZddZ	d	S ) ChannelFactoryrf   rP  rQ  
startcountr$   r   r   c                    t          j                    | _        i | _        |j                                        | _        || _        || _        d| _	        t          | _        d S r   )weakrefWeakValueDictionaryr]  r  r,   rn   
_writelockrP  countfinishedlist_list)r   rP  r  s      r   r   zChannelFactory.__init__  sY    ')) 	  	 "+0022



r   Nr  r4   r  c                2   | j         5  | j        rt          d| j                   || j        }| xj        dz  c_        	 | j        |         }n/# t          $ r" t          | j        |          x}| j        |<   Y nw xY w|cddd           S # 1 swxY w Y   dS )z:Create a new Channel with 'id' (or create new id if None).zconnection already closed: Nrr  )r  r  r   rP  r  r]  KeyErrorr  )r   r  rJ  s      r   rj  zChannelFactory.new  s   _ 
	 
	} LJDLJJKKKzZ

a

I., I I I/6t|R/H/HH$.,,,I
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	s5   8BAB)A;8B:A;;BBBlist[Channel]c                Z    |                      | j                                                  S r   )r  r]  valuesr0   s    r   channelszChannelFactory.channels  s"    zz$.//11222r   c                    	 | j         |= n# t          $ r Y nw xY w	 | j                            |          \  }}}|t          ur ||           d S d S # t          $ r Y d S w xY wr   )r]  r	  r  r   r  )r   r  r  r  ri  s        r   r  z ChannelFactory._no_longer_opened  s    	r"" 	 	 	D		$.2o.A.A".E.E+Hi  333##### 43  	 	 	DD	s    
A 
A A Fr  r=   c                   | j                             |          }|-|r|                                 |                     |           d S |r|j                            |           |j        }||                    t                     |                     |           |sd|_	        |j
                                         d S r   )r]  r   r  r  r  r
  r  r  r  r  r  rA   )r   r  remoteerrorr  rJ  rV   s         r   r  zChannelFactory._local_close  s    .$$R((? #  """""2&&&&&  :%,,[999NE 		)$$$""2&&& '"&"&&(((((r   c                T   | j                             |          }	 | j        |         \  }}}	 t          |||          } ||           d S # t          $ r}| j                            d|z             | j                            |          }| j                            t          j
        |t          |                     |                     ||           Y d }~d S d }~ww xY w# t          $ r9 ||j        nd }	|	Y d S t          ||          }
|	                    |
           Y d S w xY w)Nzexception during callback: %s)r]  r   r  rg  r  rP  r  _geterrortextr_  r<  r  ra  r  r	  r  r  )r   r  r   rJ  r  
_endmarkerrk  r   r  rV   r  s              r   r{  zChannelFactory._local_receive  sY   .$$R((	1.2ob.A+Hj)	1%dGY?? 1 1 1##$Cc$IJJJ L66s;;	""/^I5N5N   !!"i0000000001  	  	  	 &-&9GNNtE}%dG44		$	 s/   C$ A 
C!B CC!$D'>%D'&D'c                   | j         5  d| _        d d d            n# 1 swxY w Y   |                     | j                  D ]}|                     |d           |                     | j                  D ]}|                     |           d S r  )r  r  r  r]  r  r  r  )r   r  s     r   _finished_receivingz"ChannelFactory._finished_receiving$  s    _ 	! 	! DM	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!**T^,, 	1 	1Bb40000**T_-- 	' 	'B""2&&&&	' 	's     )rf   )rP  rQ  r  r$   r   r   r   )r  r4   r   r  )r   r
  )r  r$   r   r   r   )r  r$   r  r=   r   r   r9   )
r   r   r    r   rj  r  r  r  r{  r  r   r   r   r  r    s                3 3 3 3$ $ $ $) ) ) ) )&1 1 1 10' ' ' ' ' 'r   r  c                  0    e Zd ZdddZdd	Zdd
ZddZdS )ChannelFileTrJ  r  r  r=   r   r   c                "    || _         || _        d S r   )rJ  _proxyclose)r   rJ  r  s      r   r   zChannelFile.__init__.  s    %r   c                    dS r   r   r0   s    r   isattyzChannelFile.isatty2  s    ur   c                J    | j         r| j                                         d S d S r   )r  rJ  r7  r0   s    r   r7  zChannelFile.close5  s1     	!L     	! 	!r   rL   c                ^    | j                                         rdpd}d| j         j        |fz  S )Nr  r  z<ChannelFile %d %s>)rJ  r  r  )r   states     r   rT   zChannelFile.__repr__9  s3    &&((5X@&$'???r   NTrJ  r  r  r=   r   r   rH   r9   rr   )r   r   r    r   r  r7  rT   r   r   r   r  r  -  so        & & & & &   ! ! ! !@ @ @ @ @ @r   r  c                      e Zd ZddZd	dZdS )
r  outr   r   r   c                :    | j                             |           d S r   )rJ  r  )r   r"  s     r   r   zChannelFileWrite.write?  s    #r   c                    d S r   r   r0   s    r   r  zChannelFileWrite.flushB      r   N)r"  r   r   r   r9   )r   r   r    r   r  r   r   r   r  r  >  s<                r   r  c                  2     e Zd Zdd fdZddZddZ xZS )r  TrJ  r  r  r=   r   r   c                Z    t                                          ||           d | _        d S r   )r  r   _buffer)r   rJ  r  r  s      r   r   zChannelFileRead.__init__G  s(    *---#'r   nr$   rL   c                   	 | j         1t          t          | j                                                  | _         t          | j                   |k     rR| xj         t          t          | j                                                  z  c_         t          | j                   |k     Rn$# t          $ r |                                  Y nw xY w| j         d}n#| j         d |         }| j         |d          | _         |S )Nr  )r(  r   rL   rJ  r  r   r3  r7  )r   r)  rets      r   r'   zChannelFileRead.readK  s    	|##C)=)=)?)?@@dl##a''S$,*>*>*@*@ A AA dl##a'' 	 	 	JJLLLLL	<CC,rr"C<+DL
s   B"B% %CCc                v   | j         c| j                             d          }|dk    r|                     |dz             S |                     t          | j                   dz             }n|                     d          }|r7|d         dk    r+|                     d          }|sn||z  }|r|d         dk    +|S )Nr  rf   )r(  findr'   r   )r   ir  cs       r   readlinezChannelFileRead.readlineZ  s    <#!!$''ABwwyyQ'''99S..233DD99Q<<D 	tBx4''		!A AID	  	tBx4''
 r   r  r   )r)  r$   r   rL   rr   )r   r   r    r   r'   r1  r  r  s   @r   r  r  F  sj        ( ( ( ( ( ( (          r   r  c                  d    e Zd ZeZdZd d!d	Zd"dZd#dZd#dZ	d#dZ
d$d%dZd&dZd'dZd(d)dZdS )*rQ  z<worker>rr  rA  r*   _startcountr$   r   r   c                <   |j         | _         || _        || _        t          j        t          j        f| _        t          | |          | _        | j         	                                | _
        t          | _        t          | _        t          | j                   | _        d S r   )r,   _ior  Unserializerr  r  ri  r  r\  rp   r  r  _BaseGateway__tracer  r  r   _receivepool)r   rA  r  r3  s       r   r   zBaseGateway.__init__n  sz    '8,:WX-dK@@ N0022)&t~66r   r  r  c                ,     | j         | j        g|R   d S r   )r7  r  r  s     r   r  zBaseGateway._tracez  s$    TW#s######r   c                D    | j                             | j                   d S r   )r8  r   _thread_receiverr0   s    r   _initreceivezBaseGateway._initreceive}  s"     566666r   c                (    d fd} |d            j         }	 	 t                              |          } |d|            j        5  |                                ~d d d            n# 1 swxY w Y   \# t
          t          f$ r Y nXt          $ r} |d	           | _        Y d }~n8d }~wt          $ r(} | 
                    |                     Y d }~nd }~ww xY w |d
            j                                          |d                                              |d            j                                           |d            j                                           |d            j                                         d S )Nr  r  r   r   c                 $     j         dg| R   d S )Nz[receiver-thread]r  r  r   s    r   logz)BaseGateway._thread_receiver.<locals>.log  s$    DK+2c222222r   zRECEIVERTHREAD: starting to runrf   rT  z-EOF without prior gateway termination messagezfinishing receiving threadzterminating executionzclosing readzclosing writez#terminating our receive pseudo poolr  )r5  r<  rL  r  rT  KeyboardInterruptro  r3  r  r  r  r\  r  _terminate_executionr1   r3   r8  r   )r   rA  rA  r  r   s   `    r   r;  zBaseGateway._thread_receiver  s@   	3 	3 	3 	3 	3 	3 	-...X	)oob))J$$$&  LL&&&               "#;< 	 	 	D 	 	 	C?@@@DKKKKKK 	) 	) 	)C""3''((((((((	)()))00222#$$$!!###NO1222**,,,,,sM   .A8 	A, A8 ,A00A8 3A04A8 8C 	C B++C 8CC c                    d S r   r   r0   s    r   rC  z BaseGateway._terminate_execution  r%  r   r   r   r>  r?  r   r   c                
   t          |||          }	 |                    | j                   |                     d|           d S # t          t
          f$ r,}|                     d||           t	          d          |d }~ww xY w)Nsentzfailed to sendzcannot send (already closed?))r<  rO  r5  r  r   r   )r   r>  r?  r   rX  rH  s         r   r_  zBaseGateway._send  s    '9d33	BMM$(###KK((((($ 	B 	B 	BKK('15559::A	Bs   0A B'A==BrJ  r  ru  c                0    |                     d           d S )Nzexecution disallowed)r7  )r   rJ  ru  s      r   rv  zBaseGateway._local_schedulexec  s    ,-----r   c                4    | j                                         S )z!Return a new independent channel.)r\  rj  r0   s    r   
newchannelzBaseGateway.newchannel  s    #'')))r   NrD   rE   c                d    |                      d           | j                            |           dS )z%Wait for receiverthread to terminate.z%waiting for receiver thread to finishN)r  r8  r  rG   s     r   r  zBaseGateway.join  s2    ;<<<!!'*****r   )rr  )rA  r*   r3  r$   r   r   r  r9   r  r  rJ  r  ru  r   r   r   )r   r  r   r   )r   r   r    r  _sysexr  r   r  r<  r;  rC  r_  rv  rI  r  r   r   r   rQ  rQ  j  s        F	B
7 
7 
7 
7 
7$ $ $ $7 7 7 7- - - -@   B B B B B. . . .* * * *+ + + + + + +r   rQ  c                  .    e Zd ZddZddZdd	ZddZdS )WorkerGatewayrJ  r  ru  r   r   r   c                D   | j         j        j        dk    rY| j        J | j                            d          s|                    t                     d S | j                                         t          |          }| j         	                    | j
        ||f           d S )Nr   rf   r  )r^  r,   rP   _executetask_completer6   r7  MAIN_THREAD_ONLY_DEADLOCK_TEXTrC   rg  r   executetask)r   rJ  ru  sourcetask_s       r   rv  z WorkerGateway._local_schedulexec  s    >#+/AAA-999 -2212== <=== &,,...$Z00T-/EFFFFFr   c                :   |                      d           | j                                         | j                            d          s|                      d           t          j        dk    r<|                      d           t          j        t          j                    d           n*t          #|                      d           t                       | j                            d          s-|                      d	           t          j
        d
           d S d S d S )Nzshutting down execution poolg      @z5execution ongoing after 5 secs, trying interrupt_mainr&  zsending ourselves a SIGINTrr  zcalling interrupt_main()g      $@z?execution did not finish in another 10 secs, calling os._exit()rf   )r  r^  r   r  r  r*  r   r8   r  r   _exitr0   s    r   rC  z"WorkerGateway._terminate_execution  s   2333'')))~%%c** 	KKOPPP |w&&8999	Q''''+6777   >))$// U   	 	 r   c                    d fd} j         j        dv }t           j         |           _        d  _         j         j        dk    r7 j                                          _         j                                          |d	                                             	 |r$ |d
            j                                          |d            	                                 d S # t          $ r  |d           Y d S w xY w)Nr  rL   r   r   c                8                         d| z              d S )Nz[serve] r?  r@  s    r   r  z"WorkerGateway.serve.<locals>.trace  s     KK
S()))))r   r   )r   r   zspawning receiver threadzintegrating as primary threadzjoining receiver threadz,swallowing keyboardinterrupt, serve finished)r  rL   r   r   )r,   rP   r   r^  rP  r<   rA   r<  r   r  rB  )r   r  r   s   `  r   servezWorkerGateway.serve  s@   	* 	* 	* 	* 	* 	* ^+/MM
#DNzJJJ%)">!%777)-)=)=)?)?D& &**,,,()))		B =5666::<<<E+,,,IIKKKKK  	B 	B 	BE@AAAAAA	Bs   AC& &C?>C?r  Etuple[Channel, tuple[str, str | None, str | None, dict[str, object]]]c                   	 |\  }\  }}}}|dd}|                      d|j         dt          |          d d                     d|_        	 t	          |dz   |pdd	          }t          ||           |r.|                      d
|d|dd           ||         }	 |	|fi | d|_        |                      d           n!# d|_        |                      d           w xY wn# t          $ r |                    t                      t          $ r}
t          |
t                    sY|j        j        j        sH|                      d|
           |                     |
          }|                    |           Y d }
~
d S |                      d           Y d }
~
nd }
~
ww xY w|                                 | j        | j                                         d S d S )N__channelexec__)rJ  r   zexecution starts[z]: 2   Tr  z<remote exec>execzcalling z(**z>60)Fzexecution finishedzgot exception: z,ignoring EOFError because receiving finished)r  r  reprr  compiler]  rB  r7  r  r   r   r3  rP  r\  r  r  rP  rA   )r   r  rJ  source	file_name	call_namer   loccofunctionr   r  s               r   rR  zWorkerGateway.executetask   s:   	H>B;G;fiF.5CT"U"UCKKNGJNN4<<;LNNOOO!%G	2Vd]I,H&QQR 0KKK			6666 JKKK"9~HHW/////%*"01111 &+"011111  	 	 	MM.))) 	H 	H 	Hc8,, 6? KK 9# 9 9::: $ 2 23 7 7IMM),,,FFFFFKKFGGGGGGGG	H 	%1 &**,,,,,	 21s8   AC# AC $C# CC# #.FA(F?FFNrK  r9   )r  rY  r   r   )r   r   r    rv  rC  rX  rR  r   r   r   rN  rN    sl        G G G G&   (B B B B2#- #- #- #- #- #-r   rN  c                      e Zd ZdS )DataFormatErrorNr   r   r    r   r   r   rh  rh  +          Dr   rh  c                      e Zd ZdZdS )	DumpErrorz"Error while serializing an object.Nr  r   r   r   rl  rl  /  s        ,,,,r   rl  c                      e Zd ZdZdS )	LoadErrorz$Error while unserializing an object.Nr  r   r   r   rn  rn  3  s        ....r   rn  r)  r$   r   c                "    t          | g          S r   )r   )r)  s    r   bchrrp  7  s    !::r   rr  iz!dz!ddc                      e Zd ZdS )_StopNri  r   r   r   rr  rr  E  rj  r   rr  c                  f    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    rJ   
BUILDTUPLEBYTESCHANNELFALSEFLOAT	FROZENSETINTLONGLONGINTLONGLONGNEWDICTNEWLISTNONE	PY2STRING	PY3STRINGSETSETITEMSTOPTRUEUNICODECOMPLEXr   r   r   rt  rt  I  s}        --JEGEEI
CDGHGGDII
CGDDGGGGr   rt  c                     e Zd ZU i Zded<   dZdZ	 	 d-d.dZd/d0dZd1dZ	e	ee
j        <   d1dZeee
j        <   d1dZeee
j        <   d1dZeee
j        <   d1dZeee
j        <   eZeee
j        <   eZeee
j        <   d1dZeee
j        <   d1dZeee
j        <   d2dZd3dZd1dZeee
j        <   d1dZ e ee
j!        <   d1d Z"e"ee
j#        <   d1d!Z$e$ee
j%        <   d1d"Z&e&ee
j'        <   d1d#Z(e(ee
j)        <   d1d$Z*e*ee
j+        <   d4d'Z,d1d(Z-e-ee
j.        <   d1d)Z/e/ee
j0        <   d1d*Z1e1ee
j2        <   d1d+Z3e3ee
j4        <   d1d,Z5e5ee
j6        <   dS )5r6  z+dict[bytes, Callable[[Unserializer], None]]num2funcTFNstreamr"   channel_or_gatewayChannel | BaseGateway | Nonerk  tuple[bool, bool] | Noner   r   c                    t          |t                    r|j        }n|}||j        }|r|\  | _        | _        || _        |	d | _        d S |j        | _        d S r   )	r   r  rP  ri  r  r  r  channelfactoryr\  )r   r  r  rk  gws        r   r   zUnserializer.__init__h  sx     ('22 	$%7%?BB#B)*5I 	E;D8D!4#8:"&D"$"4Dr   	versionedr=   r   c                   |r7| j                             d          }|t          k    rt          d|z            g | _        	 	 | j                             d          }|st
          	 | j        |         }n"# t          $ r t          d|d          d w xY w ||            `# t          $ rE t          | j                  dk    rt          d          d | j        
                    d          cY S w xY w)	Nrf   zwrong dumpformat version %rTzunknown opcode z - wire protocol corruption?zdidn't get STOPzinternal unserialization errorr   )r  r'   DUMPFORMAT_VERSIONrn  stackr3  r  r	  rr  r   r   )r   r  verrt  loaders        r   loadzUnserializer.load|  s3    	E+""1%%C((( = CDDD#%
	/
))!,, #"N !]62FF      #P&PPP    t
  	% 	% 	%4:!## @AAtK:>>!$$$$$	%s+   $B# 'A5 4B# 5BB# #AC21C2c                :    | j                             d            d S r   r  r
  r0   s    r   	load_nonezUnserializer.load_none      
$r   c                :    | j                             d           d S r   r  r0   s    r   	load_truezUnserializer.load_true  r  r   c                :    | j                             d           d S r   r  r0   s    r   
load_falsezUnserializer.load_false  s    
%     r   c                b    |                                  }| j                            |           d S r   
_read_int4r  r
  r   r/  s     r   load_intzUnserializer.load_int  s-    OO
!r   c                |    |                                  }| j                            t          |                     d S r   )_read_byte_stringr  r
  r$   r   ss     r   load_longintzUnserializer.load_longint  s5    ""$$
#a&&!!!!!r   c                    | j                             t                    }| j                            t          j        t          |          d                    d S r   )r  r'   FLOAT_FORMAT_SIZEr  r
  rE  rF  FLOAT_FORMATr   binarys     r   
load_floatzUnserializer.load_float  sE    !!"344
&-f==a@AAAAAr   c                    | j                             t                    }| j                            t          t          j        t          |                      d S r   )	r  r'   COMPLEX_FORMAT_SIZEr  r
  complexrE  rF  COMPLEX_FORMATr  s     r   load_complexzUnserializer.load_complex  sE    !!"566
'6=#H#HIJJJJJr   r$   c                l    t          j        d| j                            d                    d         }|S )N!ir}  r   )rE  rF  r  r'   )r   values     r   r  zUnserializer._read_int4  s-    ]4)9)9!)<)<==a@r   r   c                b    |                                  }| j                            |          }|S r   )r  r  r'   )r   lengthas_bytess      r   r  zUnserializer._read_byte_string  s+    "";##F++r   c                    |                                  }| j        r| j                            |           d S | j                            |                    d                     d S Nr   )r  r  r  r
  decode)r   r  s     r   load_py3stringzUnserializer.load_py3string  sb    ))++  	8Jh'''''Jhoog6677777r   c                    |                                  }| j        r|                    d          }n|}| j                            |           d S )Nzlatin-1)r  r  r  r  r
  )r   r  r  s      r   load_py2stringzUnserializer.load_py2string  sR    ))++  	%__Y77AAA
!r   c                b    |                                  }| j                            |           d S r   )r  r  r
  r  s     r   
load_byteszUnserializer.load_bytes  s/    ""$$
!r   c                    | j                             |                                                     d                     d S r  )r  r
  r  r  r0   s    r   load_unicodezUnserializer.load_unicode  s8    
$002299'BBCCCCCr   c                j    |                                  }| j                            d g|z             d S r   r  )r   r  s     r   load_newlistzUnserializer.load_newlist  s3    ""
4&6/*****r   c                    t          | j                  dk     rt          d          | j                                        }| j                                        }|| j        d         |<   d S )Nrx  znot enough items for setitemr-  )r   r  rn  r   )r   r  keys      r   load_setitemzUnserializer.load_setitem  s\    tz??Q:;;;
  jnn#
2sr   c                :    | j                             i            d S r   r  r0   s    r   load_newdictzUnserializer.load_newdict  s    
"r   type_r  c                    |                                  }|r@ || j        | d                    }| j        | d = | j                            |           d S | j                             |                       d S r   r  )r   r  r  ress       r   _load_collectionzUnserializer._load_collection  s    "" 	'%
F788,--C
F788$Jc"""""Jeegg&&&&&r   c                :    |                      t                     d S r   )r  rh  r0   s    r   load_buildtuplezUnserializer.load_buildtuple  s    e$$$$$r   c                :    |                      t                     d S r   )r  rA   r0   s    r   load_setzUnserializer.load_set  s    c"""""r   c                :    |                      t                     d S r   )r  	frozensetr0   s    r   load_frozensetzUnserializer.load_frozenset  s    i(((((r   c                    t           r   )rr  r0   s    r   	load_stopzUnserializer.load_stop  s    r   c                    |                                  }| j        J | j                            |          }| j                            |           d S r   )r  r  rj  r  r
  )r   r  rI  s      r   load_channelzUnserializer.load_channel  sR    __"...(,,R00

*%%%%%r   NN)r  r"   r  r  rk  r  r   r   r  )r  r=   r   r   r9   rt   )r   r   )r  r  r   r   )7r   r   r    r  r:   r  r  r   r  r  rt  r  r  r  r  r  r  r  r  r  	load_longr  load_longlongr  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   r   r6  r6  c  s^        <>H>>>>
 <@.2	5 5 5 5 5(/ / / / /2        &HV[        &HV[! ! ! ! (HV\    $HVZ" " " "  ,HV^I%HV[ M -HV_B B B B (HV\K K K K  ,HV^      
8 8 8 8 "0HV    "0HV    (HV\D D D D  ,HV^+ + + +  ,HV^$ $ $ $  ,HV^     ,HV^' ' ' '% % % % #2HV# # # # $HVZ) ) ) ) "0HV    &HV[& & & &  ,HV^r   r6  objc                H    t                                          | 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r  s    r   dumpsr  #  s!     ==cT222r   c                Z    t          | j                                      |d           dS )zCwrite a serialized bytestring of the given obj to the given stream.)r   Tr  N)r  r   r  )byteior  s     r   dumpr  -  s.    fl###(((=====r   F
bytestringr  r=   r  r   c                D    t          |           }t          |||          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  rA  s       r   loadsr  2  s1      
		B
-@P   r   rA  c                T    ||f}t          | |                              d          S )z}Derserialize an object form the specified stream.

    Behaviour and parameters are otherwise the same as with ``loads``
    )rk  Tr  )r6  r  )rA  r  r  rk  s       r   r  r  H  s3     "#34Ii000555EEEr   rk  r  c                f    t          |           }t          |||                                          S r   )r   r6  r  )r   r  rk  rA  s       r   rg  rg  S  s/    
 
		BNI66;;===r   c                D    t                                          |           S r   r  r  s    r   ra  ra  \  s    ==c"""r   c                      e Zd ZU i Zded<   dDdEdZdFdGdZdHdZdIdZdJdZ	dKdZ
dLdZdLdZdKdZdMd!ZdNd"ZdOd$ZdPd'ZdQd*Zd+efz  fdRd-ZdSd0ZdTd3ZdUd6ZdVd9ZdWd<ZdXd>ZdYd@ZdZdCZdS )[r  z1dict[type, Callable[[_Serializer, object], None]]	_dispatchNr   Callable[[bytes], None] | Noner   r   c                >    |g | _         | j         j        }|| _        d S r   )_streamlistr
  r1  )r   r   s     r   r   z_Serializer.__init__c  s%    =,.D$+Er   Fr  r  r  r=   bytes | Nonec                    |r|                      t                     |                     |           |                      t          j                   	 | j        }n# t          $ r Y d S w xY wd                    |          S )Nr   )r1  r  _savert  r  r
  r   r  )r   r  r  
streamlists       r   r  z_Serializer.savei  s      	,KK*+++

3FK   	)JJ 	 	 	44	xx
###s   A 
A('A(c                    t          |          }	 | j        |         }nQ# t          $ rD d|j        z   }t	          | j        |d           }|t          d|           d |x}| j        |<   Y nw xY w || |           d S )Nsave_zcan't serialize )r  r  r	  r   r/  r  rl  )r   r  tpdispatch
methodnamemeths         r   r  z_Serializer._savew  s    #YY		1~b)HH 	1 	1 	1 2;.JAH
DB BD | 72 7 788dB,00Ht~b)))	1 	ss    AA-,A-nonc                D    |                      t          j                   d S r   )r1  rt  r  )r   r  s     r   save_NoneTypez_Serializer.save_NoneType  s    FK     r   booleanc                    |r!|                      t          j                   d S |                      t          j                   d S r   )r1  rt  r  r  )r   r  s     r   	save_boolz_Serializer.save_bool  s>     	&KK$$$$$KK%%%%%r   bytes_r   c                n    |                      t          j                   |                     |           d S r   )r1  rt  r  _write_byte_sequencer   r  s     r   
save_bytesz_Serializer.save_bytes  s0    FL!!!!!&)))))r   r  rL   c                n    |                      t          j                   |                     |           d S r   )r1  rt  r  _write_unicode_stringr  s     r   save_strz_Serializer.save_str  s1    F$%%%""1%%%%%r   c                    	 |                     d          }n"# t          $ r}t          d          |d }~ww xY w|                     |           d S )Nr   zstrings must be utf-8 encodable)encodeUnicodeEncodeErrorrl  r  )r   r  r  rH  s       r   r!  z!_Serializer._write_unicode_string  si    	Fxx((HH! 	F 	F 	F=>>AE	F!!(+++++s    
727c                v    |                      t          |          d           |                     |           d S )Nzstring is too long)_write_int4r   r1  r  s     r   r  z _Serializer._write_byte_sequence  s7    V&:;;;Fr   r/  r$   short_oplong_opc                .   |t           k    r,|                     |           |                     |           d S |                     |           |                     t	          |                              d                              d                     d S )NLascii)FOUR_BYTE_INT_MAXr1  r'  r  rL   rstripr$  )r   r/  r(  r)  s       r   _save_integralz_Serializer._save_integral  s    !!!KK!!!QKK   %%c!ffmmC&8&8&?&?&H&HIIIIIr   c                \    |                      |t          j        t          j                   d S r   )r/  rt  r  r  r  s     r   save_intz_Serializer.save_int  s$    Avz6>:::::r   r  c                \    |                      |t          j        t          j                   d S r   )r/  rt  r  r  )r   r  s     r   	save_longz_Serializer.save_long  s$    Av{FO<<<<<r   fltrc   c                    |                      t          j                   |                      t          j        t
          |                     d S r   )r1  rt  r  rE  rN  r  )r   r4  s     r   
save_floatz_Serializer.save_float  s:    FL!!!FKc2233333r   cpxr  c                    |                      t          j                   |                      t          j        t
          |j        |j                             d S r   )r1  rt  r  rE  rN  r  realimag)r   r7  s     r   save_complexz_Serializer.save_complex  s@    FN###FK#(CCDDDDDr   zint must be less than %ir:  c                    |t           k    rt          |          |                     t          j        d|                     d S )Nr  )r-  rl  r1  rE  rN  )r   r/  r:  s      r   r'  z_Serializer._write_int4  sB        E"""FKa(()))))r   r+  list[object]c                    |                      t          j                   |                     t	          |          d           t          |          D ]\  }}|                     ||           d S )Nzlist is too long)r1  rt  r  r'  r   	enumerate_write_setitem)r   r+  r/  r  s       r   	save_listz_Serializer.save_list  so    FN###Q!3444 || 	) 	)GAt4((((	) 	)r   r  r  c                    |                      |           |                      |           |                     t          j                   d S r   )r  r1  rt  r  )r   r  r  s      r   r@  z_Serializer._write_setitem  s=    

3

5FN#####r   rc  dict[object, object]c                    |                      t          j                   |                                D ]\  }}|                     ||           d S r   )r1  rt  r  r  r@  )r   rc  r  r  s       r   	save_dictz_Serializer.save_dict  sT    FN###'')) 	, 	,JCU++++	, 	,r   tuptuple[object, ...]c                    |D ]}|                      |           |                     t          j                   |                     t          |          d           d S )Nztuple is too long)r  r1  rt  r  r'  r   )r   rF  r  s      r   
save_tuplez_Serializer.save_tuple  s^     	 	DJJtF%&&&S#677777r   set[object] | frozenset[object]opc                    |D ]}|                      |           |                     |           |                     t          |          d           d S )Nzset is too long)r  r1  r'  r   )r   r  rK  r  s       r   
_write_setz_Serializer._write_set  sX     	 	DJJtBQ!233333r   set[object]c                F    |                      |t          j                   d S r   )rM  rt  r  r  s     r   save_setz_Serializer.save_set  s    6:&&&&&r   frozenset[object]c                F    |                      |t          j                   d S r   )rM  rt  r  r  s     r   save_frozensetz_Serializer.save_frozenset  s    6+,,,,,r   rJ  r  c                x    |                      t          j                   |                     |j                   d S r   )r1  rt  r  r'  r  )r   rJ  s     r   save_Channelz_Serializer.save_Channel  s2    FN###$$$$$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  rL   r   r   )r/  r$   r(  r   r)  r   r   r   )r/  r$   r   r   )r  r$   r   r   )r4  rc   r   r   )r7  r  r   r   )r/  r$   r:  rL   r   r   )r+  r=  r   r   )r  r  r  r  r   r   )rc  rC  r   r   )rF  rG  r   r   )r  rJ  rK  r   r   r   )r  rN  r   r   )r  rQ  r   r   )rJ  r  r   r   )r   r   r    r  r:   r   r  r  r  r  r  r"  r!  r  r/  r1  r3  r6  r;  r-  r'  rA  r@  rE  rI  rM  rP  rS  rU  r   r   r   r  r  `  s        CEIEEEE    $ $ $ $ $   ! ! ! !& & & &* * * *& & & &, , , ,   J J J J; ; ; ;= = = =4 4 4 4E E E E
 $>AR@T#T* * * * *) ) ) )$ $ $ $
, , , ,
8 8 8 84 4 4 4' ' ' '- - - -% % % % % %r   r  r,   c                v   t          t          d          s_t          t          j        t          j        |           }dd l} |j        d          t          _         |j        d          t          _        n	 t          j        }n%# t          $ r t          j
        dk    rd}nd}Y nw xY w|                     t          j        d          dd          }t          j        |t          j                  }t          j        |d           t          j        |           |                     t          j        d          dd          }t          j        |t          j                  }t          j        |d           t          j
        dk    rH|                     t          j        d	          dd          t          _        t          j        |d	           t          j        |           t          |||           }|                     dddd
          t          _        |                     dddd
          t          _        |S )Ndupr   r  r  ntNULz	/dev/nullrf   rr  Fr   )hasattrr   r$  r  stdoutstdintempfileTemporaryFiledevnullr   rW  rl   rX  r  O_RDONLYdup2r7  O_WRONLYr  )r,   rA  r^  r`  r]  rh   r\  s          r   init_popen_iord    s   2u "@cj#)Y77*H*3//	+X+C00

	&jGG 	& 	& 	&w$%		&   C33WWbk**
A
 !!"&))S!44WWbk**
A 7d??"))"&))S!<<CJGBNNN
feY// $$QQ$>>	%%aa%??
Is   6B B%$B%c                r    t          d|            t          | |d                                           d S )Nzcreating workergateway on rr  )rA  r  r3  )r  rN  rX  )rA  r  s     r   rX  rX    s@    	
-r
-
-...RBA...4466666r   )rP   r   r   r+   r  )r   r   r  r  r   rL   )r)  r$   r   r   )r  r  r   r   rV  )FF)r   r   r  r=   r  r=   r   r   )rA  r"   r  r=   r  r=   r   r   r  )r   r   rk  r  r   r   )r,   r+   r   r$  )rA  r*   r   r   )`rJ   
__future__r   rx   r   rE  r  	tracebackr  r   r   rA  r   typingr   r   r   r	   r
   r   r   r   r   r"   r*   r<   ABCMetar+   r|   r   r   r   r   r   r   rB  
SystemExitr  environr   DEBUGr  r  r  r^  pathr  
gettempdirfnr  r   notracer$  r<  r  ro  r  r  r  r9  r  r  r  r  r  r  rQ  r  r  r  r  rQ  rN  rh  rl  rn  rp  r  r-  r  calcsizer  r  r  rr  rt  r6  r  r  r  r  rg  ra  r  rd  rX  r   r   r   <module>rr     s  	 	 # " " " " " 



 				  



      " " " " " "                                                      1 1 1 1 1h 1 1 13 3 3 3 3X 3 3 3                	> 	> 	> 	> 	>H 	> 	> 	>2$ 2$ 2$ 2$ 2$#+ 2$ 2$ 2$ 2$j6! 6! 6! 6! 6!i 6! 6! 6!r! ! ! ! !o ! ! !60 60 60 60 60	 60 60 60r7$ 7$ 7$ 7$ 7$i 7$ 7$ 7$t; ; ; ;"! "! "! "! "! "! "! "!Jy6 y6 y6 y6 y6 y6 y6 y6x 
J' 	
''bikkC<<      (IIIOOO	)h)++-?#-E	F	FBRI	 	 	 	 	 (''Ge' ' ' ' ' ' ' 'TcS cS cS cS cS cS cS cSL2 2 2 2 2y 2 2 2 /-2    "O O O O O) O O O&; ; ; ; ;7 ; ; ; fhh AD AD AD AD AD AD AD ADH FHH	'P 
a' a' a' a' a' a' a' a'H@ @ @ @ @ @ @ @"    {   ! ! ! ! !k ! ! !HR+ R+ R+ R+ R+ R+ R+ R+jd- d- d- d- d-K d- d- d-X	 	 	 	 	i 	 	 	- - - - - - - -/ / / / / / / /    T!WW  #FOL11 %fon55 	 	 	 	 	I 	 	 	       4}, }, }, }, }, }, }, },@3 3 3 3> > > > QV    . JOF F F F F *.> > > > ># # # #B% B% B% B% B% B% B% B%J$ $ $ $N7 7 7 7 7 7r   