B
    ^ c                 @   s  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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 dd Zeeje dd dD Zed ek	rdd ZxeD ]Zeee qW 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Z*d*d+ Z+i fd,d-Z,ddd/d0Z-G d1d2 d2eZ.G d3d4 d4eZ/ded5d6Z0G d7d8 d8e*Z1G d9d: d:e*Z2G d;d< d<e2Z3G d=d> d>e*Z4G d?d@ d@e*Z5G dAdB dBe*Z6G dCdD dDe*Z7e,dEdFZ8G dGdH dHe8Z9e,dIdJZ:dKdLie:_;e,dMdNZ<e,dOdPZ=dQdQdQdLdLdRe=_;G dSdO dOe=Z>G dTd de'Z?e?dUej@ e?dVej@ e?dWejAe4 e?dXejBe2 e?dYejCe2 e?dZejDe2 e?d[ejEe2 e?d\ejFe3 e?d]ejGe5 e?d^ejHe> e?d_ee9 e?d`eIe: e?d4e/e7 e?d6e0e< e?d2e.e6 e?jdLe1dadb e?jdQdadc dS )fBaseManagerSyncManager	BaseProxyToken    N)
format_exc   )
connection)	reductionget_spawning_popenProcessError)pool)process)util)get_contextc             C   s   t j | j|  ffS )N)arraytypecodetobytes)a r   )lib/python3.7/multiprocessing/managers.pyreduce_array$   s    r   c             C   s   g | ]}t ti | qS r   )typegetattr).0namer   r   r   
<listcomp>(   s    r   )itemskeysvaluesc             C   s   t t | ffS )N)list)objr   r   r   rebuild_as_list*   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 )N)r"   r#   r$   )selfr"   r#   r$   r   r   r   __init__9   s    zToken.__init__c             C   s   | j | j| jfS )N)r"   r#   r$   )r%   r   r   r   __getstate__<   s    zToken.__getstate__c             C   s   |\| _ | _| _d S )N)r"   r#   r$   )r%   stater   r   r   __setstate__?   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__B   s    zToken.__repr__N)	r+   
__module____qualname____doc__	__slots__r&   r'   r)   r,   r   r   r   r   r   3   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
    z#RETURNN)sendrecvconvert_to_error)cr$   
methodnameargskwdskindresultr   r   r   dispatchJ   s
    r:   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 )Nz#ERROR)z
#TRACEBACKz#UNSERIALIZABLEz.Result {0!r} (kind '{1}') type is {2}, not strz#UNSERIALIZABLEzUnserializable message: %s
zUnrecognized message type {!r})
isinstancestr	TypeErrorformatr   RemoteError
ValueError)r8   r9   r   r   r   r3   T   s    

r3   c               @   s   e Zd Zdd ZdS )r?   c             C   s   dt | jd  d S )NzM
---------------------------------------------------------------------------
r   zK---------------------------------------------------------------------------)r<   r6   )r%   r   r   r   __str__d   s    zRemoteError.__str__N)r+   r-   r.   rA   r   r   r   r   r?   c   s   r?   c             C   s6   g }x,t | D ] }t| |}t|r|| qW |S )z4
    Return a list of names of methods of `obj`
    )dirr   callableappend)r    tempr   funcr   r   r   all_methodsk   s    
rG   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   s    z"public_methods.<locals>.<listcomp>)rG   )r    r   r   r   public_methodsv   s    rI   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&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   )r;   bytesr=   r>   r   registryr   AuthenticationStringauthkeylistener_clientlistenerr#   	id_to_objid_to_refcountid_to_local_proxy_obj	threadingLockmutex)r%   rW   r#   rY   
serializerListenerClientr   r   r   r&      s    


zServer.__init__c          	   C   s   t  | _| t _zZt j| jd}d|_|	  y x| j
 sN| jd q6W W n ttfk
rj   Y nX W dtjtjkrtd tjt_tjt_td X dS )z(
        Run the server forever
        )targetTr   Nzresetting stdout, stderrr   )r_   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%   rk   r   r   r   serve_forever   s     



