509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3

  \•  ã               @   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 dd
lmZ ddlmZ ddlmZ ddlmZ dd„ Zejejeƒ dd„ d†D ƒZed ek	rÞdd„ ZxeD ]Zejeeƒ qÊW G dd„ deƒZf 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+d‡d0d1„Z,G d2d3„ d3eƒZ-G d4d5„ d5eƒZ.dˆd6d7„Z/G d8d9„ d9e)ƒZ0G d:d;„ d;e)ƒZ1G d<d=„ d=e1ƒZ2G d>d?„ d?e)ƒZ3G d@dA„ dAe)ƒZ4G dBdC„ dCe)ƒZ5G dDdE„ dEe)ƒZ6e+dFd‰ƒZ7G dZd[„ d[e7ƒZ8e+d\dŠƒZ9d]deie9_:e+dfd‹ƒZ;e+dgdŒƒZ<dsdsdsdededtœe<_:G dudg„ dge<ƒZ=G dvd„ de&ƒZ>e>jdwej?ƒ e>jdxej?ƒ e>jdyej@e3ƒ e>jdzejAe1ƒ e>jd{ejBe1ƒ e>jd|ejCe1ƒ e>jd}ejDe1ƒ e>jd~ejEe2ƒ e>jdejFe4ƒ e>jd€ejGe=ƒ e>jd�ee8ƒ e>jd‚eHe9ƒ e>jd5e.e6ƒ e>jd7e/e;ƒ e>jd3e-e5ƒ e>jdee0dƒd„� e>jdsdƒd…� dS )�ÚBaseManagerÚSyncManagerÚ	BaseProxyÚTokené    N)Ú
format_excé   )Ú
connection)Ú	reductionÚget_spawning_popen)Úpool)Úprocess)Úutil)Úget_contextc             C   s   t j | j| jƒ ffS )N)ÚarrayÚtypecodeÚtobytes)Úa© r   ú0/usr/lib64/python3.6/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   z4
    Type to uniquely indentify 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!   r"   r#   )	r*   Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r%   r&   r(   r+   r   r   r   r   r   3   s   c             C   s8   | j ||||fƒ | jƒ \}}|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
    r9   c             C   s\   | dkr|S | dkr,t |ƒtks$t‚t|ƒS | dkrPt |ƒtksDt‚td| ƒS tdƒS d S )Nz#ERRORz
#TRACEBACKz#UNSERIALIZABLEzUnserializable message: %s
zUnrecognized message type)r   ÚstrÚAssertionErrorÚRemoteErrorÚ
ValueError)r7   r8   r   r   r   r2   T   s    r2   c               @   s   e Zd Zdd„ ZdS )r<   c             C   s&   ddd  d t | jd ƒ dd  S )NÚ
ú-éK   r   )r:   r5   )r$   r   r   r   Ú__str__a   s    zRemoteError.__str__N)r*   r,   r-   rA   r   r   r   r   r<   `   s   r<   c             C   s6   g }x,t | ƒD ] }t| |ƒ}t|ƒr|j|ƒ qW |S )z4
    Return a list of names of methods of `obj`
    )Údirr   ÚcallableÚappend)r   Útempr   Úfuncr   r   r   Úall_methodsh   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   w   s    z"public_methods.<locals>.<listcomp>)rG   )r   r   r   r   Úpublic_methodss   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   sl   t |tƒst‚|| _tj|ƒ| _t| \}}||dd�| _| jj	| _	dd f fi| _
i | _i | _tjƒ | _d S )Né   )r"   ZbacklogÚ0)Ú
isinstanceÚbytesr;   Úregistryr   ÚAuthenticationStringÚauthkeyÚlistener_clientÚlistenerr"   Ú	id_to_objÚid_to_refcountÚid_to_local_proxy_objÚ	threadingÚLockÚmutex)r$   rX   r"   rZ   Ú
serializerÚListenerÚClientr   r   r   r%   „   s    
zServer.__init__c             C   s¦   t jƒ | _| tjƒ _zZt j| jd�}d|_|j	ƒ  y x| jj
ƒ sN| jjdƒ q6W W n ttfk
rj   Y nX W dtjtjkr–tjdƒ tjt_tjt_tj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$   rl   r   r   r   Úserve_forever“   s     



zServer.serve_foreverc             C   sP   xJy| j jƒ }W n tk
r&   wY nX tj| j|fd�}d|_|jƒ  qW d S )N)rf   r5   T)r\   ZacceptÚOSErrorr`   rk   Úhandle_requestrm   rn   )r$   r3   Útr   r   r   rl   ©   s    zServer.accepterc          '   C   sL  d } }}yTt j|| jƒ t j|| jƒ |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|j
|	ƒ W nt tk
�r> }
 zVy|j
