U
    ad                     @   sB  d ddddg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 dZW n ek
r   dZY nX dd Zeeje dd dD Zed ek	r.d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-e.Z/G d.d deZ0d/d0 Z1i fd1d2Z2dld3d4Z3G d5d6 d6eZ4G d7d8 d8eZ5dmd9d:Z6G d;d< d<e0Z7G d=d> d>e0Z8G d?d@ d@e8Z9G dAdB dBe0Z:G dCdD dDe0Z;G dEdF dFe0Z<G dGdH dHe0Z=e2dIdJZ>G dKdL dLe>Z?e2dMdNZ@dOdPie@_Ae2dQdRZBe2dSdTZCdUdUdUdPdPdVeC_AG dWdS dSeCZDG dXd de-ZEeEdYejF eEdZejF eEd[ejGe: eEd\ejHe8 eEd]ejIe8 eEd^ejJe8 eEd_ejKe8 eEd`ejLe9 eEdaejMe; eEdbejNeD eEdcee? eEddeOe@ eEd8e5e= eEd:e6eB eEd6e4e< eEjdPe7dde eEjdUddf er>G dgdh dhZPG didj dje&ZQG dkd de-ZRdS )nBaseManagerSyncManager	BaseProxyTokenSharedMemoryManager    N)getpid)
format_exc   )
connection)	reductionget_spawning_popenProcessError)pool)process)util)get_context)shared_memoryTFc                 C   s   t j | j|  ffS N)arraytypecodetobytes)a r   ./usr/lib/python3.8/multiprocessing/managers.pyreduce_array-   s    r   c                 C   s   g | ]}t ti | qS r   )typegetattr.0namer   r   r   
<listcomp>1   s     r    )itemskeysvaluesc                 C   s   t t | ffS r   )listobjr   r   r   rebuild_as_list3   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__B   s    zToken.__init__c                 C   s   | j | j| jfS r   r(   r,   r   r   r   __getstate__E   s    zToken.__getstate__c                 C   s   |\| _ | _| _d S r   r(   r,   stater   r   r   __setstate__H   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__K   s    zToken.__repr__N)	r4   
__module____qualname____doc__	__slots__r-   r/   r2   r5   r   r   r   r   r   <   s   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   dispatchS   s
    rD   c                 C   sd   | dkr|S | dk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 strrG   zUnserializable message: %s
zUnrecognized message type {!r})
isinstancestr	TypeErrorformatr   RemoteError
ValueError)rB   rC   r   r   r   r=   ]   s    
  
r=   c                   @   s   e Zd Zdd ZdS )rL   c                 C   s   dt | jd  d S )NzM
---------------------------------------------------------------------------
r   zK---------------------------------------------------------------------------)rI   r@   r.   r   r   r   __str__m   s    zRemoteError.__str__N)r4   r6   r7   rN   r   r   r   r   rL   l   s   rL   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_methodst   s    
rT   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       s      z"public_methods.<locals>.<listcomp>)rT   r%   r   r   r   public_methods   s    rV   c                	   @   s   e Zd ZdZdddddddd	d
g	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&e_d'd( Zd)d* Zd+d, Zd-d. Zd/S )0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   )rH   bytesrJ   rK   r   registryr   AuthenticationStringauthkeylistener_clientlistenerr*   	id_to_objid_to_refcountid_to_local_proxy_obj	threadingLockmutex)r,   re   r*   rg   
serializerListenerClientr   r   r   r-      s     
 

zServer.__init__c              	   C   s   t  | _| t _zVt j| jd}d|_|  z| j sL| jd q4W n ttfk
rf   Y nX W 5 tjtjkrt	
d tjt_tjt_td X dS )z(
        Run the server forever
        zresetting stdout, stderrr   )targetTr	   N)rm   Event
stop_eventr   current_process_manager_serversysstdout
__stdout__r   debug
__stderr__stderrexitThreadaccepterdaemonstartis_setwaitKeyboardInterrupt
SystemExit)r,   r   r   r   r   serve_forever   s     




zServer.serve_foreverc                 C   sN   z| j  }W n tk
r&   Y q Y nX tj| j|fd}d|_|  q d S )Nrs   r@   T)ri   ZacceptOSErrorrm   r   handle_requestr   r   )r,   r>   tr   r   r   r      s    
zServer.accepterc                 C   sL  d } }}zTt || j t || j | }|\}}}}|| jksTtd| t| |}W n tk
r~   dt	 f}	Y n>X z||f||}W n tk
r   dt	 f}	Y n
X d|f}	z|
|	 W nt tk
r> }
 zTz|
dt	 f W n tk
r   Y nX td|	 td| td|
 W 5 d}
~
X Y nX |  dS )z)
        Handle a new connection
        Nz%r unrecognizedrF   r:   zFailure to send message: %rz ... request was %r ... exception was %r)r
   Zdeliver_challengerg   Zanswer_challenger<   publicAssertionErrorr   	Exceptionr   r;   r   infoclose)r,   r>   funcnamerC   requestignorer@   rA   rS   msger   r   r   r      s4    zServer.handle_requestc                 C   s  t dt j |j}|j}| j}| j	 szBd }}| }|\}}}	}
z|| \}}}W n^ t
k
r } z@z| j| \}}}W n& t
k
r } z|W 5 d}~X Y nX W 5 d}~X Y nX ||krtd|t||f t||}z||	|
}W n, tk
r" } zd|f}W 5 d}~X Y nPX |o4||d}|rj| |||\}}t|| j|}d||ff}nd|f}W n tk
r   |dkrdt f}nNz,| j| }|| |||f|	|
}d|f}W n  tk
r   dt f}Y nX Y nP tk
r   t dt j td	 Y n  tk
r<   dt f}Y nX zDz|| W n2 tk
r~ } z|d
t f W 5 d}~X Y nX W q$ tk
r } z@t dt j t d| t d| |  td W 5 d}~X Y q$X 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=%rrE   #PROXYr:   rF   z$got EOF -- exiting thread serving %rr   rG   zexception in thread serving %rz ... message was %rr   r	   )r   r{   rm   current_threadr   r<   r;   rj   ru   r   KeyErrorrl   AttributeErrorr   r   r   getrY   r   r*   r   fallback_mappingEOFErrorrx   r~   r   r   )r,   connr<   r;   rj   r?   r&   r   identr@   rA   exposed	gettypeidkeZ	second_keZfunctionresr   r   r)   ZridentZrexposedtokenZfallback_funcrC   r   r   r   serve_client   s    (


   $zServer.serve_clientc                 C   s   |S r   r   r,   r   r   r&   r   r   r   fallback_getvalue5  s    zServer.fallback_getvaluec                 C   s   t |S r   rI   r   r   r   r   fallback_str8  s    zServer.fallback_strc                 C   s   t |S r   )reprr   r   r   r   fallback_repr;  s    zServer.fallback_repr)rN   r5   	#GETVALUEc                 C   s   d S r   r   r,   r>   r   r   r   r^   D  s    zServer.dummyc              
   C   s   | j t g }t| j }|  |D ]<}|dkr&|d|| j| t| j| d dd f  q&d|W  5 Q R  S Q R X dS )zO
        Return some info --- useful to spot problems with refcounting
        rb   z  %s:       refcount=%s
    %sr   NK   
)	ro   r$   rk   r"   sortrQ   rI   rj   join)r,   r>   rC   r"   r   r   r   r   r\   G  s    
zServer.debug_infoc                 C   s
   t | jS )z*
        Number of shared objects
        )lenrk   r   r   r   r   r]   W  s    zServer.number_of_objectsc                 C   sL   z:ztd |d W n   ddl}|  Y nX W 5 | j   X dS )z'
        Shutdown this process
        z!manager received shutdown messager:   Nr   N)ru   setr   r{   r;   	traceback	print_exc)r,   r>   r   r   r   r   rX   ^  s    
zServer.shutdownc               	   O   s  t | dkr| ^}}}} n| s(tdnd|krDtdt | d  |d}t | dkr~| ^}}} ddl}|jd	tdd
 nFd|krtdt | d  |d}| ^}} ddl}|jdtdd
 t| } |j |j| \}}}}	|dkr|st | dkrt	d| d }
n
|| |}
|dkr2t
|
}|dk	rlt|ts\td|t|t|t| }dt|
 }td|| |
t||f|j|< ||jkrd|j|< W 5 Q R X ||| |t|fS )z>
        Create a new shared object and return its id
           z8descriptor 'create' of 'Server' object needs an argumentr)   7create expected at least 2 positional arguments, got %dr	      r   Nz2Passing 'typeid' as keyword argument is deprecated)
stacklevelr>   z-Passing 'c' as keyword argument is deprecatedz4Without callable, must have one non-keyword argumentz,Method_to_typeid {0!r}: type {1!s}, not dictz%xz&%r callable returned object with id %r)r   rJ   popwarningswarnDeprecationWarningtuplero   re   rM   rV   rH   dictrK   r   r$   r+   r   r{   r   rj   rk   r_   )r@   rA   r,   r>   r)   r   rP   r   method_to_typeid	proxytyper&   r   r   r   r   rY   k  sp    



 

 





 zServer.createz$($self, c, typeid, /, *args, **kwds)c                 C   s   t | j|j d S )zL
        Return the methods of the shared object indicated by token
        r	   )r   rj   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)rm   r   r   r;   r   )r,   r>   r   r   r   r   rZ     s    

zServer.accept_connectionc                 C   s   | j  z| j|  d7  < W nh tk
r } zJ|| jkrrd| j|< | j| | j|< | j| \}}}td| n|W 5 d }~X Y nX W 5 Q R X d S )Nr	   z&Server re-enabled tracking & INCREF %r)ro   rk   r   rl   rj   r   r{   )r,   r>   r   r   r&   r   r   r   r   r   r_     s    

zServer.increfc              	   C   s   || j kr$|| jkr$td| d S | jZ | j | dkrXtd|| j| | j | | j |  d8  < | j | dkr| j |= W 5 Q R X || j krd| j|< td| | j | j|= W 5 Q R X 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)rk   rl   r   r{   ro   r   rK   rj   )r,   r>   r   r   r   r   r`     s,    
 