zServer.serve_foreverc             C   sP   xJy| j  }W n tk
r&   wY nX tj| j|fd}d|_|  qW d S )N)re   r6   T)r[   ZacceptOSErrorr_   rj   handle_requestrl   rm   )r%   r4   tr   r   r   rk      s    zServer.accepterc             C   sL  d } }}yTt || j t || j | }|\}}}}|| jksTtd| t| |}W n tk
r~   dt	 f}	Y n>X y||f||}W n tk
r   dt	 f}	Y n
X d|f}	y|
|	 W nt tk
r> }
 zTy|
dt	 f W n tk
r   Y nX td|	 td| td|
 W dd}
~
X Y nX |  dS )z)
        Handle a new connection
        Nz%r unrecognizedz
#TRACEBACKz#RETURNzFailure to send message: %rz ... request was %rz ... exception was %r)r   Zdeliver_challengerY   Zanswer_challenger2   publicAssertionErrorr   	Exceptionr   r1   r   infoclose)r%   r4   funcnamer9   requestignorer6   r7   rF   msger   r   r   r{      s4    zServer.handle_requestc             C   s  t dt j |j}|j}| j}x| j	 syBd }}| }|\}}}	}
y|| \}}}W n^ t
k
r } z@y| j| \}}}W n& t
k
r } z|W dd}~X Y nX W dd}~X Y nX ||krtd|t||f t||}y||	|
}W n, tk
r& } zd|f}W dd}~X Y nPX |o8||d}|rn| |||\}}t|| j|}d||ff}nd|f}W n tk
r   |dkrdt f}nNy,| 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 yDy|| W n2 tk
r } z|d
t f W dd}~X Y nX W q( tk
r } z@t dt j t d| t d| |  td W dd}~X Y q(X q(W 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=%rz#ERRORz#PROXYz#RETURNz
#TRACEBACKz$got EOF -- exiting thread serving %rr   z#UNSERIALIZABLEzexception in thread serving %rz ... message was %rz ... exception was %rr   )r   ru   r_   current_threadr   r2   r1   r\   rg   rn   KeyErrorr^   AttributeErrorr   r   r   getrL   r   r#   r   fallback_mappingEOFErrorrr   rx   r   r   )r%   connr2   r1   r\   r5   r    r   identr6   r7   exposed	gettypeidkeZ	second_keZfunctionZresr   r   r"   ZridentZrexposedtokenZfallback_funcr9   r   r   r   serve_client   sx    (


$zServer.serve_clientc             C   s   |S )Nr   )r%   r   r   r    r   r   r   fallback_getvalue,  s    zServer.fallback_getvaluec             C   s   t |S )N)r<   )r%   r   r   r    r   r   r   fallback_str/  s    zServer.fallback_strc             C   s   t |S )N)repr)r%   r   r   r    r   r   r   fallback_repr2  s    zServer.fallback_repr)rA   r,   z	#GETVALUEc             C   s   d S )Nr   )r%   r4   r   r   r   rQ   ;  s    zServer.dummyc          
   C   s|   | j l g }t| j }|  xD|D ]<}|dkr(|d|| j| t| j| d dd f  q(W d|S Q R X dS )zO
        Return some info --- useful to spot problems with refcounting
        rU   z  %s:       refcount=%s
    %sr   NK   
)	ra   r   r]   r   sortrD   r<   r\   join)r%   r4   r9   r   r   r   r   r   rO   >  s    

$zServer.debug_infoc             C   s
   t | jS )z*
        Number of shared objects
        )lenr]   )r%   r4   r   r   r   rP   N  s    zServer.number_of_objectsc             C   sL   z:yt d |d W n   ddl}|  Y nX W d| j  X dS )z'
        Shutdown this process
        z!manager received shutdown message)z#RETURNNr   N)r   ru   r1   	traceback	print_excrg   set)r%   r4   r   r   r   r   rK   U  s    
zServer.shutdownc           	   O   s  t | dkr| ^}}}} nz| s(tdnld|krDtdt | d  |d}t | dkrf| ^}}} n.d|krtdt | d  |d}| ^}} t| } |j |j| \}}}}|dkr|st | dkrtd	| d
 }	n
|| |}	|dkrt|	}|dk	r4t|t	s$td
|t|t|t| }dt|	 }
td||
 |	t||f|j|
