B
    2*™\¡  ã               @   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	râdd„ ZxeD ]Ze ee¡ qÎW 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   úCC:\ALexclude\prg\programme\Python37\Lib\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+   Ú
__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r–t 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rât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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  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functionÚ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   NéK   Ú
)	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ø   | j Ô | j| \}}}}|dkrD|s2t|ƒdkr:tdƒ‚|d }	n
|||Ž}	|dkr^t|	ƒ}|dk	r”t|tƒs„td |t	|ƒ¡ƒ‚t
|ƒt
|ƒ }dt|	ƒ }
t d||
¡ |	t|ƒ|f| j|
< |
| jkrÖd| j|
< W dQ R X |  ||
¡ |
t|ƒfS )z>
        Create a new shared object and return its id
        Nr   z4Without callable, must have one non-keyword argumentr   z,Method_to_typeid {0!r}: type {1!s}, not dictz%xz&%r callable returned object with id %r)ra   rW   r   r@   rI   r;   Údictr=   r>   r   r   r$   r   ru   r    r\   r]   rR   Útuple)r%   r4   r"   r6   r7   rC   r   Úmethod_to_typeidÚ	proxytyper    rŽ   r   r   r   rL   b  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%   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rÄd| 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$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.   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>  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º   /  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| 	¡  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%   r"   r6   r7   r   r$   r   r   r   r   Ú_createC  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œ   O  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_infoX  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_objectsb  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__l  s    

zBaseManager.__enter__c             C   s   |   ¡  d S )N)rK   )r%   Úexc_typeÚexc_valÚexc_tbr   r   r   Ú__exit__y  s    zBaseManager.__exit__c             C   sÚ   |   ¡ r¬t d¡ y,|||d}zt|ddƒ W d| ¡  X W n tk
rR   Y nX | jdd |   ¡ r¬t d¡ t| dƒr¬t d	¡ |  ¡  | jd
d |   ¡ r¬t 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	ržt |¡| _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 )	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#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   Ú	_getvalue-  s    zBaseProxy._getvaluec          	   C   sœ   | j rt d| jj¡ d S | j| jj| jd}t|d d| j	fƒ t d| jj¡ | j
 | j	¡ | joj| jj}tj| tj| j| j|| j| j
| jfdd| _d S )Nz%owned_by_manager skipped INCREF of %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í   3  s    
zBaseProxy._increfc          
   C   sÄ   |  | j¡ |d ks |jtjkr„y2t d| j¡ || j|d}t|d d| jfƒ W q’ t	k
r€ } zt d|¡ W d d }~X Y q’X nt d| j¡ |sÀt
|dƒrÀt 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÷   G  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î   `  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å   h  s    


zBaseProxy.__reduce__c             C   s   |   ¡ S )N)rô   )r%   Zmemor   r   r   Ú__deepcopy__u  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,   x  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\   Úpop)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dicZ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    *  s    zEventProxy.setc             C   s
   |   d¡S )Nrá   )ró   )r%   r   r   r   rá   ,  s    zEventProxy.clearNc             C   s   |   d|f¡S )Nro   )ró   )r%   rÇ   r   r   r   ro   .  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   4  s    zBarrierProxy.waitc             C   s
   |   d¡S )Nr  )ró   )r%   r   r   r   r  6  s    zBarrierProxy.abortc             C   s
   |   d¡S )Nr  )ró   )r%   r   r   r   r  8  s    zBarrierProxy.resetc             C   s   |   dd¡S )Nr  )Úparties)ró   )r%   r   r   r   r  :  s    zBarrierProxy.partiesc             C   s   |   dd¡S )Nr  )Ú	n_waiting)ró   )r%   r   r   r   r  =  s    zBarrierProxy.n_waitingc             C   s   |   dd¡S )Nr  )Úbroken)ró   )r%   r   r   r   r  @  s    zBarrierProxy.broken)N)r+   r-   r.   rÒ   ro   r  r  rß   r  r  r  r   r   r   r   r  2  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__G  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  L  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   Q  s    zNamespaceProxy.__delattr__N)r+   r-   r.   rÒ   r#  r  r   r   r   r   r   r  E  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Š   Z  s    zValueProxy.getc             C   s   |   d|f¡S )Nr    )ró   )r%   r¦   r   r   r   r    \  s    zValueProxy.setN)r+   r-   r.   rÒ   rŠ   r    rß   r¦   r   r   r   r   r$  X  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 )Nr0  )ró   )r%   r¦   r   r   r   Ú__iadd__h  s    zListProxy.__iadd__c             C   s   |   d|f¡ | S )Nr5  )ró   )r%   r¦   r   r   r   r5  k  s    zListProxy.__imul__N)r+   r-   r.   r7  r5  r   r   r   r   r6  g  s   r6  Ú	DictProxy)r'  r(  r)  r  r*  r.  rá   r×   rŠ   r   r   rü   ÚpopitemÚ
setdefaultr  r   r  ÚIteratorÚ
ArrayProxy)r*  r)  r.  Ú	PoolProxy)ZapplyÚapply_asyncr   ÚimapÚimap_unorderedrœ   ÚmapÚ	map_asyncÚstarmapÚstarmap_asyncrÏ   ZAsyncResult)r>  rB  rD  r?  r@  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%  r6  r8  rÓ   r<  ZBasePoolProxyr=  r   rE  rf   r`   rF  rG  rH  rI  rJ  rK  r¡   r   r   r   r   Ú<module>   sª   


  H
 t
 4 

		