dt	ƒ fƒ W n tk
�r   Y nX tjd|	ƒ tjd|ƒ tjd|
ƒ W Y dd}
~
X nX |jƒ  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_challengerZ   Zanswer_challenger1   Úpublicr;   r   Ú	Exceptionr   r0   r   ÚinfoÚclose)r$   r3   Úfuncnamer8   ÚrequestÚignorer5   r6   rF   ÚmsgÚer   r   r   r|   ³   s4    zServer.handle_requestc          D   C   sð  t jdtjƒ jƒ |j}|j}| j}�xÄ| jj	ƒ �sê�yBd }}|ƒ }|\}}}	}
y|| \}}}W n^ t
k
rÂ } zBy| j| \}}}W n& t
k
r° } z
|‚W Y dd}~X nX W Y dd}~X nX ||krâtd|t|ƒ|f ƒ‚t||ƒ}y||	|
Ž}W n, tk
�r& } zd|f}W Y dd}~X nPX |�o8|j|dƒ}|�rn| j|||ƒ\}}t|| j|ƒ}d||ff}nd|f}W nÈ tk
�rò   |dk�r dtƒ f}nNy,| j| }|| |||f|	ž|
Ž}d|f}W n  tk
�rì   dtƒ f}Y nX Y nP tk
�r"   t jdtjƒ jƒ tjd	ƒ Y n  tk
�r@   dtƒ f}Y nX yDy||ƒ W n2 tk
�r‚ } z|d
tƒ fƒ W Y dd}~X nX W q( tk
�ræ } zBt jdtjƒ jƒ t jd|ƒ t jd|ƒ |jƒ  tjdƒ W Y dd}~X 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   rv   r`   Úcurrent_threadr   r1   r0   r]   rh   ro   ÚKeyErrorr_   ÚAttributeErrorr   r   r   ÚgetrL   r   r"   r   Úfallback_mappingÚEOFErrorrs   ry   r€   r�   )r$   Úconnr1   r0   r]   r4   r   rƒ   Úidentr5   r6   ÚexposedÚ	gettypeidÚkeZ	second_keZfunctionÚresr†   r…   r!   ZridentZrexposedÚtokenZfallback_funcr8   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_repr,  s    zServer.fallback_repr)rA   r+   z	#GETVALUEc             C   s   d S )Nr   )r$   r3   r   r   r   rQ   5  s    zServer.dummyc             C   s|   | j �l g }t| jjƒ ƒ}|jƒ  xD|D ]<}|dkr(|jd|| j| t| j| d ƒdd… f ƒ q(W dj|ƒS Q R X dS )zO
        Return some info --- useful to spot problems with refcounting
        rU   z  %s:       refcount=%s
    %sr   Nr@   r>   )	rb   r   r^   r   ÚsortrD   r:   r]   Újoin)r$   r3   r8   r   rŽ   r   r   r   rO   8  s    

$zServer.debug_infoc             C   s
   t | jƒS )z*
        Number of shared objects
        )Úlenr^   )r$   r3   r   r   r   rP   G  s    zServer.number_of_objectsc             C   sL   z:yt jdƒ |jdƒ W n   ddl}|jƒ  Y nX W d| jjƒ  X dS )z'
        Shutdown this process
        z!manager received shutdown messageú#RETURNNr   )rœ   N)r   rv   r0   Ú	tracebackÚ	print_excrh   Úset)r$   r3   r�   r   r   r   rK   N  s    
zServer.shutdownc             O   sè   | j �Ä | j| \}}}}|dkrBt|ƒdkr4| s8t‚|d }	n
|||Ž}	|dkr\t|	ƒ}|dk	r„t|ƒtkstt‚t|ƒt|ƒ }dt|	ƒ }
t	j
d||
ƒ |	t|ƒ|f| j|
< |
| jkrÆd| j|
< W dQ R X | j||
ƒ |
t|ƒfS )z>
        Create a new shared object and return its id
        Nr   r   z%xz&%r callable returned object with id %r)rb   rX   r›   r;   rI   r   Údictr   r#   r   rv   rŸ   r]   r^   rR   Útuple)r$   r3   r!   r5   r6   rC   r�   Úmethod_to_typeidÚ	proxytyper   rŽ   r   r   r   rL   [  s$    


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$   r3   r“   r   r   r   rN   z  s    zServer.get_methodsc             C   s"   |t jƒ _|jdƒ | j|ƒ dS )z=
        Spawn a new thread to serve this connection
        ú#RETURNN)r¤   N)r`   r‡   r   r0   r”   )r$   r3   r   r   r   r   rM   €  s    