< |
|jkrxd
|j|
< W dQ R X |||
 |
t|fS )z>
        Create a new shared object and return its id
           z8descriptor 'create' of 'Server' object needs an argumentr"   z7create expected at least 2 positional arguments, got %dr      r4   Nz4Without 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)r   r=   poptuplera   rW   r@   rI   r;   dictr>   r   r   r$   r   ru   r   r\   r]   rR   )r6   r7   r%   r4   r"   rC   r   method_to_typeid	proxytyper    r   r   r   r   rL   b  sN    





zServer.createc             C   s   t | j|j d S )zL
        Return the methods of the shared object indicated by token
        r   )r   r\   r$   )r%   r4   r   r   r   r   rN     s    zServer.get_methodsc             C   s"   |t  _|d | | dS )z=
        Spawn a new thread to serve this connection
        )z#RETURNNN)r_   r   r   r1   r   )r%   r4   r   r   r   r   rM     s    

zServer.accept_connectionc             C   s   | j  y| j|  d7  < W nh tk
r } zJ|| jkrrd| j|< | j| | j|< | j| \}}}td| n|W d d }~X Y nX W d Q R X d S )Nr   z&Server re-enabled tracking & INCREF %r)ra   r]   r   r^   r\   r   ru   )r%   r4   r   r   r    r   r   r   r   r   rR     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 d Q R X || j krd| j|< td| | j | j|= W d 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)r]   r^   r   ru   ra   r~   r>   r\   )r%   r4   r   r   r   r   rS     s$    




zServer.decrefN)r+   r-   r.   r/   r}   r&   ry   rk   r{   r   r   r   r   r   rQ   rO   rP   rK   rL   rN   rM   rR   rS   r   r   r   r   rJ      s.   
"Q8rJ   c               @   s   e Zd ZdgZdZdZdZdS )Statevaluer   r   r   N)r+   r-   r.   r0   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 )N)r   rh   rY   _addressrX   _authkeyr   _stater   r   _serializerrZ   Z	_Listener_Clientr   _ctx)r%   r#   rY   rb   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
        zAlready started serverzManager has shut downzUnknown state {!r})r   r   r   r   r   r   r   r>   rJ   	_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
        )rY   NrQ   )	rZ   r   r   r   r:   r   r   r   r   )r%   rc   rd   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
        zAlready started serverzManager has shut downzUnknown state {!r}Nzinitializer must be a callableF)Zduplex)re   r6   :c             s   s   | ]}t |V  qd S )N)r<   )r   ir   r   r   	<genexpr>1  s    z$BaseManager.start.<locals>.<genexpr>-r   )r6   exitpriority)!r   r   r   r   r   r   r   r>   rC   r=   r   ZPiper   ZProcessr   _run_serverr   r   r   r   _processr   Z	_identityr+   r   rm   r   r2   r   Finalize_finalize_managerr   rK   )r%   initializerinitargsreaderwriterr   r   r   r   rm     s4    






zBaseManager.startc       	      C   sN   |dk	r||  |  ||||}||j |  td|j |  dS )z@
        Create a server, report its address and run it
        Nzmanager serving at %r)_Serverr1   r#   r   r   r   ry   )	clsrW   r#   rY   rb   r   r   r   serverr   r   r   r   C  s    zBaseManager._run_serverc              O   sv   | ^}}} t | } |jjtjks(td|j|j|jd}zt	|dd|f|  |\}}W d|
  X t||j||fS )zP
        Create a new shared object; return the token and exposed tuple
        zserver not yet started)rY   NrL   )r   r   r   r   r   r~   r   r   r   r:   r   r   )r6   r7   r%   r"   r   r$   r   r   r   r   _createW  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   f  s    

zBaseManager.joinc             C   s.   | j | j| jd}zt|ddS |  X dS )zS
        Return some info about the servers shared objects and connections
        )rY   NrO   )r   r   r   r:   r   )r%   r   r   r   r   _debug_infoo  s    zBaseManager._debug_infoc             C   s.   | j | j| jd}zt|ddS |  X dS )z5
        Return the number of shared objects
        )rY   NrP   )r   r   r   r:   r   )r%   r   r   r   r   _number_of_objectsy  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 serverzManager has shut downzUnknown state {!r})	r   r   r   r   rm   r   r   r   r>   )r%   r   r   r   	__enter__  s    