zServer.decrefN)r4   r6   r7   r8   r   r-   r   r   r   r   r   r   r   r   r^   r\   r]   rX   rY   __text_signature__r[   rZ   r_   r`   r   r   r   r   rW      s<       
"Q=rW   c                   @   s   e Zd ZdgZdZdZdZdS )Statevaluer   r	   r   N)r4   r6   r7   r9   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 krt  j}|| _t || _t | _tj| j_	|| _
t| \| _| _|pTt | _d S r   )r   rv   rg   _addressrf   _authkeyr   _stater   r   _serializerrh   Z	_Listener_Clientr   _ctx)r,   r*   rg   rp   Z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   rK   rW   	_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
        rg   Nr^   )	rh   r   r   r   rD   r   r   r   r   )r,   rq   rr   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k	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>A  s     z$BaseManager.start.<locals>.<genexpr>-r   r@   Zexitpriority)!r   r   r   r   r   r   r   rK   rP   rJ   r
   ZPiper   ZProcessr   _run_serverr   r   r   r   _processr   Z	_identityr4   r   r   r   r<   r   Finalize_finalize_managerr   rX   )r,   initializerinitargsreaderwriterr   r   r   r   r   (  sH    

   


  zBaseManager.startc           	      C   s^   t  t jt j |dk	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   )	clsre   r*   rg   rp   r   r   r   serverr   r   r   r   S  s    zBaseManager._run_serverc                O   sd   | j jtjkstd| j| j| jd}zt	|dd|f| |\}}W 5 |  X t
|| j||fS )zP
        Create a new shared object; return the token and exposed tuple
        zserver not yet startedr   NrY   )r   r   r   r   r   r   r   r   r   rD   r   )r,   r)   r@   rA   r   r+   r   r   r   r   _createj  s    
zBaseManager._createc                 C   s*   | j dk	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   v  s    

zBaseManager.joinc                 C   s2   | j | j| jd}zt|ddW S |  X dS )zS
        Return some info about the servers shared objects and connections
        r   Nr\   r   r   r   r   rD   r,   r   r   r   r   _debug_info  s    zBaseManager._debug_infoc                 C   s2   | j | j| jd}zt|ddW S |  X dS )z5
        Return the number of shared objects
        r   Nr]   r   r   r   r   r   _number_of_objects  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   rK   r.   r   r   r   	__enter__  s    

zBaseManager.__enter__c                 C   s   |    d S r   )rX   r,   exc_typeZexc_valZexc_tbr   r   r   __exit__  s    zBaseManager.__exit__c                 C   s   |   rtd z,|||d}zt|dd W 5 |  X W n tk
rR   Y nX | jdd |   rtd t| drtd	 |   | jd
d |   rtd t	j
|_ztj|= W n tk
r   Y nX dS )zQ
        Shutdown the manager process; will be registered as a finalizer
        z#sending shutdown message to managerr   NrX   g      ?)r   zmanager still alive	terminatez'trying to `terminate()` manager processg?z#manager still alive after terminate)r   r   r   r   rD   r   r   hasattrr   r   r   r   r   _address_to_localr   )r   r*   rg   r1   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 kr| j | _ dkr"t |p0t dd}|p@t dd}|rt| D ]8\}}t|tksrt	d| t|tksRt	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                   s`   t d | jf||\}} || j| | j|d}| j|j| jd}t|d d|jf |S )Nz)requesting creation of a shared %r objectmanagerrg   r   r   r`   )	r   r{   r   r   r   r   r*   rD   r+   )r,   r@   rA   r   Zexpproxyr   r   r)   r   r   rR     s       z"BaseManager.register.<locals>.temp)__dict__r   copy	AutoProxyr   r$   r!   r   rI   r   r4   setattr)
r   r)   rP   r   r   r   create_methodkeyr   rR   r   r   r   register  s*    

   

zBaseManager.register)NNr   N)Nr   )Nr   )N)NNNNT)r4   r6   r7   r8   r   rW   r   r-   r   r   r   classmethodr   r   r   r   r   r   r   staticmethodr   propertyr*   r  r   r   r   r   r     s8     
	
+   
	



    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>      z*ProcessLocalSet.__init__.<locals>.<lambda>)r   register_after_forkr.   r   r   r   r-     s    zProcessLocalSet.__init__c                 C   s   t | dfS rc   )r   r.   r   r   r   
__reduce__  s    zProcessLocalSet.__reduce__N)r4   r6   r7   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8 t j|jd }|d kr:t t f}|t j|j< W 5 Q R X |d | _|d | _	|| _
| j
j| _|| _|| _t| d | _|| _|d k	rt|| _n"| jd k	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   rh   r   _owned_by_managerr   rf   r   rv   rg   _increfr  _after_fork)	r,   r   rp   r   rg   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   rZ   )r   r{   r   rv   r   rm   r   r   r  r*   r   rD   r  r
   )r,   r   r   r   r   r   _connect-  s    

zBaseProxy._connectr   c                 C   s   z| j j}W n6 tk
rB   tdt j |   | j j}Y nX |	| j
|||f | \}}|dkrp|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   Nr`   )r  r
   r   r   r{   rm   r   r   r  r;   r  r<   r  r   r)   r  r*   r   r   r   rD   r+   r=   )r,   r?   r@   rA   r   rB   rC   r   r   r   r   r   r   r   _callmethod6  s6    
   zBaseProxy._callmethodc                 C   s
   |  dS )z9
        Get a copy of the value of the referent
        r   r  r.   r   r   r   	_getvalueT  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   rD   r  r  addr  r   r   r   _decrefr  Z_close)r,   r   r1   r   r   r   r  Z  s$     
  zBaseProxy._increfc              
   C   s   | | j |d ks |jtjkrz2td| j || j|d}t|d d| jf W q t	k