zServer.accept_connectionc             C   s–   | j �† y| j|  d7  < W nh tk
r† } zL|| jkrrd| j|< | j| | j|< | j| \}}}tjd|ƒ n|‚W Y d d }~X nX W d Q R X d S )Nr   z&Server re-enabled tracking & INCREF %r)rb   r^   rˆ   r_   r]   r   rv   )r$   r3   rŽ   r‘   r   r�   r�   r   r   r   rR   ˆ  s    

zServer.increfc             C   s´   || j kr$|| jkr$tjd|ƒ d S | j�@ | j | dks>t‚| j |  d8  < | j | dkrf| j |= W d Q R X || j kr°d f d f| j|< tjd|ƒ | j� | j|= W d Q R X d S )NzServer DECREF skipping %rr   r   zdisposing of obj with id %r)r^   r_   r   rv   rb   r;   r]   )r$   r3   rŽ   r   r   r   rS   š  s    


zServer.decrefN)r*   r,   r-   r.   r~   r%   rz   rl   r|   r”   r•   r–   r˜   r‹   rQ   rO   rP   rK   rL   rN   rM   rR   rS   r   r   r   r   rJ   }   s.   
"QrJ   c               @   s   e Zd ZdgZdZdZdZdS )ÚStateÚvaluer   r   é   N)r*   r,   r-   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f fd
d„Z
edf f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ƒ j}|| _t j|ƒ| _tƒ | _tj| j_	|| _
t| \| _| _|pTtƒ | _d S )N)r   ri   rZ   Ú_addressrY   Ú_authkeyr¥   Ú_stater¨   r¦   Ú_serializerr[   Z	_ListenerÚ_Clientr   Ú_ctx)r$   r"   rZ   rc   Zctxr   r   r   r%   Ð  s    

zBaseManager.__init__c             C   s(   | j jtjkst‚t| j| j| j| j	ƒS )zX
        Return server object with serve_forever() method and address attribute
        )
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
        )rZ   NrQ   )	r[   r¯   r¬   r­   r9   r¥   r©   r®   r¦   )r$   rd   re   r�   r   r   r   Úconnectä  s    zBaseManager.connectc          	   C   sø   | j jtjkst‚|dk	r,t|ƒ r,tdƒ‚tjdd�\}}| j	j
t| ƒj| j| j| j| j|||fd�| _djdd„ | jjD ƒƒ}t| ƒjd	 | | j_| jjƒ  |jƒ  |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
        Nzinitializer must be a callableF)Zduplex)rf   r5   ú:c             s   s   | ]}t |ƒV  qd S )N)r:   )r   Úir   r   r   ú	<genexpr>ÿ  s    z$BaseManager.start.<locals>.<genexpr>r?   r   )r5   Úexitpriority)r®   r¦   r¥   r¨   r;   rC   Ú	TypeErrorr   ZPiper±   ZProcessr   Ú_run_serverr²   r¬   r­   r¯   Ú_processrš   Z	_identityr*   r   rn   r�   r1   r©   r   ÚFinalizeÚ_finalize_managerr°   rK   )r$   ÚinitializerÚinitargsÚreaderÚwriterrŽ   r   r   r   rn   í  s(    




zBaseManager.startc       	      C   sN   |dk	r||Ž  | j ||||ƒ}|j|jƒ |jƒ  tjd|jƒ |jƒ  dS )z@
        Create a server, report its address and run it
        Nzmanager serving at %r)Ú_Serverr0   r"   r�   r   r€   rz   )	ÚclsrX   r"   rZ   rc   rÁ   r¾   r¿   Úserverr   r   r   rº     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 d|j	ƒ  X t
