a
    IfǸ                     @   sL  g d 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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mZmZ ddlmZ dd	lmZ dd
lmZ ddlmZ zddlmZ W n ey   dZY n0 dZe d dd Zeeje dd dD Zed eur8dd ZeD ]Zeee q$G dd de Z!di fddZ"dd Z#G dd de$Z%d d! Z&d"d# Z'G d$d% d%e Z(G d&d' d'e Z)ej*ej+fej,ej-fd(Z.G d)d* d*e Z/G d+d, d,e0Z1G d-d. d.e Z2d/d0 Z3i fd1d2Z4dmd3d4Z5G d5d6 d6e Z6G d7d8 d8e Z7dnd9d:Z8G d;d< d<e2Z9G d=d> d>e2Z:G d?d@ d@e:Z;G dAdB dBe2Z<G dCdD dDe2Z=G dEdF dFe2Z>G dGdH dHe2Z?e4dIdJZ@G dKdL dLe@ZAe4dMdNZBdOdPieB_Ce4dQdRZDe4dSdTZEdUdUdUdPdPdVeE_CG dWdS dSeEZFG dXdY dYe/ZGeGdZejH eGd[ejH eGd\ejIe< eGd]ejJe: eGd^ejKe: eGd_ejLe: eGd`ejMe: eGdaejNe; eGdbejOe= eGdcejPeF eGddeeA eGdeeQeB eGd8e7e? eGd:e8eD eGd6e6e> eGjdPe9ddf eGjdUddg erHG dhdi diZRG djdk dke(ZSG dld de/ZTdS )o)BaseManagerSyncManager	BaseProxyToken    N)getpid)
format_exc   )
connection)	reductionget_spawning_popenProcessError)pool)process)util)get_context)shared_memoryFTSharedMemoryManagerc                 C   s   t j | j|  ffS N)arraytypecodetobytes)a r   )lib/python3.9/multiprocessing/managers.pyreduce_array/   s    r   c                 C   s   g | ]}t ti | qS r   )typegetattr.0namer   r   r   
<listcomp>3       r    )itemskeysvaluesc                 C   s   t t | ffS r   )listobjr   r   r   rebuild_as_list5   s    r(   c                   @   s4   e Zd ZdZdZdd Zdd Zdd Zd	d
 ZdS )r   z3
    Type to uniquely identify a shared object
    typeidaddressidc                 C   s   |||  | _ | _| _d S r   r)   )selfr*   r+   r,   r   r   r   __init__D   s    zToken.__init__c                 C   s   | j | j| jfS r   r)   r-   r   r   r   __getstate__G   s    zToken.__getstate__c                 C   s   |\| _ | _| _d S r   r)   r-   stater   r   r   __setstate__J   s    zToken.__setstate__c                 C   s   d| j j| j| j| jf S )Nz %s(typeid=%r, address=%r, id=%r))	__class____name__r*   r+   r,   r/   r   r   r   __repr__M   s    zToken.__repr__N)	r5   
__module____qualname____doc__	__slots__r.   r0   r3   r6   r   r   r   r   r   >   s   r   r   c                 C   s8   |  ||||f |  \}}|dkr*|S t||dS )zL
    Send a message to manager using connection `c` and return response
    #RETURNN)sendrecvconvert_to_error)cr,   
methodnameargskwdskindresultr   r   r   dispatchU   s
    rE   c                 C   sd   | dkr|S | dv rRt |ts4td|| t|| dkrHtd| S t|S ntd| S d S )N#ERROR)
#TRACEBACK#UNSERIALIZABLEz.Result {0!r} (kind '{1}') type is {2}, not strrH   zUnserializable message: %s
zUnrecognized message type {!r})
isinstancestr	TypeErrorformatr   RemoteError
ValueError)rC   rD   r   r   r   r>   _   s    


r>   c                   @   s   e Zd Zdd ZdS )rM   c                 C   s   dt | jd  d S )NzM
---------------------------------------------------------------------------
r   zK---------------------------------------------------------------------------)rJ   rA   r/   r   r   r   __str__o   s    zRemoteError.__str__N)r5   r7   r8   rO   r   r   r   r   rM   n   s   rM   c                 C   s2   g }t | D ] }t| |}t|r|| q|S )z4
    Return a list of names of methods of `obj`
    )dirr   callableappend)r'   tempr   funcr   r   r   all_methodsv   s    
rU   c                 C   s   dd t | D S )zP
    Return a list of names of methods of `obj` which do not start with '_'
    c                 S   s   g | ]}|d  dkr|qS )r   _r   r   r   r   r   r       r!   z"public_methods.<locals>.<listcomp>)rU   r&   r   r   r   public_methods   s    rW   c                   @   s   e Zd ZdZg dZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zeee
dZdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&S )'ServerzM
    Server class which runs in a process controlled by a manager object
    )	shutdowncreateaccept_connectionget_methods