r } ztd| W 5 d }~X Y qX ntd| j |st
|drtdt j |j  |`d S )Nz	DECREF %rr   r`   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*   rD   r   r   rm   r   r   r
   r   )r   rg   r1   ZtlsZidsetr   r   r   r   r   r   r!  n  s     
zBaseProxy._decrefc              
   C   sH   d | _ z|   W n0 tk
rB } ztd|  W 5 d }~X Y nX d S )Nzincref failed: %s)r  r  r   r   r   )r,   r   r   r   r   r    s
    zBaseProxy._after_forkc                 C   s^   i }t  d k	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 )Nrg   _isautoFr   )	r   r   r   r   RebuildProxyr  r  r   r   r,   rA   r   r   r   r    s    


zBaseProxy.__reduce__c                 C   s   |   S r   )r  )r,   Z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   r4   r  r)   r+   r.   r   r   r   r5     s    zBaseProxy.__repr__c                 C   s:   z|  dW S  tk
r4   t| dd d  Y S X dS )zV
        Return representation of the referent (or a fall-back if that fails)
        r5   Nr  z; '__str__()' failed>)r  r   r   r.   r   r   r   rN     s    zBaseProxy.__str__)NNNTF)r4   r6   r7   r8   r   r   ZForkAwareThreadLockr  r-   r  r  r  r  r  r!  r  r  r&  r5   rN   r   r   r   r   r     s(           
)	
c                 C   s   t t dd}|rT|j|jkrTtd| d|d< |j|jkrT|j|j |j|j< |	ddopt t dd }| ||fd|i|S )	z5
    Function used for unpickling proxy objects.
    rw   Nz*Rebuild a proxy owned by manager, token=%rTr  r_   Z_inheritingF)