|| j|ƒ|fS )zP
        Create a new shared object; return the token and exposed tuple
        zserver not yet started)rZ   NrL   )r®   r¦   r¥   r©   r;   r°   r¬   r­   r9   r�   r   )r$   r!   r5   r6   r�   r#   r�   r   r   r   Ú_create%  s    
zBaseManager._createc             C   s*   | j dk	r&| j j|ƒ | 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š   1  s    

zBaseManager.joinc          
   C   s.   | j | j| jd�}zt|ddƒS |jƒ  X dS )zS
        Return some info about the servers shared objects and connections
        )rZ   NrO   )r°   r¬   r­   r9   r�   )r$   r�   r   r   r   Ú_debug_info:  s    zBaseManager._debug_infoc          
   C   s.   | j | j| jd�}zt|ddƒS |jƒ  X dS )z5
        Return the number of shared objects
        )rZ   NrP   )r°   r¬   r­   r9   r�   )r$   r�   r   r   r   Ú_number_of_objectsD  s    zBaseManager._number_of_objectsc             C   s,   | j jtjkr| jƒ  | j jtjks(t‚| S )N)r®   r¦   r¥   r¨   rn   r©   r;   )r$   r   r   r   Ú	__enter__N  s    zBaseManager.__enter__c             C   s   | j ƒ  d S )N)rK   )r$   Úexc_typeÚexc_valÚexc_tbr   r   r   Ú__exit__T  s    zBaseManager.__exit__c             C   sÚ   | j ƒ r¬tjdƒ y,|||d�}zt|ddƒ W d|jƒ  X W n tk
rR   Y nX | jdd� | j ƒ r¬tjdƒ t| dƒr¬tjd	ƒ | jƒ  | jd
d� | j ƒ r¬tj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)rZ   NrK   g      ð?)rÇ   zmanager still aliveÚ	terminatez'trying to `terminate()` manager processgš™™™™™¹?z#manager still alive after terminate)rÆ   r   r€   r9   r�   r   rš   ÚhasattrrÏ   r¥   rª   r¦   r   Ú_address_to_localrˆ   )r   r"   rZ   r'   r°   r�   r   r   r   r½   W  s.    




zBaseManager._finalize_managerc             C   s   | j S )N)r¬   )r$   r   r   r   Ú<lambda>w  s    zBaseManager.<lambda>Tc       
         sÊ   d| j kr| jjƒ | _ˆ dkr"t‰ |p0tˆ ddƒ}|p@tˆ ddƒ}|r�xHt|jƒ ƒ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 jdˆƒ | jˆf|ž|Ž\}}ˆ || j| | j|d�}| j|j| jd�}t|d d|jfƒ |S )Nz)requesting creation of a shared %r object)ÚmanagerrZ   r�   )rZ   rS   )	r   rv   rÅ   r¯   r­   r°   r"   r9   r#   )r$   r5   r6   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   Úregistery  s     

zBaseManager.register)NNr«   N)N)NNNNT)r*   r,   r-   r.   r²   rJ   rÂ   r%   r³   r´   rn   Ú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 j| dd„ ƒ d S )Nc             S   s   | j ƒ S )N)Úclear)r   r   r   r   rÒ   §  s    z*ProcessLocalSet.__init__.<locals>.<lambda>)r   Úregister_after_fork)r$   r   r   r   r%   ¦  s    zProcessLocalSet.__init__c             C   s   t | ƒf fS )N)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jƒ Zddd„Zdd„ Z	f 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|jd ƒ}|d kr:tjƒ tƒ f}|t j|j< W d Q R X |d | _|d | _	|| _
| j
j| _|| _|| _t| d | _|| _|d k	ržtj|ƒ| _n"| jd k	r´| jj| _ntjƒ j| _|rÌ| jƒ  tj| t jƒ d S )Nr   r   )r   Ú_mutexrÑ   rŠ   r"   r   ZForkAwareLocalrá   Ú_tlsÚ_idsetÚ_tokenr#   Ú_idÚ_managerr¯   r[   r°   Ú_owned_by_managerr   rY   r­   ri   rZ   Ú_increfrã   Ú_after_fork)	r$   r“   rc   rÕ   rZ   r�   rR   Úmanager_ownedZ	tls_idsetr   r   r   r%   ¶  s*    