debug_infonumber_of_objectsdummyincrefdecrefc                 C   sx   t |tstd|t||| _t|| _t	| \}}||dd| _
| j
j| _ddi| _i | _i | _t | _d S )Nz&Authkey {0!r} is type {1!s}, not bytes   )r+   Zbacklog0Nr   )rI   bytesrK   rL   r   registryr   AuthenticationStringauthkeylistener_clientlistenerr+   	id_to_objid_to_refcountid_to_local_proxy_obj	threadingLockmutex)r-   rf   r+   rh   
serializerListenerClientr   r   r   r.      s    


zServer.__init__c              	   C   s   t  | _| t _zt j| jd}d|_|	  z| j
 sL| jd q4W n ttfyd   Y n0 W tjtjkrtd tjt_tjt_td n2tjtjkrtd tjt_tjt_td 0 dS )z(
        Run the server forever
        )targetTr   zresetting stdout, stderrr   N)rn   Event
stop_eventr   current_process_manager_serverThreadaccepterdaemonstartis_setwaitKeyboardInterrupt
SystemExitsysstdout
__stdout__r   debug
__stderr__stderrexit)r-   rz   r   r   r   serve_forever   s*    




zServer.serve_foreverc                 C   sL   z| j  }W n ty$   Y q Y n0 tj| j|fd}d|_|  q d S )Nrt   rA   T)rj   ZacceptOSErrorrn   ry   handle_requestr{   r|   )r-   r?   tr   r   r   rz      s    
zServer.accepterc                 C   sN  d } }}zTt || j t || j | }|\}}}}|| jv sTJ d| t| |}W n ty|   dt f}	Y nB0 z||g|R i |}W n ty   dt f}	Y n
0 d|f}	z|	|	 W nt ty@ }
 zZz|	dt f W n ty   Y n0 t
d|	 t
d| t
d|
 W Y d}
~
n
d}
~
0 0 |  dS )z)
        Handle a new connection
        Nz%r unrecognizedrG   r;   zFailure to send message: %rz ... request was %r ... exception was %r)r	   Zdeliver_challengerh   Zanswer_challenger=   publicr   	Exceptionr   r<   r   infoclose)r-   r?   funcnamerD   requestignorerA   rB   rT   msger   r   r   r      s4    "zServer.handle_requestc                 C   s  t dt j |j}|j}| j}| j	 sΐz:d }}| }|\}}}	}
z|| \}}}W nP t
y } z8z| j| \}}}W n t
y   |Y n0 W Y d}~n
d}~0 0 ||vrtd|t||f t||}z||	i |
}W n. ty } zd|f}W Y d}~nXd}~0 0 |o,||d}|rb| |||\}}t|| j|}d||ff}nd|f}W n ty   |du rdt f}nRz2| j| }|| |||g|	R i |
}d|f}W n ty   dt f}Y n0 Y nL ty   t dt j td	 Y n ty2   dt f}Y n0 z4z|| W n" tyd   |d
t f Y n0 W q$ ty } zHt dt j t d| t d| |  td W Y d}~q$d}~0 0 q$dS )zQ
        Handle requests from the proxies in a particular process/thread
        z$starting server thread to service %rNz+method %r of %r object is not in exposed=%rrF   #PROXYr;   rG   z$got EOF -- exiting thread serving %rr   rH   zexception in thread serving %rz ... message was %rr   r   )r   r   rn   current_threadr   r=   r<   rk   rv   r}   KeyErrorrm   AttributeErrorr   r   r   getrZ   r   r+   r   fallback_mappingEOFErrorr   r   r   r   )r-   connr=   r<   rk   r@   r'   r   identrA   rB   exposed	gettypeidkeZfunctionresr   r   r*   ZridentZrexposedtokenZfallback_funcrD   r   r   r   serve_client   s     


zServer.serve_clientc                 C   s   |S r   r   r-   r   r   r'   r   r   r   fallback_getvalue7  s    zServer.fallback_getvaluec                 C   s   t |S r   rJ   r   r   r   r   fallback_str:  s    zServer.fallback_strc                 C   s   t |S r   )reprr   r   r   r   fallback_repr=  s    zServer.fallback_repr)rO   r6   	#GETVALUEc                 C   s   d S r   r   r-   r?   r   r   r   r_   F  s    zServer.dummyc              
   C   s   | j v g }t| j }|  |D ]<}|dkr&|d|| j| t| j| d dd f  q&d|W  d   S 1 s0    Y  dS )zO
        Return some info --- useful to spot problems with refcounting
        rc   z  %s:       refcount=%s
    %sr   NK   
)	rp   r%   rl   r#   sortrR   rJ   rk   join)r-   r?   rD   r#   r   r   r   r   r]   I  s    
zServer.debug_infoc                 C   s
   t | jS )z*
        Number of shared objects
        )lenrl   r   r   r   r   r^   Y  s    zServer.number_of_objectsc                 C   sV   zDzt d |d W n   ddl}|  Y n0 W | j  n| j  0 dS )z'
        Shutdown this process
        z!manager received shutdown messager;   Nr   N)r   r   r<   	traceback	print_excrv   set)r-   r?   r   r   r   r   rY   `  s    
zServer.shutdownc                O   s  | j  | j| \}}}}|du rD|s2t|dkr:td|d }	n||i |}	|du rbt|	}|durt|tstd|t	|t
|t
| }dt|	 }
td||
 |	t||f| j|
< |
| jvrd| j|
< W d   n1 s0    Y  | ||
 |
t|fS )z>
        Create a new shared object and return its id
        Nr   z4Without callable, must have one non-keyword argumentr   z,Method_to_typeid {0!r}: type {1!s}, not dictz%xz&%r callable returned object with id %r)rp   rf   r   rN   rW   rI   dictrK   rL   r   r%   r,   r   r   r   rk   rl   r`   tuple)r-   r?   r*   rA   rB   rQ   r   method_to_typeid	proxytyper'   r   r   r   r   rZ   m  s6    