r   r   rv   r*   r   r{   r+   rl   rj   r   )rS   r   rp   rA   r   r_   r   r   r   r$    s    

r$  c                 C   sp   t |}z|| |f W S  tk
r*   Y nX i }|D ]}td||f | q4t| 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dicZmeth	ProxyTyper   r   r   MakeProxyType  s     r*  c           
      C   s   t | d }|dkrB|| j|d}zt|dd| f}W 5 |  X |dkrX|dk	rX|j}|dkrjt j}td| j	 |}|| ||||d}	d|	_
|	S )z*
    Return an auto-proxy for `token`
    r	   Nr   r[   zAutoProxy[%s])r   rg   r_   T)rh   r*   r   rD   r   r   rv   rg   r*  r)   r#  )
r   rp   r   rg   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 )NrU   z%s=%rz%s(%s)z, )	r$   r   r!   
startswithrQ   r   r3   r4   r   )r,   r!   rR   r   r   r   r   r   r5     s    
zNamespace.__repr__N)r4   r6   r7   r-   r5   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   r0  r.   r   r   r   r     s    z	Value.getc                 C   s
   || _ d S r   r2  r,   r   r   r   r   r   
  s    z	Value.setc                 C   s   dt | j| j| jf S )Nz
%s(%r, %r))r   r4   r/  r0  r.   r   r   r   r5     s    zValue.__repr__N)T)	r4   r6   r7   r-   r   r   r5   r  r   r   r   r   r   r.    s
   