zBaseProxy.__init__c             C   sd   t jdƒ tjƒ j}tjƒ jdkr4|dtjƒ j 7 }| j| jj	| j
d�}t|d d|fƒ || j_d S )Nzmaking connection to managerZ
MainThreadú|)rZ   rM   )r   rv   r   ri   r   r`   r‡   r°   rè   r"   r­   r9   ræ   r   )r$   r   r�   r   r   r   Ú_connectß  s    

zBaseProxy._connectc             C   sê   y| j j}W n6 tk
rB   tjdtjƒ jƒ | jƒ  | j j}Y nX |j	| j
|||fƒ |jƒ \}}|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 )
zW
        Try to call a method of the referrent and return a copy of the result
        z#thread %r does not own a connectionz#RETURNz#PROXYr   )rÕ   rZ   r�   )rZ   NrS   éÿÿÿÿ)ræ   r   r‰   r   rv   r`   r‡   r   rð   r0   ré   r1   rê   r²   r!   rè   r"   r¯   r­   r°   r9   r#   r2   )r$   r4   r5   r6   r�   r7   r8   r�   r“   r£   rÖ   r   r   r   Ú_callmethodè  s,    

zBaseProxy._callmethodc             C   s
   | j dƒS )z9
        Get a copy of the value of the referent
        z	#GETVALUE)rò   )r$   r   r   r   Ú	_getvalue  s    zBaseProxy._getvaluec          	   C   sœ   | j rtjd| jjƒ d S | j| jj| jd�}t|d d| j	fƒ tjd| j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)rZ   rR   z	INCREF %ré
   )r5   r¸   )rë   r   rv   rè   r#   r°   r"   r­   r9   ré   rç   Úaddrê   r®   r¼   r   Ú_decrefræ   Z_close)r$   r�   r'   r   r   r   rì     s    
zBaseProxy._increfc             C   sÆ   |j | jƒ |d ks |jtjkr„y2tjd| jƒ || j|d�}t|d d| jfƒ W q’ t	k
r€ } ztjd|ƒ W Y d d }~X q’X ntjd| jƒ | rÂt
|dƒrÂtjdtjƒ jƒ |jjƒ  |`d S )Nz	DECREF %r)rZ   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   rv   r"   r9   r   rÐ   r`   r‡   r   r   r�   )r“   rZ   r'   ZtlsZidsetr°   r�   r†   r   r   r   rö      s     
zBaseProxy._decrefc             C   sH   d | _ y| jƒ  W n0 tk
rB } ztjd| ƒ W Y d d }~X nX d S )Nzincref failed: %s)rê   rì   r   r   r€   )r$   r†   r   r   r   rí   9  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 )NrZ   Ú_isautoFr�   )	r
   r­   r   rÓ   ÚRebuildProxyrÙ   rè   r¯   r   )r$   r6   r   r   r   rä   A  s    


zBaseProxy.__reduce__c             C   s   | j ƒ S )N)ró   )r$   Úmemor   r   r   Ú__deepcopy__N  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+   Q  s    zBaseProxy.__repr__c             C   s4   y
| j 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   r   rA   U  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jƒ ddƒ}|rT|j|jkrTtjd|ƒ d|d< |j|jkrT|j|j |j|j< |j	ddƒopt tjƒ ddƒ }| ||fd|i|—ŽS )	z5
    Function used for unpickling proxy objects.
    rj   Nz*Rebuild a proxy owned by manager, token=%rTrî   rR   Z_inheritingF)