(zServer.createc                 C   s   t | j|j d S )zL
        Return the methods of the shared object indicated by token
        r   )r   rk   r,   )r-   r?   r   r   r   r   r\     s    zServer.get_methodsc                 C   s"   |t  _|d | | dS )z=
        Spawn a new thread to serve this connection
        r   N)rn   r   r   r<   r   )r-   r?   r   r   r   r   r[     s    

zServer.accept_connectionc                 C   s   | j  z| j|  d7  < W nj ty } zR|| jv rpd| j|< | j| | j|< | j| \}}}td| n|W Y d }~n
d }~0 0 W d    n1 s0    Y  d S )Nr   z&Server re-enabled tracking & INCREF %r)rp   rl   r   rm   rk   r   r   )r-   r?   r   r   r'   r   r   r   r   r   r`     s    

zServer.increfc                 C   s   || j vr$|| jv r$td| d S | jd | j | dkrXtd|| j| | j | | j |  d8  < | j | dkr| j |= W d    n1 s0    Y  || j vrd| j|< td| | j | j|= W d    n1 s0    Y  d S )NzServer DECREF skipping %rr   z+Id {0!s} ({1!r}) has refcount {2:n}, not 1+r   )Nr   Nzdisposing of obj with id %r)rl   rm   r   r   rp   AssertionErrorrL   rk   )r-   r?   r   r   r   r   ra     s*    

&