zBaseManager.__enter__c             C   s   |    d S )N)rK   )r%   exc_typeexc_valexc_tbr   r   r   __exit__  s    zBaseManager.__exit__c             C   s   |   rtd y,|||d}zt|dd W d|  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
|_y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 manager)rY   NrK   g      ?)r   zmanager still alive	terminatez'trying to `terminate()` manager processg?z#manager still alive after terminate)r   r   r   r:   r   r   r   hasattrr   r   r   r   r   _address_to_localr   )r   r#   rY   r(   r   r   r   r   r   r     s.    




zBaseManager._finalize_managerc             C   s   | j S )N)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}|rxHt| D ]8\}}t|tkstt	d| t|tksTt	d| qTW ||| 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)managerrY   r   )rY   rS   )	r   ru   r   r   r   r   r#   r:   r$   )r%   r6   r7   r   Zexpproxyr   )r   r"   r   r   rE     s    z"BaseManager.register.<locals>.temp)__dict__r   copy	AutoProxyr   r   r   r   r<   r~   r+   setattr)
r   r"   rC   r   r   r   create_methodkeyr   rE   r   )r   r"   r   register  s     

zBaseManager.register)NNr   N)Nr   )Nr   )N)NNNNT)r+   r-   r.   r/   r   rJ   r   r&   r   r   rm   classmethodr   r   r   r   r   r   r   staticmethodr   propertyr#   r   r   r   r   r   r     s*    
	
+
	

  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 )N)clear)r    r   r   r   <lambda>      z*ProcessLocalSet.__init__.<locals>.<lambda>)r   register_after_fork)r%   r   r   r   r&     s    zProcessLocalSet.__init__c             C   s   t | dfS )Nr   )r   )r%   r   r   r   
__reduce__  s    zProcessLocalSet.__reduce__N)r+   r-   r.   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 d 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   rZ   r   _owned_by_managerr   rX   r   rh   rY   _increfr   _after_fork)	r%   r   rb   r   rY   r   rR   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|)rY   rM   )r   ru   r   rh   r   r_   r   r   r   r#   r   r:   r   r   )r%   r   r   r   r   r   _connect  s    

zBaseProxy._connectr   c             C   s   y| 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 connectionz#RETURNz#PROXY)r   rY   r   )rY   NrS   )r   r   r   r   ru   r_   r   r   r   r1   r   r2   r   r   r"   r   r#   r   r   r   r:   r$   r3   )r%   r5   r6   r7   r   r8   r9   r   r   r   r   r   r   r   _callmethod&  s,    

zBaseProxy._callmethodc             C   s
   |  dS )z9
        Get a copy of the value of the referent
        z	#GETVALUE)r   )r%   r   r   r   	_getvalueD  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 %r)rY   rR   z	INCREF %r
   )r6   r   )r   r   ru   r   r$   r   r#   r   r:   r   r   addr   r   r   r   _decrefr   Z_close)r%   r   r(   r   r   r   r   J  s    
zBaseProxy._increfc          
   C   s   | | j |d ks |jtjkry2td| j || j|d}t|d d| jf W q t	k