r   r   ri   r"   r   rv   r#   r_   r]   Úpop)rF   r“   rc   r6   rÄ   rR   r   r   r   rù   b  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   ÚMakeProxyTypew  s    
r  Tc       
      C   s–   t | d }|dkrB|| j|d�}zt|dd| fƒ}W d|jƒ  X |dkrX|dk	rX|j}|dkrjtjƒ j}td| j	 |ƒ}|| ||||d�}	d|	_
|	S )z*
    Return an auto-proxy for `token`
    r   N)rZ   rN   zAutoProxy[%s])rÕ   rZ   rR   T)r[   r"   r9   r�   r­   r   ri   rZ   r  r!   rø   )
r“   rc   rÕ   rZ   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 j|ƒ d S )N)r×   Úupdate)r$   r6   r   r   r   r%   «  s    zNamespace.__init__c             C   s^   t | jjƒ ƒ}g }x,|D ]$\}}|jdƒs|jd||f ƒ qW |jƒ  d| jjdj|ƒ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 j | |ƒ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__r0   Úthrowr�   c             C   s   | S )Nr   )r$   r   r   r   Ú__iter__Ë  s    zIteratorProxy.__iter__c             G   s   | j d|ƒS )Nr  )rò   )r$   r5   r   r   r   r  Í  s    zIteratorProxy.__next__c             G   s   | j d|ƒS )Nr0   )rò   )r$   r5   r   r   r   r0   Ï  s    zIteratorProxy.sendc             G   s   | j d|ƒS )Nr  )rò   )r$   r5   r   r   r   r  Ñ  s    zIteratorProxy.throwc             G   s   | j d|ƒS )Nr�   )rò   )r$   r5   r   r   r   r�   Ó  s    zIteratorProxy.closeN)r  r0   r  r�   )	r*   r,   r-   rÓ   r  r  r0   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}| j d|ƒS )Nr  )rò   )r$   ZblockingrÇ   r5   r   r   r   r  Ù  s    zAcquirerProxy.acquirec             C   s
   | j dƒS )Nr  )rò   )r$   r   r   r   r  Ü  s    zAcquirerProxy.releasec             C   s
   | j dƒS )Nr  )rò   )r$   r   r   r   rÊ   Þ  s    zAcquirerProxy.__enter__c             C   s
   | j dƒS )Nr  )rò   )r$   rË   rÌ   rÍ   r   r   r   rÎ   à  s    zAcquirerProxy.__exit__)r  r  )TN)r*   r,   r-   rÓ   r  r  rÊ   rÎ   r   r   r   r   r  ×  s
   
r  c               @   s4   e Zd ZdZddd„Zd	d
„ Zdd„ Zddd„ZdS )ÚConditionProxyr  r  rp   ÚnotifyÚ
notify_allNc             C   s   | j d|fƒS )Nrp   )rò   )r$   rÇ   r   r   r   rp   æ  s    zConditionProxy.waitc             C   s
   | j dƒS )Nr  )rò   )r$   r   r   r   r  è  s    zConditionProxy.notifyc             C   s
   | j dƒS )Nr  )rò   )r$   r   r   r   r  ê  s    zConditionProxy.notify_allc             C   sh   |ƒ }|r|S |d k	r$t jƒ | }nd }d }x6|sb|d k	rP|t jƒ  }|dkrPP | j|ƒ |ƒ }q.W |S )Nr   )ÚtimeZ	monotonicrp   )r$   Z	predicaterÇ   r8   ZendtimeZwaittimer   r   r   Úwait_forì  s    

zConditionProxy.wait_for)r  r  rp   r  r  )N)N)r*   r,   r-   rÓ   rp   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 )Ú
EventProxyro   rŸ   râ   rp   c             C   s
   | j dƒS )Nro   )rò   )r$   r   r   r   ro     s    zEventProxy.is_setc             C   s
   | j dƒS )NrŸ   )rò   )r$   r   r   r   rŸ     s    zEventProxy.setc             C   s
   | j dƒS )Nrâ   )rò   )r$   r   r   r   râ     s    zEventProxy.clearNc             C   s   | j d|fƒS )Nrp   )rò   )r$   rÇ   r   r   r   rp     s    zEventProxy.wait)ro   rŸ   râ   rp   )N)r*   r,   r-   rÓ   ro   rŸ   râ   rp   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__rp   ÚabortÚresetNc             C   s   | j d|fƒS )Nrp   )rò   )r$   rÇ   r   r   r   rp     s    zBarrierProxy.waitc             C   s
   | j dƒS )Nr  )rò   )r$   r   r   r   r    s    zBarrierProxy.abortc             C   s
   | j dƒS )Nr  )rò   )r$   r   r   r   r    s    zBarrierProxy.resetc             C   s   | j ddƒS )Nr  Úparties)r  )rò   )r$   r   r   r   r    s    zBarrierProxy.partiesc             C   s   | j ddƒS )Nr  Ú	n_waiting)r  )rò   )r$   r   r   r   r    s    zBarrierProxy.n_waitingc             C   s   | j ddƒS )Nr  Úbroken)r  )rò   )r$   r   r   r   r    s    zBarrierProxy.broken)r  rp   r  r  )N)r*   r,   r-   rÓ   rp   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dd	„ Zd