zServer.decrefN)r5   r7   r8   r9   r   r.   r   rz   r   r   r   r   r   r   r_   r]   r^   rY   rZ   r\   r[   r`   ra   r   r   r   r   rX      s.   
"Q$rX   c                   @   s   e Zd ZdgZdZdZdZdS )Statevaluer   r      N)r5   r7   r8   r:   INITIALSTARTEDSHUTDOWNr   r   r   r   r     s   r   )pickleZ	xmlrpclibc                   @   s   e Zd ZdZi ZeZd"ddZdd Zdd	 Z	d#ddZ
ed$ddZdd Zd%ddZdd Zdd Zdd Zdd Zedd Zedd Zed&d d!ZdS )'r   z!
    Base class for managers
    Nr   c                 C   s\   |d u rt  j}|| _t || _t | _tj| j_	|| _
t| \| _| _|pTt | _d S r   )r   rw   rh   _addressrg   _authkeyr   _stater   r   _serializerri   Z	_Listener_Clientr   _ctx)r-   r+   rh   rq   ctxr   r   r   r.     s    

zBaseManager.__init__c                 C   sf   | j jtjkrP| j jtjkr&tdn*| j jtjkr>tdntd| j jt| j	| j
| j| jS )zX
        Return server object with serve_forever() method and address attribute
        Already started serverManager has shut downUnknown state {!r})r   r   r   r   r   r   r   rL   rX   	_registryr   r   r   r/   r   r   r   
get_server  s    


zBaseManager.get_serverc                 C   s8   t | j \}}|| j| jd}t|dd tj| j_dS )z>
        Connect manager object to the server process
        rh   Nr_   )	ri   r   r   r   rE   r   r   r   r   )r-   rr   rs   r   r   r   r   connect  s    zBaseManager.connectr   c              	   C   s4  | j jtjkrP| j jtjkr&tdn*| j jtjkr>tdntd| j j|durht|sht	dt
jdd\}}| jjt| j| j| j| j| j|||fd| _d	d
d | jjD }t| jd | | j_| j  |  | | _|  tj| j _tj| t| j| j| j| j| j | jfdd| _ dS )z@
        Spawn a server process for this manager object
        r   r   r   Nzinitializer must be a callableF)Zduplexr   :c                 s   s   | ]}t |V  qd S r   r   )r   ir   r   r   	<genexpr>(  r!   z$BaseManager.start.<locals>.<genexpr>-r   rA   Zexitpriority)!r   r   r   r   r   r   r   rL   rQ   rK   r	   ZPiper   ZProcessr   _run_serverr   r   r   r   _processr   Z	_identityr5   r   r|   r   r=   r   Finalize_finalize_managerr   rY   )r-   initializerinitargsreaderwriterr   r   r   r   r|     s>    






zBaseManager.startc           	      C   s^   t  t jt j |dur ||  | ||||}||j |  td|j |	  dS )z@
        Create a server, report its address and run it
        Nzmanager serving at %r)
signalSIGINTSIG_IGN_Serverr<   r+   r   r   r   r   )	clsrf   r+   rh   rq   r   r   r   serverr   r   r   r   :  s    zBaseManager._run_serverc                O   sl   | j jtjksJ d| j| j| jd}z&t|dd|f| |\}}W |  n
|  0 t	|| j||fS )zP
        Create a new shared object; return the token and exposed tuple
        zserver not yet startedr   NrZ   )
r   r   r   r   r   r   r   rE   r   r   )r-   r*   rA   rB   r   r,   r   r   r   r   _createQ  s    zBaseManager._createc                 C   s*   | j dur&| j | | j  s&d| _ dS )zC
        Join the manager process (if it has been spawned)
        N)r   r   is_aliver-   timeoutr   r   r   r   ]  s    

zBaseManager.joinc                 C   s8   | j | j| jd}zt|ddW |  S |  0 dS )zS
        Return some info about the servers shared objects and connections
        r   Nr]   r   r   r   rE   r   r-   r   r   r   r   _debug_infof  s    zBaseManager._debug_infoc                 C   s8   | j | j| jd}zt|ddW |  S |  0 dS )z5
        Return the number of shared objects
        r   Nr^   r   r   r   r   r   _number_of_objectsp  s    zBaseManager._number_of_objectsc                 C   sj   | j jtjkr|   | j jtjkrf| j jtjkr<tdn*| j jtjkrTtdntd| j j| S )NzUnable to start serverr   r   )	r   r   r   r   r|   r   r   r   rL   r/   r   r   r   	__enter__z  s    

zBaseManager.__enter__c                 C   s   |    d S r   )rY   r-   exc_typeZexc_valZexc_tbr   r   r   __exit__  s    zBaseManager.__exit__c                 C   s   |   rtd z4|||d}zt|dd W |  n
|  0 W n tyX   Y n0 | jdd |   rtd t| drtd	 |   | jdd |   rtd
 t	j
|_ztj|= W n ty   Y n0 dS )zQ
        Shutdown the manager process; will be registered as a finalizer
        z#sending shutdown message to managerr   NrY   g      ?)r   zmanager still alive	terminatez'trying to `terminate()` manager processz#manager still alive after terminate)r   r   r   rE   r   r   r   hasattrr   r   r   r   r   _address_to_localr   )r   r+   rh   r2   r   r   r   r   r   r     s.    




zBaseManager._finalize_managerc                 C   s   | j S r   )r   r/   r   r   r   r+     s    zBaseManager.addressTc           
         s   d| j vr| j | _ du r"t |p0t dd}|p@t dd}|rt| D ]8\}}t|tu srJ d| t|tu sRJ d| qR||| f| j< |r fdd}	|	_	t
| |	 dS )z9
        Register a typeid with the manager type
        r   N	_exposed__method_to_typeid_z%r is not a stringc                   sf   t d | jg|R i |\}} || j| | j|d}| j|j| jd}t|d d|jf |S )Nz)requesting creation of a shared %r objectmanagerrh   r   r   ra   )	r   r   r   r   r   r   r+   rE   r,   )r-   rA   rB   r   Zexpproxyr   r   r*   r   r   rS     s    z"BaseManager.register.<locals>.temp)__dict__r   copy	AutoProxyr   r%   r"   r   rJ   r5   setattr)
r   r*   rQ   r   r   r   create_methodkeyr   rS   r   r   r   register  s$    



zBaseManager.register)NNr   N)Nr   )Nr   )N)NNNNT)r5   r7   r8   r9   r   rX   r   r.   r   r   r|   classmethodr   r   r   r   r   r   r   staticmethodr   propertyr+   r   r   r   r   r   r     s4     
	
+ 
	



  r   c                   @   s   e Zd Zdd Zdd ZdS )ProcessLocalSetc                 C   s   t | dd  d S )Nc                 S   s   |   S r   )clearr&   r   r   r   <lambda>  r!   z*ProcessLocalSet.__init__.<locals>.<lambda>)r   register_after_forkr/   r   r   r   r.     s    zProcessLocalSet.__init__c                 C   s   t | dfS rd   )r   r/   r   r   r   
__reduce__  s    zProcessLocalSet.__reduce__N)r5   r7   r8   r.   r  r   r   r   r   r    s   r  c                   @   s   e Zd ZdZi Ze ZdddZdd Z	d	i fd
dZ
dd Zdd Zedd Zdd Zdd Zdd Zdd Zdd ZdS )r   z.
    A base for proxies of shared objects
    NTFc           	      C   s   t jB t j|jd }|d u r:t t f}|t j|j< W d    n1 sN0    Y  |d | _|d | _	|| _
| j
j| _|| _|| _t| d | _|| _|d urt|| _n"| jd ur| jj| _nt j| _|r|   t| t j d S )Nr   r   )r   _mutexr   r   r+   r   ZForkAwareLocalr  _tls_idset_tokenr,   _id_managerr   ri   r   _owned_by_managerr   rg   r   rw   rh   _increfr  _after_fork)	r-   r   rq   r   rh   r   r`   manager_ownedZ	tls_idsetr   r   r   r.     s*    *



zBaseProxy.__init__c                 C   sd   t d t j}t jdkr4|dt j 7 }| j| jj	| j
d}t|d d|f || j_d S )Nzmaking connection to managerZ
MainThread|r   r[   )r   r   r   rw   r   rn   r   r   r  r+   r   rE   r	  r	   )r-   r   r   r   r   r   _connect  s    