r.  c                 C   s   t  | |S r   )r   )r   sequencer1  r   r   r   Array  s    r5  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 )Nr7  r  r,   r@   r   r   r   r7    s    zIteratorProxy.__next__c                 G   s   |  d|S )Nr;   r  r:  r   r   r   r;     s    zIteratorProxy.sendc                 G   s   |  d|S )Nr8  r  r:  r   r   r   r8    s    zIteratorProxy.throwc                 G   s   |  d|S )Nr   r  r:  r   r   r   r   !  s    zIteratorProxy.closeN)	r4   r6   r7   r   r9  r7  r;   r8  r   r   r   r   r   r6    s   r6  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 kr|fn||f}|  d|S Nr<  r  )r,   Zblockingr   r@   r   r   r   r<  '  s    zAcquirerProxy.acquirec                 C   s
   |  dS Nr=  r  r.   r   r   r   r=  *  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)r4   r6   r7   r   r<  r=  r   r   r   r   r   r   r;  %  s
   
r;  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)r<  r=  r   notify
notify_allNc                 C   s   |  d|fS Nr   r  r   r   r   r   r   4  s    zConditionProxy.waitr	   c                 C   s   |  d|fS )NrA  r  )r,   nr   r   r   rA  6  s    zConditionProxy.notifyc                 C   s
   |  dS )NrB  r  r.   r   r   r   rB  8  s    zConditionProxy.notify_allc                 C   sd   | }|r|S |d k	r$t  | }nd }d }|s`|d k	rN|t   }|dkrNq`| | | }q,|S )Nr   )time	monotonicr   )r,   Z	predicater   rC   ZendtimeZwaittimer   r   r   wait_for:  s    