r } ztd| W d d }~X Y qX ntd| j |st
|drtdt j |j  |`d S )Nz	DECREF %r)rY   rS   z... decref failed %sz%DECREF %r -- manager already shutdownr   z-thread %r has no more proxies so closing conn)discardr$   r   r   r   r   ru   r#   r:   r   r   r_   r   r   r   r   )r   rY   r(   ZtlsZidsetr   r   r   r   r   r   r   ^  s     
zBaseProxy._decrefc          
   C   sH   d | _ y|   W n0 tk
rB } ztd|  W d d }~X Y nX d S )Nzincref failed: %s)r   r   r   r   r   )r%   r   r   r   r   r   w  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 )NrY   _isautoFr   )	r
   r   r   r   RebuildProxyr   r   r   r   )r%   r7   r   r   r   r     s    


zBaseProxy.__reduce__c             C   s   |   S )N)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   r+   r   r"   r$   )r%   r   r   r   r,     s    zBaseProxy.__repr__c             C   s4   y
|  dS  tk
r.   t| dd d S X dS )zV
        Return representation of the referent (or a fall-back if that fails)
        r,   Nr   z; '__str__()' failed>)r   r   r   )r%   r   r   r   rA     s    
zBaseProxy.__str__)NNNTF)r+   r-   r.   r/   r   r   ZForkAwareThreadLockr   r&   r   r   r   r   r   r   r   r   r   r,   rA   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.
    ri   Nz*Rebuild a proxy owned by manager, token=%rTr   rR   Z_inheritingF)
r   r   rh   r#   r   ru   r$   r^   r\   r   )rF   r   rb   r7   r   rR   r   r   r   r     s    r   c             C   sr   t |}y|| |f S  tk
r(   Y nX i }x|D ]}td||f | q4W t| tf|}||_||| |f< |S )zB
    Return a proxy type whose methods are given by `exposed`
    zLdef %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  Tc       
      C   s   t | d }|dkrB|| j|d}zt|dd| f}W d|  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   N)rY   rN   zAutoProxy[%s])r   rY   rR   T)rZ   r#   r:   r   r   r   rh   rY   r  r"   r   )
r   rb   r   rY   r   rR   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 )N)r   update)r%   r7   r   r   r   r&     s    zNamespace.__init__c             C   s^   t | j }g }x,|D ]$\}}|ds|d||f  qW |  d| jjd|f S )NrH   z%s=%rz%s(%s)z, )	r   r   r   
startswithrD   r   r*   r+   r   )r%   r   rE   r   r   r   r   r   r,     s    
zNamespace.__repr__N)r+   r-   r.   r&   r,   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 )N)	_typecode_value)r%   r   r   lockr   r   r   r&     s    zValue.__init__c             C   s   | j S )N)r  )r%   r   r   r   r     s    z	Value.getc             C   s
   || _ d S )N)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   r+   r  r  )r%   r   r   r   r,     s    zValue.__repr__N)T)	r+   r-   r.   r&   r   r   r,   r   r   r   r   r   r   r    s
   
r  c             C   s   t  | |S )N)r   )r   Zsequencer	  r   r   r   Array   s    r
  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__r1   throwr   c             C   s   | S )Nr   )r%   r   r   r   __iter__	  s    zIteratorProxy.__iter__c             G   s   |  d|S )Nr  )r   )r%   r6   r   r   r   r    s    zIteratorProxy.__next__c             G   s   |  d|S )Nr1   )r   )r%   r6   r   r   r   r1     s    zIteratorProxy.sendc             G   s   |  d|S )Nr  )r   )r%   r6   r   r   r   r    s    zIteratorProxy.throwc             G   s   |  d|S )Nr   )r   )r%   r6   r   r   r   r     s    zIteratorProxy.closeN)	r+   r-   r.   r   r  r  r1   r  r   r   r   r   r   r    s   r  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   r6   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 )Nr  )r   )r%   r   r   r   r     s    zAcquirerProxy.__enter__c             C   s
   |  dS )Nr  )r   )r%   r   r   r   r   r   r   r     s    zAcquirerProxy.__exit__)TN)r+   r-   r.   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  ro   notify
notify_allNc             C   s   |  d|fS )Nro   )r   )r%   r   r   r   r   ro   $  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   sh   | }|r|S |d k	r$t  | }nd }d }x6|sb|d k	rP|t   }|dkrPP | | | }q.W |S )Nr   )timeZ	monotonicro   )r%   Z	predicater   r9   ZendtimeZwaittimer   r   r   wait_for*  s    

zConditionProxy.wait_for)N)r   )N)r+   r-   r.   r   ro   r  r  r  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)rn   r   r   ro   c             C   s
   |  dS )Nrn   )r   )r%   r   r   r   rn   ?  s    zEventProxy.is_setc             C   s
   |  dS )Nr   )r   )r%   r   r   r   r   A  s    zEventProxy.setc             C   s
   |  dS )Nr   )r   )r%   r   r   r   r   C  s    zEventProxy.clearNc             C   s   |  d|fS )Nro   )r   )r%   r   r   r   r   ro   E  s    zEventProxy.wait)N)r+   r-   r.   r   rn   r   r   ro   r   r   r   r   r  =  s
   r  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__ro   abortresetNc             C   s   |  d|fS )Nro   )r   )r%   r   r   r   r   ro   K  s    zBarrierProxy.waitc             C   s
   |  dS )Nr  )r   )r%   r   r   r   r  M  s    zBarrierProxy.abortc             C   s
   |  dS )Nr  )r   )r%   r   r   r   r  O  s    zBarrierProxy.resetc             C   s   |  ddS )Nr  )parties)r   )r%   r   r   r   r  Q  s    zBarrierProxy.partiesc             C   s   |  ddS )Nr  )	n_waiting)r   )r%   r   r   r   r  T  s    zBarrierProxy.n_waitingc             C   s   |  ddS )Nr  )broken)r   )r%   r   r   r   r  W  s    zBarrierProxy.broken)N)r+   r-   r.   r   ro   r  r  r   r  r  r  r   r   r   r   r  I  s   
r  c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	NamespaceProxy)r  __setattr____delattr__c             C   s0   |d dkrt | |S t | d}|d|fS )Nr   rH   r   r  )objectr  )r%   r   
callmethodr   r   r   __getattr__^  s    zNamespaceProxy.__getattr__c             C   s4   |d dkrt | ||S t | d}|d||fS )Nr   rH   r   r!  )r#  r!  r  )r%   r   r   r$  r   r   r   r!  c  s    zNamespaceProxy.__setattr__c             C   s0   |d dkrt | |S t | d}|d|fS )Nr   rH   r   r"  )r#  r"  r  )r%   r   r$  r   r   r   r"  h  s    zNamespaceProxy.__delattr__N)r+   r-   r.   r   r%  r!  r"  r   r   r   r   r   \  s   r   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   q  s    zValueProxy.getc             C   s   |  d|fS )Nr   )r   )r%   r   r   r   r   r   s  s    zValueProxy.setN)r+   r-   r.   r   r   r   r   r   r   r   r   r   r&  o  s   r&  BaseListProxy)__add____contains____delitem____getitem____len____mul____reversed____rmul____setitem__rD   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 )Nr2  )r   )r%   r   r   r   r   __iadd__  s    zListProxy.__iadd__c             C   s   |  d|f | S )Nr7  )r   )r%   r   r   r   r   r7    s    zListProxy.__imul__N)r+   r-   r.   r9  r7  r   r   r   r   r8  ~  s   r8  	DictProxy)r)  r*  r+  r  r,  r0  r   r   r   r   r   r   popitem
setdefaultr  r   r  Iterator
ArrayProxy)r,  r+  r0  	PoolProxy)Zapplyapply_asyncr   imapimap_unorderedr   map	map_asyncstarmapstarmap_asyncr   ZAsyncResult)r@  rD  rF  rA  rB  c               @   s   e Zd Zdd Zdd ZdS )r?  c             C   s   | S )Nr   )r%   r   r   r   r     s    zPoolProxy.__enter__c             C   s   |    d S )N)r   )r%   r   r   r   r   r   r   r     s    zPoolProxy.__exit__N)r+   r-   r.   r   r   r   r   r   r   r?    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)r+   r-   r.   r/   r   r   r   r   r     s   	QueueZJoinableQueuerf   r`   RLock	SemaphoreBoundedSemaphore	ConditionBarrierPoolr   r   F)r   r   )r   )NNNT)T)J__all__rr   r_   r   Zqueuer  r   r    r   contextr	   r
   r   r   r   r   r   r   r   Z
view_typesr   r!   Z	view_typer#  r   r:   r3   r   r?   rG   rI   rJ   r   rc   rd   ZXmlListenerZ	XmlClientrZ   r   r   r   r   r   r  r   r  r  r
  r  r  r  r  r  r   r&  r'  r8  r:  r   r>  ZBasePoolProxyr?  r   rG  rf   r`   rH  rI  rJ  rK  rL  rM  r   r   r   r   r   <module>   s   


  \
 w
 4 

		