zBaseProxy._connectr   c                 C   s   z| j j}W n4 ty@   tdt j |   | j j}Y n0 |	| j
|||f | \}}|dkrn|S |dkr|\}}| jj|j d }	| jj|_|	|| j| j| j|d}
| j|j| jd}t|dd|jf |
S t||dS )	zV
        Try to call a method of the referent and return a copy of the result
        z#thread %r does not own a connectionr;   r   r   r   Nra   )r	  r	   r   r   r   rn   r   r   r  r<   r  r=   r  r   r*   r  r+   r   r   r   rE   r,   r>   )r-   r@   rA   rB   r   rC   rD   r   r   r   r   r   r   r   _callmethod  s0    

zBaseProxy._callmethodc                 C   s
   |  dS )z9
        Get a copy of the value of the referent
        r   r  r/   r   r   r   	_getvalue;  s    zBaseProxy._getvaluec              	   C   s   | j rtd| jj d S | j| jj| jd}t|d d| j	f td| jj | j
| j	 | joj| jj}tj| tj| j| j|| j| j
| jfdd| _d S )Nz%owned_by_manager skipped INCREF of %rr   r`   z	INCREF %r
   r   )r  r   r   r  r,   r   r+   r   rE   r  r
  addr  r   r   r   _decrefr	  Z_close)r-   r   r2   r   r   r   r  A  s    
zBaseProxy._increfc              
   C   s   | | j |d u s |jtjkrz2td| j || j|d}t|d d| jf W q t	y } ztd| W Y d }~qd }~0 0 ntd| j |st
|drtdt j |j  |`d S )Nz	DECREF %rr   ra   z... decref failed %sz%DECREF %r -- manager already shutdownr	   z-thread %r has no more proxies so closing conn)discardr,   r   r   r   r   r   r+   rE   r   r   rn   r   r   r	   r   )r   rh   r2   ZtlsZidsetr   r   r   r   r   r   r  U  s    $
zBaseProxy._decrefc              
   C   sJ   d | _ z|   W n2 tyD } ztd|  W Y d }~n
d }~0 0 d S )Nzincref failed: %s)r  r  r   r   r   )r-   r   r   r   r   r  n  s
    zBaseProxy._after_forkc                 C   s^   i }t  d ur| j|d< t| ddrB| j|d< tt| j| j|ffS tt| | j| j|ffS d S )Nrh   _isautoFr   )	r   r   r   r   RebuildProxyr   r  r   r   r-   rB   r   r   r   r  v  s    


zBaseProxy.__reduce__c                 C   s   |   S r   )r  )r-   memor   r   r   __deepcopy__  s    zBaseProxy.__deepcopy__c                 C   s   dt | j| jjt| f S )Nz<%s object, typeid %r at %#x>)r   r5   r  r*   r,   r/   r   r   r   r6     s    zBaseProxy.__repr__c                 C   s8   z|  dW S  ty2   t| dd d  Y S 0 dS )zV
        Return representation of the referent (or a fall-back if that fails)
        r6   Nr  z; '__str__()' failed>)r  r   r   r/   r   r   r   rO     s    zBaseProxy.__str__)NNNTF)r5   r7   r8   r9   r   r   ZForkAwareThreadLockr  r.   r  r  r  r  r  r  r  r  r   r6   rO   r   r   r   r   r     s"     
)	
r   c                 C   s   t t dd}|rT|j|jkrTtd| d|d< |j|jvrT|j|j |j|j< |	ddopt t dd }| ||fd|i|S )	z5
    Function used for unpickling proxy objects.
    rx   Nz*Rebuild a proxy owned by manager, token=%rTr  r`   Z_inheritingF)
r   r   rw   r+   r   r   r,   rm   rk   pop)rT   r   rq   rB   r   r`   r   r   r   r    s    

r  c                 C   sn   t |}z|| |f W S  ty(   Y n0 i }|D ]}td||f | q2t| tf|}||_||| |f< |S )zB
    Return a proxy type whose methods are given by `exposed`
    zOdef %s(self, /, *args, **kwds):
        return self._callmethod(%r, args, kwds))r   r   execr   r   r   )r   r   _cacheZdicmeth	ProxyTyper   r   r   MakeProxyType  s     r&  c                 C   s   t | d }|du rJ|| j|d}zt|dd| f}W |  n
|  0 |du r`|dur`|j}|du rrt j}td| j	 |}	|	| |||||d}
d|
_
|
S )z*
    Return an auto-proxy for `token`
    r   Nr   r\   zAutoProxy[%s])r   rh   r`   r  T)ri   r+   rE   r   r   r   rw   rh   r&  r*   r  )r   rq   r   rh   r   r`   r  r   r   r%  r   r   r   r   r     s     