zConditionProxy.wait_for)N)r	   )N)r4   r6   r7   r   r   rA  rB  rG  r   r   r   r   r@  2  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   O  s    zEventProxy.is_setc                 C   s
   |  dS Nr   r  r.   r   r   r   r   Q  s    zEventProxy.setc                 C   s
   |  dS )Nr
  r  r.   r   r   r   r
  S  s    zEventProxy.clearNc                 C   s   |  d|fS rC  r  r   r   r   r   r   U  s    zEventProxy.wait)N)r4   r6   r7   r   r   r   r
  r   r   r   r   r   rH  M  s
   rH  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 rC  r  r   r   r   r   r   [  s    zBarrierProxy.waitc                 C   s
   |  dS )NrL  r  r.   r   r   r   rL  ]  s    zBarrierProxy.abortc                 C   s
   |  dS )NrM  r  r.   r   r   r   rM  _  s    zBarrierProxy.resetc                 C   s   |  ddS )NrK  )partiesr  r.   r   r   r   rN  a  s    zBarrierProxy.partiesc                 C   s   |  ddS )NrK  )	n_waitingr  r.   r   r   r   rO  d  s    zBarrierProxy.n_waitingc                 C   s   |  ddS )NrK  )brokenr  r.   r   r   r   rP  g  s    zBarrierProxy.broken)N)r4   r6   r7   r   r   rL  rM  r  rN  rO  rP  r   r   r   r   rJ  Y  s   


rJ  c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	NamespaceProxy)rK  __setattr____delattr__c                 C   s0   |d dkrt | |S t | d}|d|fS )Nr   rU   r  rK  )objectrK  r,   r  
callmethodr   r   r   __getattr__n  s    zNamespaceProxy.__getattr__c                 C   s4   |d dkrt | ||S t | d}|d||fS )Nr   rU   r  rR  )rT  rR  rK  )r,   r  r   rV  r   r   r   rR  s  s    zNamespaceProxy.__setattr__c                 C   s0   |d dkrt | |S t | d}|d|fS )Nr   rU   r  rS  )rT  rS  rK  rU  r   r   r   rS  x  s    zNamespaceProxy.__delattr__N)r4   r6   r7   r   rW  rR  rS  r   r   r   r   rQ  l  s   rQ  c                   @   s*   e Zd ZdZdd Zdd ZeeeZdS )
ValueProxy)r   r   c                 C   s
   |  dS )Nr   r  r.   r   r   r   r     s    zValueProxy.getc                 C   s   |  d|fS rI  r  r3  r   r   r   r     s    zValueProxy.setN)r4   r6   r7   r   r   r   r  r   r   r   r   r   rX    s   rX  BaseListProxy)__add____contains____delitem____getitem____len____mul____reversed____rmul____setitem__rQ   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 )Nrd  r  r3  r   r   r   __iadd__  s    zListProxy.__iadd__c                 C   s   |  d|f | S )Nri  r  r3  r   r   r   ri    s    zListProxy.__imul__N)r4   r6   r7   rk  ri  r   r   r   r   rj    s   rj  	DictProxy)r[  r\  r]  r9  r^  rb  r
  r   r   r!   r"   r   popitem