S )ÚNamespaceProxyr  Ú__setattr__Ú__delattr__c             C   s0   |d dkrt j| |ƒS t j| 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 j| ||ƒS t j| dƒ}|d||fƒS )Nr   rH   rò   r  )r!  r  r  )r$   rÜ   r¦   r"  r   r   r   r  %  s    zNamespaceProxy.__setattr__c             C   s0   |d dkrt j| |ƒS t j| dƒ}|d|fƒS )Nr   rH   rò   r   )r!  r   r  )r$   rÜ   r"  r   r   r   r   *  s    zNamespaceProxy.__delattr__N)r  r  r   )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 )	Ú
ValueProxyrŠ   rŸ   c             C   s
   | j dƒS )NrŠ   )rò   )r$   r   r   r   rŠ   3  s    zValueProxy.getc             C   s   | j d|fƒS )NrŸ   )rò   )r$   r¦   r   r   r   rŸ   5  s    zValueProxy.setN)rŠ   rŸ   )r*   r,   r-   rÓ   rŠ   rŸ   rà   r¦   r   r   r   r   r$  1  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   | j d|fƒ | S )Nr0  )rò   )r$   r¦   r   r   r   Ú__iadd__A  s    zListProxy.__iadd__c             C   s   | j d|fƒ | S )Nr5  )rò   )r$   r¦   r   r   r   r5  D  s    zListProxy.__imul__N)r*   r,   r-   r7  r5  r   r   r   r   r6  @  s   r6  Ú	DictProxyr  râ   rØ   rŠ   Úhas_keyÚpopitemÚ
setdefaultr  ÚIteratorÚ
ArrayProxyÚ	PoolProxyÚ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Ê   d  s    zPoolProxy.__enter__c             C   s   | j ƒ  d S )N)rÏ   )r$   rË   rÌ   rÍ   r   r   r   rÎ   f  s    zPoolProxy.__exit__N)r*   r,   r-   rÊ   rÎ   r   r   r   r   r>  c  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   m  s   	ÚQueueZJoinableQueuerg   ra   ÚRLockÚ	SemaphoreÚBoundedSemaphoreÚ	ConditionÚBarrierÚPoolr   r    F)r£   rÛ   )rÛ   )r   r   r   )NNNT)T)r&  r'  r(  r)  r*  r+  r,  r-  r.  rD   r/  r0  r1  r2  rü   r3  r4  r™   r5  )r'  r(  r)  r  r*  r.  râ   rØ   rŠ   r9  r   r   rü   r:  r;  r  r   )r*  r)  r.  )r?  r@  r�   rA  rB  rš   rC  rD  rE  rF  rÏ   )IÚ__all__rs   r`   r   Zqueuer  r�   r   Ú r   Úcontextr	   r
   r   r   r   r   r   rÝ   Z
view_typesr   r    Z	view_typer!  r   r9   r2   r   r<   rG   rI   rJ   r¥   rd   re   ZXmlListenerZ	XmlClientr[   r   rŸ   rá   r   rù   r  rÙ   r  r  r	  r
  r  r  r  r  r  r$  r%  r6  r8  rÔ   r=  ZBasePoolProxyr>  r   rG  rg   ra   rH  rI  rJ  rK  rL  rM  r    r   r   r   r   Ú<module>   s¶   


  ;
 ]
 4 

	   	  
 