r   c                   @   s   e Zd Zdd Zdd ZdS )	Namespacec                K   s   | j | d S r   )r   updater  r   r   r   r.     s    zNamespace.__init__c                 C   sZ   t | j }g }|D ]$\}}|ds|d||f  q|  d| jjd|f S )NrV   z%s=%rz%s(%s)z, )	r%   r   r"   
startswithrR   r   r4   r5   r   )r-   r"   rS   r   r   r   r   r   r6     s    
zNamespace.__repr__N)r5   r7   r8   r.   r6   r   r   r   r   r'    s   r'  c                   @   s8   e Zd ZdddZdd Zdd Zdd	 ZeeeZd
S )ValueTc                 C   s   || _ || _d S r   )	_typecode_value)r-   r   r   lockr   r   r   r.     s    zValue.__init__c                 C   s   | j S r   r,  r/   r   r   r   r     s    z	Value.getc                 C   s
   || _ d S r   r.  r-   r   r   r   r   r     s    z	Value.setc                 C   s   dt | j| j| jf S )Nz
%s(%r, %r))r   r5   r+  r,  r/   r   r   r   r6     s    zValue.__repr__N)T)	r5   r7   r8   r.   r   r   r6   r  r   r   r   r   r   r*    s
   
r*  c                 C   s   t  | |S r   )r   )r   sequencer-  r   r   r   Array  s    r1  c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )IteratorProxy)__next__r<   throwr   c                 C   s   | S r   r   r/   r   r   r   __iter__   s    zIteratorProxy.__iter__c                 G   s   |  d|S )Nr3  r  r-   rA   r   r   r   r3    s    zIteratorProxy.__next__c                 G   s   |  d|S )Nr<   r  r6  r   r   r   r<     s    zIteratorProxy.sendc                 G   s   |  d|S )Nr4  r  r6  r   r   r   r4    s    zIteratorProxy.throwc                 G   s   |  d|S )Nr   r  r6  r   r   r   r     s    zIteratorProxy.closeN)	r5   r7   r8   r   r5  r3  r<   r4  r   r   r   r   r   r2    s   r2  c                   @   s2   e Zd ZdZdddZdd Zdd	 Zd
d ZdS )AcquirerProxy)acquirereleaseTNc                 C   s"   |d u r|fn||f}|  d|S Nr8  r  )r-   Zblockingr   rA   r   r   r   r8    s    zAcquirerProxy.acquirec                 C   s
   |  dS Nr9  r  r/   r   r   r   r9    s    zAcquirerProxy.releasec                 C   s
   |  dS r:  r  r/   r   r   r   r     s    zAcquirerProxy.__enter__c                 C   s
   |  dS r;  r  r   r   r   r   r     s    zAcquirerProxy.__exit__)TN)r5   r7   r8   r   r8  r9  r   r   r   r   r   r   r7    s
   
r7  c                   @   s6   e Zd ZdZdddZdddZdd	 Zdd
dZdS )ConditionProxy)r8  r9  r~   notify
notify_allNc                 C   s   |  d|fS Nr~   r  r   r   r   r   r~     s    zConditionProxy.waitr   c                 C   s   |  d|fS )Nr=  r  )r-   nr   r   r   r=    s    zConditionProxy.notifyc                 C   s
   |  dS )Nr>  r  r/   r   r   r   r>    s    zConditionProxy.notify_allc                 C   sd   | }|r|S |d ur$t  | }nd }d }|s`|d urN|t   }|dkrNq`| | | }q,|S )Nr   )time	monotonicr~   )r-   Z	predicater   rD   ZendtimeZwaittimer   r   r   wait_for!  s    
zConditionProxy.wait_for)N)r   )N)r5   r7   r8   r   r~   r=  r>  rC  r   r   r   r   r<    s
   

r<  c                   @   s2   e Zd ZdZdd Zdd Zdd Zdd	d
ZdS )
EventProxy)r}   r   r  r~   c                 C   s
   |  dS )Nr}   r  r/   r   r   r   r}   6  s    zEventProxy.is_setc                 C   s
   |  dS Nr   r  r/   r   r   r   r   8  s    zEventProxy.setc                 C   s
   |  dS )Nr  r  r/   r   r   r   r  :  s    zEventProxy.clearNc                 C   s   |  d|fS r?  r  r   r   r   r   r~   <  s    zEventProxy.wait)N)r5   r7   r8   r   r}   r   r  r~   r   r   r   r   rD  4  s
   rD  c                   @   sN   e Zd ZdZdddZdd Zdd Zed	d
 Zedd Z	edd Z
dS )BarrierProxy)__getattribute__r~   abortresetNc                 C   s   |  d|fS r?  r  r   r   r   r   r~   B  s    zBarrierProxy.waitc                 C   s
   |  dS )NrH  r  r/   r   r   r   rH  D  s    zBarrierProxy.abortc                 C   s
   |  dS )NrI  r  r/   r   r   r   rI  F  s    zBarrierProxy.resetc                 C   s   |  ddS )NrG  )partiesr  r/   r   r   r   rJ  H  s    zBarrierProxy.partiesc                 C   s   |  ddS )NrG  )	n_waitingr  r/   r   r   r   rK  K  s    zBarrierProxy.n_waitingc                 C   s   |  ddS )NrG  )brokenr  r/   r   r   r   rL  N  s    zBarrierProxy.broken)N)r5   r7   r8   r   r~   rH  rI  r  rJ  rK  rL  r   r   r   r   rF  @  s   