setdefaultr,  r#   r9  Iterator
ArrayProxy)r^  r]  rb  	PoolProxy)Zapplyapply_asyncr   imapimap_unorderedr   map	map_asyncstarmapstarmap_asyncr   ZAsyncResult)rr  rv  rx  rs  rt  c                   @   s   e Zd Zdd Zdd ZdS )rq  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)r4   r6   r7   r   r   r   r   r   r   rq    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)r4   r6   r7   r8   r   r   r   r   r     s   QueueZJoinableQueuert   rn   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  rQ   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  rg  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{   r3   r4   r   r  r.   r   r   r   __del__  s    z_SharedMemoryTracker.__del__c                 C   s   | j | jfS r   r  r.   r   r   r   r/     s    z!_SharedMemoryTracker.__getstate__c                 C   s   | j |  d S r   )r-   r0   r   r   r   r2     s    z!_SharedMemoryTracker.__setstate__N)r4   r6   r7   r8   r-   r  r  r  r  r/   r2   r   r   r   r   r    s   	r  c                   @   sR   e Zd Zejdddg Zdd Zdd Zde_d	d
 Zdd Z	dd Z
dd ZdS )SharedMemoryServertrack_segmentrelease_segmentlist_segmentsc                 O   sZ   t j| f|| | j}t|tr,t|}td| dt  | _	t
dt   d S )NZshm_rU   z"SharedMemoryServer started by pid )rW   r-   r*   rH   rd   osfsdecoder  r   shared_memory_contextr   r{   )r,   r@   kwargsr*   r   r   r   r-   
  s    

zSharedMemoryServer.__init__c                  O   st   t | dkr| d }n4d|kr(|d }n"| s6tdntdt | d  ttj| d drhtj|d	< tj| |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   r   r)   zDdescriptor 'create' of 'SharedMemoryServer' object needs an argumentr   r	   r  Z_shared_memory_proxyr  )r   rJ   r   r,   re   r  rW   rY   )r@   r  Ztypeodr)   r   r   r   rY     s    




zSharedMemoryServer.createz&($self, c, typeid, /, *args, **kwargs)c                 C   s   | j   t| |S )zACall unlink() on all tracked shared memory, terminate the Server.)r  r  rW   rX   r   r   r   r   rX   )  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  2  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  7  s    z SharedMemoryServer.list_segmentsN)r4   r6   r7   rW   r   r-   rY   r   rX   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   sN   t jdkrddlm} |  tj| f|| t| j	j
 dt   d S )Nposixr	   )resource_trackerz created by pid )r  r    r  Zensure_runningr   r-   r   r{   r3   r4   r   )r,   r@   r  r  r   r   r   r-   I  s
    
zSharedMemoryManager.__init__c                 C   s   t | jj dt   d S )Nz.__del__ by pid )r   r{   r3   r4   r   r.   r   r   r   r  U  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   rK   r   r   r   r   r   r.   r   r   r   r   Y  s    

 zSharedMemoryManager.get_serverc                 C   sx   | j | j| jd\}tjdd|d}zt|dd|jf W n. tk
rh } z|  |W 5 d}~X Y nX W 5 Q R X |S )zoReturns a new SharedMemory instance with the specified size in
            bytes, to be tracked by the manager.r   NT)rY   sizer  )	r   r   r   r   r  rD   r   BaseExceptionr  )r,   r  r   Zsmsr   r   r   r   r  f  s     z SharedMemoryManager.SharedMemoryc                 C   sv   | j | j| jdZ}t|}zt|dd|jjf W n0 tk
rf } z|j	  |W 5 d}~X Y nX W 5 Q R X |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   ShareableListrD   Zshmr   r  r  )r,   r4  r   Zslr   r   r   r   r  r  s    

 z!SharedMemoryManager.ShareableListN)r4   r6   r7   r8   r  r   r-   r  r   r  r  r   r   r   r   r   =  s   	)NNNT)T)S__all__rx   rm   r   r   ZqueuerE  r  r   r   r   r  r
   contextr   r   r   r   r   r   r   r   Z	HAS_SHMEMImportErrorr   r  Z
view_typesr$   r'   Z	view_typerT  r   rD   r=   r   rL   rT   rV   rW   r   rq   rr   ZXmlListenerZ	XmlClientrh   r   r   r	  r   r$  r*  r  r+  r.  r5  r6  r;  r@  rH  rJ  rQ  rX  rY  rj  rl  r   rp  ZBasePoolProxyrq  r   ry  rt   rn   rz  r{  r|  r}  r~  r  r   r  r  r   r   r   r   r   <module>   s   


  c

	 w
 4    

	
	
 



%8