rF  c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	NamespaceProxy)rG  __setattr____delattr__c                 C   s0   |d dkrt | |S t | d}|d|fS )Nr   rV   r  rG  )objectrG  r-   r   
callmethodr   r   r   __getattr__U  s    zNamespaceProxy.__getattr__c                 C   s4   |d dkrt | ||S t | d}|d||fS )Nr   rV   r  rN  )rP  rN  rG  )r-   r   r   rR  r   r   r   rN  Z  s    zNamespaceProxy.__setattr__c                 C   s0   |d dkrt | |S t | d}|d|fS )Nr   rV   r  rO  )rP  rO  rG  rQ  r   r   r   rO  _  s    zNamespaceProxy.__delattr__N)r5   r7   r8   r   rS  rN  rO  r   r   r   r   rM  S  s   rM  c                   @   s4   e Zd ZdZdd Zdd ZeeeZee	j
ZdS )
ValueProxy)r   r   c                 C   s
   |  dS )Nr   r  r/   r   r   r   r   h  s    zValueProxy.getc                 C   s   |  d|fS rE  r  r/  r   r   r   r   j  s    zValueProxy.setN)r5   r7   r8   r   r   r   r  r   r   typesGenericAlias__class_getitem__r   r   r   r   rT  f  s
   
rT  BaseListProxy)__add____contains____delitem____getitem____len____mul____reversed____rmul____setitem__rR   countextendindexinsertr!  removereverser   __imul__c                   @   s   e Zd Zdd Zdd ZdS )	ListProxyc                 C   s   |  d|f | S )Nrc  r  r/  r   r   r   __iadd__x  s    zListProxy.__iadd__c                 C   s   |  d|f | S )Nrh  r  r/  r   r   r   rh  {  s    zListProxy.__imul__N)r5   r7   r8   rj  rh  r   r   r   r   ri  w  s   ri  	DictProxy)rZ  r[  r\  r5  r]  ra  r  r   r   r"   r#   r!  popitem
setdefaultr(  r$   r5  Iterator
ArrayProxy)r]  r\  ra  	PoolProxy)Zapplyapply_asyncr   imapimap_unorderedr   map	map_asyncstarmapstarmap_asyncr   ZAsyncResult)rq  ru  rw  rr  rs  c                   @   s   e Zd Zdd Zdd ZdS )rp  c                 C   s   | S r   r   r/   r   r   r   r     s    zPoolProxy.__enter__c                 C   s   |    d S r   )r   r   r   r   r   r     s    zPoolProxy.__exit__N)r5   r7   r8   r   r   r   r   r   r   rp    s   c                   @   s   e Zd ZdZdS )r   a(  
    Subclass of `BaseManager` which supports a number of shared object types.

    The types registered are those intended for the synchronization
    of threads, plus `dict`, `list` and `Namespace`.

    The `multiprocessing.Manager()` function creates started instances of
    this class.
    N)r5   r7   r8   r9   r   r   r   r   r     s   r   QueueZJoinableQueueru   ro   RLock	SemaphoreBoundedSemaphore	ConditionBarrierPoolr%   r   )r   r   )r   c                   @   sL   e Zd ZdZg fddZdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dS )_SharedMemoryTrackerz+Manages one or more shared memory segments.c                 C   s   || _ || _d S r   Zshared_memory_context_namesegment_names)r-   r   r  r   r   r   r.     s    z_SharedMemoryTracker.__init__c                 C   s(   t d|dt   | j| dS )z6Adds the supplied shared memory block name to tracker.zRegister segment  in pid N)r   r   r   r  rR   r-   segment_namer   r   r   register_segment  s    z%_SharedMemoryTracker.register_segmentc                 C   sB   t d|dt   | j| t|}|  |  dS )zCalls unlink() on the shared memory block with the supplied name
            and removes it from the list of blocks being tracked.zDestroy segment r  N)	r   r   r   r  rf  r   SharedMemoryr   unlink)r-   r  Zsegmentr   r   r   destroy_segment  s
    
z$_SharedMemoryTracker.destroy_segmentc                 C   s"   | j dd D ]}| | qdS )z<Calls destroy_segment() on all tracked shared memory blocks.N)r  r  r  r   r   r   r    s    z_SharedMemoryTracker.unlinkc                 C   s(   t d| jj dt   |   d S )NzCall z.__del__ in )r   r   r4   r5   r   r  r/   r   r   r   __del__  s    z_SharedMemoryTracker.__del__c                 C   s   | j | jfS r   r  r/   r   r   r   r0     s    z!_SharedMemoryTracker.__getstate__c                 C   s   | j |  d S r   )r.   r1   r   r   r   r3     s    z!_SharedMemoryTracker.__setstate__N)r5   r7   r8   r9   r.   r  r  r  r  r0   r3   r   r   r   r   r    s   	r  c                   @   sJ   e Zd Zejg d Zdd Zdd Zdd Zdd	 Zd
d Z	dd Z
dS )SharedMemoryServer)track_segmentrelease_segmentlist_segmentsc                 O   s`   t j| g|R i | | j}t|tr2t|}td| dt  | _	t
dt   d S )NZshm_rV   z"SharedMemoryServer started by pid )rX   r.   r+   rI   re   osfsdecoder  r   shared_memory_contextr   r   )r-   rA   kwargsr+   r   r   r   r.     s    

zSharedMemoryServer.__init__c                O   s:   t | j| d dr| j|d< tj| ||g|R i |S )zCreate a new distributed-shared object (not backed by a shared
            memory block) and return its id to be used in a Proxy Object.r  Z_shared_memory_proxyr  )r   rf   r  rX   rZ   )r-   r?   r*   rA   r  r   r   r   rZ     s    
zSharedMemoryServer.createc                 C   s   | j   t| |S )zACall unlink() on all tracked shared memory, terminate the Server.)r  r  rX   rY   r   r   r   r   rY     s    
zSharedMemoryServer.shutdownc                 C   s   | j | dS )z?Adds the supplied shared memory block name to Server's tracker.N)r  r  r-   r?   r  r   r   r   r    s    z SharedMemoryServer.track_segmentc                 C   s   | j | dS )zCalls unlink() on the shared memory block with the supplied name
            and removes it from the tracker instance inside the Server.N)r  r  r  r   r   r   r    s    z"SharedMemoryServer.release_segmentc                 C   s   | j jS )zbReturns a list of names of shared memory blocks that the Server
            is currently tracking.)r  r  r   r   r   r   r    s    z SharedMemoryServer.list_segmentsN)r5   r7   r8   rX   r   r.   rZ   rY   r  r  r  r   r   r   r   r    s   

r  c                   @   s<   e Zd ZdZeZdd Zdd Zdd Zdd	 Z	d
d Z
dS )r   a  Like SyncManager but uses SharedMemoryServer instead of Server.

        It provides methods for creating and returning SharedMemory instances
        and for creating a list-like object (ShareableList) backed by shared
        memory.  It also provides methods that create and return Proxy Objects
        that support synchronization across processes (i.e. multi-process-safe
        locks and semaphores).
        c                 O   sT   t jdkrddlm} |  tj| g|R i | t| j	j
 dt   d S )Nposixr   )resource_trackerz created by pid )r  r    r  Zensure_runningr   r.   r   r   r4   r5   r   )r-   rA   r  r  r   r   r   r.   '  s
    
zSharedMemoryManager.__init__c                 C   s   t | jj dt   d S )Nz.__del__ by pid )r   r   r4   r5   r   r/   r   r   r   r  3  s    zSharedMemoryManager.__del__c                 C   sh   | j jtjkrP| j jtjkr&tdn*| j jtjkr>tdntd| j j| | j	| j
| j| jS )z@Better than monkeypatching for now; merge into Server ultimatelyz"Already started SharedMemoryServerz!SharedMemoryManager has shut downr   )r   r   r   r   r   r   r   rL   r   r   r   r   r   r/   r   r   r   r   7  s    

zSharedMemoryManager.get_serverc                 C   s   | j | j| jdh}tjdd|d}zt|dd|jf W n0 tyj } z|  |W Y d}~n
d}~0 0 W d   n1 s0    Y  |S )zoReturns a new SharedMemory instance with the specified size in
            bytes, to be tracked by the manager.r   NT)rZ   sizer  )	r   r   r   r   r  rE   r   BaseExceptionr  )r-   r  r   Zsmsr   r   r   r   r  D  s    8z SharedMemoryManager.SharedMemoryc                 C   s   | j | j| jdf}t|}zt|dd|jjf W n2 tyh } z|j	  |W Y d}~n
d}~0 0 W d   n1 s~0    Y  |S )zReturns a new ShareableList instance populated with the values
            from the input sequence, to be tracked by the manager.r   Nr  )
r   r   r   r   ShareableListrE   Zshmr   r  r  )r-   r0  r   Zslr   r   r   r   r  P  s    

8z!SharedMemoryManager.ShareableListN)r5   r7   r8   r9   r  r   r.   r  r   r  r  r   r   r   r   r     s   	)NNNTF)T)U__all__r   rn   r   r   ZqueuerA  rU  r  r   r   r   r  r	   contextr
   r   r   r   r   r   r   r   ImportErrorZ	HAS_SHMEMrR   r   r   Z
view_typesr%   r(   Z	view_typerP  r   rE   r>   r   rM   rU   rW   rX   r   rr   rs   ZXmlListenerZ	XmlClientri   r   r   r  r   r  r&  r   r'  r*  r1  r2  r7  r<  rD  rF  rM  rT  rX  ri  rk  r   ro  ZBasePoolProxyrp  r   rx  ru   ro   ry  rz  r{  r|  r}  r~  r   r  r  r   r   r   r   r   <module>   s   



  H

	 w
 4  


	




%-