
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    ¡ê,a¿  ã                   @   sB  d ddddgZ ddlZddlZddlZddlZddlZddlZddlZddlmZ ddl	m
Z
 d	d
lmZ d	dlmZmZmZ d	dlmZ d	dlmZ d	dlmZ d	dlmZ zd	dlmZ dZW n ek
rÚ   dZY nX dd„ Ze eje¡ dd„ dD ƒZed ek	�r.dd„ ZeD ]Ze ee¡ �qG dd„ deƒZdi fdd„Z dd„ Z!G d d!„ d!e"ƒZ#d"d#„ Z$d$d%„ Z%G d&d'„ d'eƒZ&G d(d)„ d)eƒZ'ej(ej)fej*ej+fd*œZ,G d+d „ d eƒZ-G d,d-„ d-e.ƒZ/G d.d„ deƒZ0d/d0„ Z1i fd1d2„Z2dld3d4„Z3G d5d6„ d6eƒZ4G d7d8„ d8eƒZ5dmd9d:„Z6G d;d<„ d<e0ƒZ7G d=d>„ d>e0ƒZ8G d?d@„ d@e8ƒZ9G dAdB„ dBe0ƒZ:G dCdD„ dDe0ƒZ;G dEdF„ dFe0ƒZ<G dGdH„ dHe0ƒZ=e2dIdJƒZ>G dKdL„ dLe>ƒZ?e2dMdNƒZ@dOdPie@_Ae2dQdRƒZBe2dSdTƒZCdUdUdUdPdPdVœeC_AG dWdS„ dSeCƒZDG dXd„ de-ƒZEeE dYejF¡ eE dZejF¡ eE d[ejGe:¡ eE d\ejHe8¡ eE d]ejIe8¡ eE d^ejJe8¡ eE d_ejKe8¡ eE d`ejLe9¡ eE daejMe;¡ eE dbejNeD¡ eE dcee?¡ eE ddeOe@¡ eE d8e5e=¡ eE d:e6eB¡ eE d6e4e<¡ eEjdPe7dde� eEjdUddf� e�r>G dgdh„ dhƒZPG didj„ dje&ƒZQG dkd„ de-ƒZRdS )nÚBaseManagerÚSyncManagerÚ	BaseProxyÚTokenÚSharedMemoryManageré    N)Úgetpid)Ú
format_excé   )Ú
connection)Ú	reductionÚget_spawning_popenÚProcessError)Úpool)Úprocess)Úutil)Úget_context)Úshared_memoryTFc                 C   s   t j | j|  ¡ ffS ©N)ÚarrayÚtypecodeÚtobytes)Úa© r   ú=/opt/alt/python38/lib64/python3.8/multiprocessing/managers.pyÚreduce_array-   s    r   c                 C   s   g | ]}t ti |ƒƒ ƒ‘qS r   )ÚtypeÚgetattr©Ú.0Únamer   r   r   Ú
<listcomp>1   s     r    )ÚitemsÚkeysÚvaluesc                 C   s   t t | ƒffS r   )Úlist©Úobjr   r   r   Úrebuild_as_list3   s    r'   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )r   ©ÚtypeidÚaddressÚidc                 C   s   |||  | _ | _| _d S r   r(   )Úselfr)   r*   r+   r   r   r   Ú__init__B   s    zToken.__init__c                 C   s   | j | j| jfS r   r(   ©r,   r   r   r   Ú__getstate__E   s    zToken.__getstate__c                 C   s   |\| _ | _| _d S r   r(   ©r,   Ústater   r   r   Ú__setstate__H   s    zToken.__setstate__c                 C   s   d| j j| j| j| jf S )Nz %s(typeid=%r, address=%r, id=%r))Ú	__class__Ú__name__r)   r*   r+   r.   r   r   r   Ú__repr__K   s    ÿzToken.__repr__N)r4   Ú
__module__Ú__qualname__Ú	__slots__r-   r/   r2   r5   r   r   r   r   r   <   s
   r   c                 C   s8   |   ||||f¡ |  ¡ \}}|dkr*|S t||ƒ‚d S )Nú#RETURN)ÚsendÚrecvÚconvert_to_error)Úcr+   Ú
methodnameÚargsÚkwdsÚkindÚresultr   r   r   ÚdispatchS   s
    rC   c                 C   sd   | dkr|S | dkrRt |tƒs4td || t|ƒ¡ƒ‚| dkrHtd| ƒS t|ƒS ntd | ¡ƒS d S )Nú#ERROR)ú
#TRACEBACKú#UNSERIALIZABLEz.Result {0!r} (kind '{1}') type is {2}, not strrF   zUnserializable message: %s
zUnrecognized message type {!r})Ú
isinstanceÚstrÚ	TypeErrorÚformatr   ÚRemoteErrorÚ
ValueError)rA   rB   r   r   r   r<   ]   s    
  ÿÿ
r<   c                   @   s   e Zd Zdd„ ZdS )rK   c                 C   s   dt | jd ƒ d S )NzM
---------------------------------------------------------------------------
r   zK---------------------------------------------------------------------------)rH   r?   r.   r   r   r   Ú__str__m   s    zRemoteError.__str__N)r4   r6   r7   rM   r   r   r   r   rK   l   s   rK   c                 C   s2   g }t | ƒD ] }t| |ƒ}t|ƒr| |¡ q|S r   )Údirr   ÚcallableÚappend)r&   Útempr   Úfuncr   r   r   Úall_methodst   s    
rS   c                 C   s   dd„ t | ƒD ƒS )Nc                 S   s   g | ]}|d  dkr|‘qS )r   Ú_r   r   r   r   r   r    ƒ   s      z"public_methods.<locals>.<listcomp>)rS   r%   r   r   r   Úpublic_methods   s    rU   c                	   @   s¼   e Zd Zddddddddd	g	Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Z	dd„ Z
dd„ Ze
ee	dœZdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%e_d&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.S )/ÚServerÚ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   )rG   ÚbytesrI   rJ   r   Úregistryr   ÚAuthenticationStringÚauthkeyÚlistener_clientÚlistenerr*   Ú	id_to_objÚid_to_refcountÚid_to_local_proxy_objÚ	threadingÚLockÚmutex)r,   rd   r*   rf   Ú
serializerÚListenerÚClientr   r   r   r-   �   s     
 ÿÿ

zServer.__init__c              	   C   s¢   t  ¡ | _| t ¡ _zVt j| jd�}d|_| ¡  z| j ¡ sL| j d¡ q4W n ttfk
rf   Y nX W 5 tjtjkr’t	 
d¡ tjt_tjt_t d¡ X d S )Nzresetting stdout, stderrr   )ÚtargetTr	   )rl   ÚEventÚ
stop_eventr   Úcurrent_processÚ_manager_serverÚsysÚstdoutÚ
__stdout__r   ÚdebugÚ
__stderr__ÚstderrÚexitÚThreadÚaccepterÚdaemonÚstartÚis_setÚwaitÚKeyboardInterruptÚ
SystemExit)r,   r   r   r   r   Úserve_forever¢   s     




zServer.serve_foreverc                 C   sN   z| j  ¡ }W n tk
r&   Y q Y nX tj| j|fd�}d|_| ¡  q d S )N©rr   r?   T)rh   ZacceptÚOSErrorrl   r~   Úhandle_requestr€   r�   )r,   r=   Útr   r   r   r   ¸   s    
zServer.accepterc                 C   s4  d  } }}z>t  || j¡ t  || j¡ | ¡ }|\}}}}t| |ƒ}W n tk
rh   dtƒ f}	Y n>X z||f|ž|Ž}W n tk
rœ   dtƒ f}	Y n
X d|f}	z| |	¡ W nr tk
�r& }
 zRz| dtƒ f¡ W n tk
rð   Y nX t	 
d|	¡ t	 
d|¡ t	 
d|
¡ W 5 d }
~
X Y nX | ¡  d S )NrE   r9   zFailure to send message: %rz ... request was %rú ... exception was %r)r
   Zdeliver_challengerf   Zanswer_challenger;   r   Ú	Exceptionr   r:   r   ÚinfoÚclose)r,   r=   ÚfuncnamerB   ÚrequestÚignorer?   r@   rR   ÚmsgÚer   r   r   r‰   Â   s2    zServer.handle_requestc                 C   sê  t  dt ¡ j¡ |j}|j}| j}| j 	¡ �sæ�zBd  }}|ƒ }|\}}}	}
z|| \}}}W n^ t
k
r¾ } z@z| j| \}}}W n& t
k
r¬ } z|‚W 5 d }~X Y nX W 5 d }~X Y nX ||krÞtd|t|ƒ|f ƒ‚t||ƒ}z||	|
Ž}W n, tk
�r" } zd|f}W 5 d }~X Y nPX |�o4| |d ¡}|�rj|  |||¡\}}t|| j|ƒ}d||ff}nd|f}W nÈ tk
�rî   |d k�rœdtƒ f}nNz,| j| }|| |||f|	ž|
Ž}d|f}W n  tk
�rè   dtƒ f}Y nX Y nP tk
�r   t  dt ¡ j¡ t d¡ Y n  tk
�r<   dtƒ f}Y nX zDz||ƒ W n2 tk
�r~ } z|d	tƒ fƒ W 5 d }~X Y nX W q$ tk
�râ } z@t  d
t ¡ j¡ t  d|¡ t  d|¡ | ¡  t d¡ W 5 d }~X Y q$X q$d S )Nz$starting server thread to service %rz+method %r of %r object is not in exposed=%rrD   ú#PROXYr9   rE   z$got EOF -- exiting thread serving %rr   rF   zexception in thread serving %rz ... message was %rr‹   r	   )r   rz   rl   Úcurrent_threadr   r;   r:   ri   rt   r‚   ÚKeyErrorrk   ÚAttributeErrorr   r   rŒ   ÚgetrX   r   r*   r   Úfallback_mappingÚEOFErrorrw   r}   r�   rŽ   )r,   Úconnr;   r:   ri   r>   r&   r�   Úidentr?   r@   ÚexposedÚ	gettypeidÚkeZ	second_keZfunctionÚresr“   r’   r)   ZridentZrexposedÚtokenZfallback_funcrB   r   r   r   Úserve_clientä   s”    ÿÿ(ÿÿ


   ÿÿÿÿ$ÿzServer.serve_clientc                 C   s   |S r   r   ©r,   r›   rœ   r&   r   r   r   Úfallback_getvalue5  s    zServer.fallback_getvaluec                 C   s   t |ƒS r   ©rH   r£   r   r   r   Úfallback_str8  s    zServer.fallback_strc                 C   s   t |ƒS r   )Úreprr£   r   r   r   Úfallback_repr;  s    zServer.fallback_repr)rM   r5   ú	#GETVALUEc                 C   s   d S r   r   ©r,   r=   r   r   r   r]   D  s    zServer.dummyc              
   C   s„   | j �t g }t| j ¡ ƒ}| ¡  |D ]<}|dkr&| d|| j| t| j| d ƒd d… f ¡ q&d |¡W  5 Q R £ S Q R X d S )Nra   z  %s:       refcount=%s
    %sr   éK   Ú
)	rn   r$   rj   r"   ÚsortrP   rH   ri   Újoin)r,   r=   rB   r"   rœ   r   r   r   r[   G  s    
ÿÿzServer.debug_infoc                 C   s
   t | jƒS r   )Úlenrj   rª   r   r   r   r\   W  s    zServer.number_of_objectsc                 C   sL   z:zt d¡ | d¡ W n   dd l}| ¡  Y nX W 5 | j  ¡  X d S )Nz!manager received shutdown message©r9   Nr   )rt   Úsetr   rz   r:   Ú	tracebackÚ	print_exc)r,   r=   r²   r   r   r   rW   ^  s    
zServer.shutdownc               	   O   sÒ  t | ƒdkr| ^}}}} nª| s(tdƒ‚nœd|krDtdt | ƒd  ƒ‚| d¡}t | ƒdkr~| ^}}} dd l}|jdtdd	� nFd
|krštdt | ƒd  ƒ‚| d
¡}| ^}} dd l}|jdtdd	� t| ƒ} |j�â |j| \}}}}	|d k�r|�st | ƒdk�rt	dƒ‚| d }
n
|| |Ž}
|d k�r2t
|
ƒ}|d k	�rlt|tƒ�s\td |t|ƒ¡ƒ‚t|ƒt|ƒ }dt|
ƒ }t d||¡ |
t|ƒ|f|j|< ||jk�r°d|j|< W 5 Q R X | ||¡ |t|ƒfS )Né   z8descriptor 'create' of 'Server' object needs an argumentr)   ú7create expected at least 2 positional arguments, got %dr	   é   r   z2Passing 'typeid' as keyword argument is deprecated)Ú
stacklevelr=   z-Passing 'c' as keyword argument is deprecatedz4Without callable, must have one non-keyword argumentz,Method_to_typeid {0!r}: type {1!s}, not dictz%xz&%r callable returned object with id %r)r¯   rI   ÚpopÚwarningsÚwarnÚDeprecationWarningÚtuplern   rd   rL   rU   rG   ÚdictrJ   r   r$   r+   r   rz   r±   ri   rj   r^   )r?   r@   r,   r=   r)   r¹   rO   r�   Úmethod_to_typeidÚ	proxytyper&   rœ   r   r   r   rX   k  sp    

ÿ

 ÿ
ÿ
 ÿÿ

ÿ



 ÿÿzServer.createz$($self, c, typeid, /, *args, **kwds)c                 C   s   t | j|j d ƒS )Nr	   )r¼   ri   r+   )r,   r=   r¡   r   r   r   rZ   ª  s    zServer.get_methodsc                 C   s"   |t  ¡ _| d¡ |  |¡ d S )Nr°   )rl   r•   r   r:   r¢   )r,   r=   r   r   r   r   rY   °  s    

zServer.accept_connectionc                 C   s–   | j �† z| j|  d7  < W nh tk
r† } zJ|| jkrrd| j|< | j| | j|< | j| \}}}t d|¡ n|‚W 5 d }~X Y nX W 5 Q R X d S )Nr	   z&Server re-enabled tracking & INCREF %r)rn   rj   r–   rk   ri   r   rz   )r,   r=   rœ   rŸ   r&   r�   rž   r   r   r   r^   ¸  s    

ÿzServer.increfc              	   C   sÈ   || j kr$|| jkr$t d|¡ d S | j�Z | j | dkrXtd || j| | j | ¡ƒ‚| j |  d8  < | j | dkr€| j |= W 5 Q R X || j krÄd| j|< t d|¡ | j� | j|= W 5 Q R X d S )NzServer DECREF skipping %rr   z+Id {0!s} ({1!r}) has refcount {2:n}, not 1+r	   )Nr   Nzdisposing of obj with id %r)rj   rk   r   rz   rn   ÚAssertionErrorrJ   ri   )r,   r=   rœ   r   r   r   r_   Ê  s,    
ÿ þÿ

zServer.decrefN)r4   r6   r7   Úpublicr-   r†   r   r‰   r¢   r¤   r¦   r¨   r™   r]   r[   r\   rW   rX   Ú__text_signature__rZ   rY   r^   r_   r   r   r   r   rV   ‰   s:       ÿ
"Qý=rV   c                   @   s   e Zd ZdgZdZdZdZdS )ÚStateÚvaluer   r	   r¶   N)r4   r6   r7   r8   ÚINITIALÚSTARTEDÚSHUTDOWNr   r   r   r   rÃ   ê  s   rÃ   )ÚpickleZ	xmlrpclibc                   @   sž   e 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   NrÈ   c                 C   s\   |d krt  ¡ j}|| _t  |¡| _tƒ | _tj| j_	|| _
t| \| _| _|pTtƒ | _d S r   )r   ru   rf   Ú_addressre   Ú_authkeyrÃ   Ú_staterÅ   rÄ   Ú_serializerrg   Z	_ListenerÚ_Clientr   Ú_ctx)r,   r*   rf   ro   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 )NúAlready started serverúManager has shut downúUnknown state {!r})rË   rÄ   rÃ   rÅ   rÆ   r   rÇ   rJ   rV   Ú	_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 )N©rf   r]   )	rg   rÌ   rÉ   rÊ   rC   rÃ   rÆ   rË   rÄ   )r,   rp   rq   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 )NrÏ   rÐ   rÑ   zinitializer must be a callableF)Zduplexr‡   ú:c                 s   s   | ]}t |ƒV  qd S r   r¥   )r   Úir   r   r   Ú	<genexpr>A  s     z$BaseManager.start.<locals>.<genexpr>ú-r   ©r?   Zexitpriority)!rË   rÄ   rÃ   rÅ   rÆ   r   rÇ   rJ   rO   rI   r
   ZPiperÎ   ZProcessr   Ú_run_serverrÒ   rÉ   rÊ   rÌ   Ú_processr®   Z	_identityr4   r   r�   rŽ   r;   r   ÚFinalizeÚ_finalize_managerrÍ   rW   )r,   ÚinitializerÚinitargsÚreaderÚwriterrœ   r   r   r   r�   (  sH    

ÿ   ÿþ


  ÿüzBaseManager.startc           	      C   s^   t   t jt j¡ |d k	r ||Ž  |  ||||¡}| |j¡ | ¡  t d|j¡ | 	¡  d S )Nzmanager serving at %r)
ÚsignalÚSIGINTÚSIG_IGNÚ_Serverr:   r*   rŽ   r   r�   r†   )	Úclsrd   r*   rf   ro   râ   rß   rà   Úserverr   r   r   rÛ   S  s    zBaseManager._run_serverc                O   sN   | j | j| jd�}zt|d d|f| |ƒ\}}W 5 | ¡  X t|| j|ƒ|fS )NrÔ   rX   )rÍ   rÉ   rÊ   rŽ   rC   r   )r,   r)   r?   r@   r›   r+   r�   r   r   r   Ú_createj  s
    
zBaseManager._createc                 C   s*   | j d k	r&| j  |¡ | j  ¡ s&d | _ d S r   )rÜ   r®   Úis_alive©r,   Útimeoutr   r   r   r®   v  s    

zBaseManager.joinc                 C   s2   | j | j| jd�}zt|d dƒW ¢S | ¡  X d S )NrÔ   r[   ©rÍ   rÉ   rÊ   rŽ   rC   ©r,   r›   r   r   r   Ú_debug_info  s    zBaseManager._debug_infoc                 C   s2   | j | j| jd�}zt|d dƒW ¢S | ¡  X d S )NrÔ   r\   rí   rî   r   r   r   Ú_number_of_objects‰  s    zBaseManager._number_of_objectsc                 C   sj   | j jtjkr|  ¡  | j jtjkrf| j jtjkr<tdƒ‚n*| j jtjkrTtdƒ‚ntd | j j¡ƒ‚| S )NzUnable to start serverrÐ   rÑ   )	rË   rÄ   rÃ   rÅ   r�   rÆ   r   rÇ   rJ   r.   r   r   r   Ú	__enter__“  s    

ÿzBaseManager.__enter__c                 C   s   |   ¡  d S r   )rW   ©r,   Úexc_typeZexc_valZexc_tbr   r   r   Ú__exit__   s    zBaseManager.__exit__c                 C   sÚ   |   ¡ r¬t d¡ z,|||d�}zt|d dƒ W 5 | ¡  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
|_ztj|= W n tk
rÔ   Y nX d S )Nz#sending shutdown message to managerrÔ   rW   g      ð?)rì   zmanager still aliveÚ	terminatez'trying to `terminate()` manager processgš™™™™™¹?z#manager still alive after terminate)rê   r   r�   rŽ   rC   rŒ   r®   Úhasattrrõ   rÃ   rÇ   rÄ   r   Ú_address_to_localr–   )r   r*   rf   r1   rÍ   r›   r   r   r   rÞ   £  s.    




zBaseManager._finalize_managerc                 C   s   | j S r   )rÉ   r.   r   r   r   r*   Ã  s    zBaseManager.addressTc           
         s–   d| j kr| j ¡ | _ˆ d kr"t‰ |p0tˆ dd ƒ}|p@tˆ dd ƒ}|r\t| ¡ ƒD ]\}}qR|||ˆ f| jˆ< |r’‡ ‡fdd„}	ˆ|	_t| ˆ|	ƒ d S )NrÒ   Ú	_exposed_Ú_method_to_typeid_c                   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©Úmanagerrf   r�   rÔ   r_   )	r   rz   ré   rÌ   rÊ   rÍ   r*   rC   r+   )r,   r?   r@   r¡   ZexpÚproxyr›   ©r¿   r)   r   r   rQ   â  s       þz"BaseManager.register.<locals>.temp)	Ú__dict__rÒ   ÚcopyÚ	AutoProxyr   r$   r!   r4   Úsetattr)
rç   r)   rO   r¿   r�   r¾   Úcreate_methodÚkeyrÄ   rQ   r   rý   r   ÚregisterÇ  s(    

ÿ   ÿ

zBaseManager.register)NNrÈ   N)Nr   )Nr   )N)NNNNT)r4   r6   r7   rÒ   rV   ræ   r-   rÓ   rÕ   r�   ÚclassmethodrÛ   ré   r®   rï   rð   rñ   rô   ÚstaticmethodrÞ   Úpropertyr*   r  r   r   r   r   r   ý  s6     ÿ
	
+   ÿ
	



    ÿc                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚProcessLocalSetc                 C   s   t  | dd„ ¡ d S )Nc                 S   s   |   ¡ S r   )Úclearr%   r   r   r   Ú<lambda>õ  ó    z*ProcessLocalSet.__init__.<locals>.<lambda>)r   Úregister_after_forkr.   r   r   r   r-   ô  s    zProcessLocalSet.__init__c                 C   s   t | ƒdfS rb   )r   r.   r   r   r   Ú
__reduce__ö  s    zProcessLocalSet.__reduce__N)r4   r6   r7   r-   r  r   r   r   r   r  ó  s   r  c                   @   s|   e Zd Z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   NTFc           	   	   C   sÞ   t j�8 t j |jd ¡}|d kr:t ¡ tƒ f}|t j|j< W 5 Q R X |d | _|d | _	|| _
| j
j| _|| _|| _t| d | _|| _|d k	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Ì   rg   rÍ   Ú_owned_by_managerr   re   rÊ   ru   rf   Ú_increfr  Ú_after_fork)	r,   r¡   ro   rû   rf   r�   r^   Úmanager_ownedZ	tls_idsetr   r   r   r-     s*    



zBaseProxy.__init__c                 C   sd   t  d¡ t ¡ j}t ¡ jdkr4|dt ¡ j 7 }| j| jj	| j
d�}t|d d|fƒ || j_d S )Nzmaking connection to managerZ
MainThreadú|rÔ   rY   )r   rz   r   ru   r   rl   r•   rÍ   r  r*   rÊ   rC   r  r
   )r,   r   r›   r   r   r   Ú_connect-  s    

zBaseProxy._connectr   c                 C   sê   z| j j}W n6 tk
rB   t dt ¡ j¡ |  ¡  | j j}Y nX | 	| j
|||f¡ | ¡ \}}|dkrp|S |dkrÜ|\}}| jj|j d }	| jj|_|	|| j| j| j|d�}
| j|j| jd�}t|d d|jfƒ |
S t||ƒ‚d S )Nz#thread %r does not own a connectionr9   r”   éÿÿÿÿrú   rÔ   r_   )r  r
   r—   r   rz   rl   r•   r   r  r:   r  r;   r  rÒ   r)   r  r*   rÌ   rÊ   rÍ   rC   r+   r<   )r,   r>   r?   r@   r›   rA   rB   r�   r¡   r¿   rü   r   r   r   Ú_callmethod6  s6    ÿ
   þzBaseProxy._callmethodc                 C   s
   |   d¡S )Nr©   ©r  r.   r   r   r   Ú	_getvalueT  s    zBaseProxy._getvaluec              	   C   sœ   | j rt d| jj¡ d S | j| jj| jd�}t|d d| j	fƒ t d| jj¡ | j
 | j	¡ | joj| jj}tj| tj| j| j|| j| j
| jfdd�| _d S )Nz%owned_by_manager skipped INCREF of %rrÔ   r^   z	INCREF %ré
   rÚ   )r  r   rz   r  r+   rÍ   r*   rÊ   rC   r  r  Úaddr  rË   rÝ   r   Ú_decrefr  Z_close)r,   r›   r1   r   r   r   r  Z  s$     
  ÿüzBaseProxy._increfc              
   C   sÄ   |  | j¡ |d ks |jtjkr„z2t d| j¡ || j|d�}t|d d| jfƒ W q’ t	k
r€ } zt d|¡ W 5 d }~X Y q’X nt d| j¡ |sÀt
|dƒrÀt dt ¡ j¡ |j ¡  |`d S )Nz	DECREF %rrÔ   r_   z... decref failed %sz%DECREF %r -- manager already shutdownr
   z-thread %r has no more proxies so closing conn)Údiscardr+   rÄ   rÃ   rÆ   r   rz   r*   rC   rŒ   rö   rl   r•   r   r
   rŽ   )r¡   rf   r1   ZtlsZidsetrÍ   r›   r“   r   r   r   r   n  s     ÿ
zBaseProxy._decrefc              
   C   sH   d | _ z|  ¡  W n0 tk
rB } zt d| ¡ W 5 d }~X Y nX d S )Nzincref failed: %s)r  r  rŒ   r   r�   )r,   r“   r   r   r   r  ‡  s
    zBaseProxy._after_forkc                 C   s^   i }t ƒ d k	r| j|d< t| ddƒrB| j|d< tt| j| j|ffS tt| ƒ| j| j|ffS d S )Nrf   Ú_isautoFr�   )	r   rÊ   r   rø   ÚRebuildProxyr   r  rÌ   r   ©r,   r@   r   r   r   r  �  s    


ÿÿzBaseProxy.__reduce__c                 C   s   |   ¡ S r   )r  )r,   Zmemor   r   r   Ú__deepcopy__œ  s    zBaseProxy.__deepcopy__c                 C   s   dt | ƒj| jjt| ƒf S )Nz<%s object, typeid %r at %#x>)r   r4   r  r)   r+   r.   r   r   r   r5   Ÿ  s    ÿzBaseProxy.__repr__c                 C   s:   z|   d¡W S  tk
r4   t| ƒd d… d  Y S X d S )Nr5   r  z; '__str__()' failed>)r  rŒ   r§   r.   r   r   r   rM   £  s    zBaseProxy.__str__)NNNTF)r4   r6   r7   r÷   r   ZForkAwareThreadLockr  r-   r  r  r  r  r  r   r  r  r%  r5   rM   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 )Nrv   z*Rebuild a proxy owned by manager, token=%rTr  r^   Z_inheritingF)
r   r   ru   r*   r   rz   r+   rk   ri   r¸   )rR   r¡   ro   r@   rè   r^   r   r   r   r#  °  s    
ÿ
þr#  c                 C   sp   t |ƒ}z|| |f W S  tk
r*   Y nX i }|D ]}td||f |ƒ q4t| tf|ƒ}||_||| |f< |S )NzOdef %s(self, /, *args, **kwds):
        return self._callmethod(%r, args, kwds))r¼   r–   Úexecr   r   rø   )r   r�   Ú_cacheZdicZmethÚ	ProxyTyper   r   r   ÚMakeProxyTypeÅ  s     ÿÿr)  c           
      C   s–   t | d }|d krB|| j|d�}zt|d d| fƒ}W 5 | ¡  X |d krX|d k	rX|j}|d krjt ¡ j}td| j	 |ƒ}|| ||||d�}	d|	_
|	S )Nr	   rÔ   rZ   zAutoProxy[%s])rû   rf   r^   T)rg   r*   rŽ   rC   rÊ   r   ru   rf   r)  r)   r"  )
r¡   ro   rû   rf   r�   r^   rÍ   r›   r(  rü   r   r   r   r   Û  s     


ÿr   c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú	Namespacec                K   s   | j  |¡ d S r   )rþ   Úupdater$  r   r   r   r-   ù  s    zNamespace.__init__c                 C   sZ   t | j ¡ ƒ}g }|D ]$\}}| d¡s| d||f ¡ q| ¡  d| jjd |¡f S )NrT   z%s=%rz%s(%s)z, )	r$   rþ   r!   Ú
startswithrP   r­   r3   r4   r®   )r,   r!   rQ   r   rÄ   r   r   r   r5   û  s    
zNamespace.__repr__N)r4   r6   r7   r-   r5   r   r   r   r   r*  ø  s   r*  c                   @   s8   e Zd Zddd„Zdd„ Zdd„ Zdd	„ ZeeeƒZd
S )ÚValueTc                 C   s   || _ || _d S r   )Ú	_typecodeÚ_value)r,   r   rÄ   Úlockr   r   r   r-     s    zValue.__init__c                 C   s   | j S r   ©r/  r.   r   r   r   r˜     s    z	Value.getc                 C   s
   || _ d S r   r1  ©r,   rÄ   r   r   r   r±   
  s    z	Value.setc                 C   s   dt | ƒj| j| jf S )Nz
%s(%r, %r))r   r4   r.  r/  r.   r   r   r   r5     s    zValue.__repr__N)T)	r4   r6   r7   r-   r˜   r±   r5   r  rÄ   r   r   r   r   r-    s
   
r-  c                 C   s   t   | |¡S r   )r   )r   Úsequencer0  r   r   r   ÚArray  s    r4  c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚIteratorProxy)Ú__next__r:   ÚthrowrŽ   c                 C   s   | S r   r   r.   r   r   r   Ú__iter__  s    zIteratorProxy.__iter__c                 G   s   |   d|¡S )Nr6  r  ©r,   r?   r   r   r   r6    s    zIteratorProxy.__next__c                 G   s   |   d|¡S )Nr:   r  r9  r   r   r   r:     s    zIteratorProxy.sendc                 G   s   |   d|¡S )Nr7  r  r9  r   r   r   r7    s    zIteratorProxy.throwc                 G   s   |   d|¡S )NrŽ   r  r9  r   r   r   rŽ   !  s    zIteratorProxy.closeN)	r4   r6   r7   rø   r8  r6  r:   r7  rŽ   r   r   r   r   r5    s   r5  c                   @   s2   e Zd ZdZddd„Zdd„ Zdd	„ Zd
d„ ZdS )ÚAcquirerProxy)ÚacquireÚreleaseTNc                 C   s"   |d kr|fn||f}|   d|¡S ©Nr;  r  )r,   Zblockingrì   r?   r   r   r   r;  '  s    zAcquirerProxy.acquirec                 C   s
   |   d¡S ©Nr<  r  r.   r   r   r   r<  *  s    zAcquirerProxy.releasec                 C   s
   |   d¡S r=  r  r.   r   r   r   rñ   ,  s    zAcquirerProxy.__enter__c                 C   s
   |   d¡S r>  r  rò   r   r   r   rô   .  s    zAcquirerProxy.__exit__)TN)r4   r6   r7   rø   r;  r<  rñ   rô   r   r   r   r   r:  %  s
   
r:  c                   @   s6   e Zd ZdZddd„Zddd„Zdd	„ Zdd
d„ZdS )ÚConditionProxy)r;  r<  rƒ   ÚnotifyÚ
notify_allNc                 C   s   |   d|f¡S ©Nrƒ   r  rë   r   r   r   rƒ   4  s    zConditionProxy.waitr	   c                 C   s   |   d|f¡S )Nr@  r  )r,   Únr   r   r   r@  6  s    zConditionProxy.notifyc                 C   s
   |   d¡S )NrA  r  r.   r   r   r   rA  8  s    zConditionProxy.notify_allc                 C   sd   |ƒ }|r|S |d k	r$t  ¡ | }nd }d }|s`|d k	rN|t  ¡  }|dkrNq`|  |¡ |ƒ }q,|S )Nr   )ÚtimeÚ	monotonicrƒ   )r,   Z	predicaterì   rB   ZendtimeZwaittimer   r   r   Úwait_for:  s    
zConditionProxy.wait_for)N)r	   )N)r4   r6   r7   rø   rƒ   r@  rA  rF  r   r   r   r   r?  2  s
   

r?  c                   @   s2   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	d
„ZdS )Ú
EventProxy)r‚   r±   r	  rƒ   c                 C   s
   |   d¡S )Nr‚   r  r.   r   r   r   r‚   O  s    zEventProxy.is_setc                 C   s
   |   d¡S ©Nr±   r  r.   r   r   r   r±   Q  s    zEventProxy.setc                 C   s
   |   d¡S )Nr	  r  r.   r   r   r   r	  S  s    zEventProxy.clearNc                 C   s   |   d|f¡S rB  r  rë   r   r   r   rƒ   U  s    zEventProxy.wait)N)r4   r6   r7   rø   r‚   r±   r	  rƒ   r   r   r   r   rG  M  s
   rG  c                   @   sN   e Zd ZdZddd„Zdd„ Zdd„ Zed	d
„ ƒZedd„ ƒZ	edd„ ƒZ
dS )ÚBarrierProxy)Ú__getattribute__rƒ   ÚabortÚresetNc                 C   s   |   d|f¡S rB  r  rë   r   r   r   rƒ   [  s    zBarrierProxy.waitc                 C   s
   |   d¡S )NrK  r  r.   r   r   r   rK  ]  s    zBarrierProxy.abortc                 C   s
   |   d¡S )NrL  r  r.   r   r   r   rL  _  s    zBarrierProxy.resetc                 C   s   |   dd¡S )NrJ  )Úpartiesr  r.   r   r   r   rM  a  s    zBarrierProxy.partiesc                 C   s   |   dd¡S )NrJ  )Ú	n_waitingr  r.   r   r   r   rN  d  s    zBarrierProxy.n_waitingc                 C   s   |   dd¡S )NrJ  )Úbrokenr  r.   r   r   r   rO  g  s    zBarrierProxy.broken)N)r4   r6   r7   rø   rƒ   rK  rL  r  rM  rN  rO  r   r   r   r   rI  Y  s   


rI  c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚNamespaceProxy)rJ  Ú__setattr__Ú__delattr__c                 C   s0   |d dkrt  | |¡S t  | d¡}|d|fƒS )Nr   rT   r  rJ  )ÚobjectrJ  ©r,   r  Ú
callmethodr   r   r   Ú__getattr__n  s    zNamespaceProxy.__getattr__c                 C   s4   |d dkrt  | ||¡S t  | d¡}|d||fƒS )Nr   rT   r  rQ  )rS  rQ  rJ  )r,   r  rÄ   rU  r   r   r   rQ  s  s    zNamespaceProxy.__setattr__c                 C   s0   |d dkrt  | |¡S t  | d¡}|d|fƒS )Nr   rT   r  rR  )rS  rR  rJ  rT  r   r   r   rR  x  s    zNamespaceProxy.__delattr__N)r4   r6   r7   rø   rV  rQ  rR  r   r   r   r   rP  l  s   rP  c                   @   s*   e Zd ZdZdd„ Zdd„ ZeeeƒZdS )Ú
ValueProxy)r˜   r±   c                 C   s
   |   d¡S )Nr˜   r  r.   r   r   r   r˜   �  s    zValueProxy.getc                 C   s   |   d|f¡S rH  r  r2  r   r   r   r±   ƒ  s    zValueProxy.setN)r4   r6   r7   rø   r˜   r±   r  rÄ   r   r   r   r   rW    s   rW  ÚBaseListProxy)Ú__add__Ú__contains__Ú__delitem__Ú__getitem__Ú__len__Ú__mul__Ú__reversed__Ú__rmul__Ú__setitem__rP   ÚcountÚextendÚindexÚinsertr¸   ÚremoveÚreverser­   Ú__imul__c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú	ListProxyc                 C   s   |   d|f¡ | S )Nrc  r  r2  r   r   r   Ú__iadd__�  s    zListProxy.__iadd__c                 C   s   |   d|f¡ | S )Nrh  r  r2  r   r   r   rh  ’  s    zListProxy.__imul__N)r4   r6   r7   rj  rh  r   r   r   r   ri  Ž  s   ri  Ú	DictProxy)rZ  r[  r\  r8  r]  ra  r	  rÿ   r˜   r!   r"   r¸   ÚpopitemÚ
setdefaultr+  r#   r8  ÚIteratorÚ
ArrayProxy)r]  r\  ra  Ú	PoolProxy)ZapplyÚapply_asyncrŽ   ÚimapÚimap_unorderedr®   ÚmapÚ	map_asyncÚstarmapÚstarmap_asyncrõ   ZAsyncResult)rq  ru  rw  rr  rs  c                   @   s   e Zd Zdd„ Zdd„ ZdS )rp  c                 C   s   | S r   r   r.   r   r   r   rñ   ²  s    zPoolProxy.__enter__c                 C   s   |   ¡  d S r   )rõ   rò   r   r   r   rô   ´  s    zPoolProxy.__exit__N)r4   r6   r7   rñ   rô   r   r   r   r   rp  ±  s   c                   @   s   e Zd ZdS )r   N)r4   r6   r7   r   r   r   r   r   »  s   ÚQueueZJoinableQueuers   rm   ÚRLockÚ	SemaphoreÚBoundedSemaphoreÚ	ConditionÚBarrierÚPoolr$   r½   )r¿   r  )r  c                   @   sH   e Zd Zg fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )Ú_SharedMemoryTrackerc                 C   s   || _ || _d S r   ©Zshared_memory_context_nameÚsegment_names)r,   r   r�  r   r   r   r-   ã  s    z_SharedMemoryTracker.__init__c                 C   s(   t  d|›dtƒ › �¡ | j |¡ d S )NzRegister segment ú in pid )r   rz   r   r�  rP   ©r,   Úsegment_namer   r   r   Úregister_segmentç  s    z%_SharedMemoryTracker.register_segmentc                 C   sB   t  d|›dtƒ › �¡ | j |¡ t |¡}| ¡  | ¡  d S )NzDestroy segment r‚  )	r   rz   r   r�  rf  r   ÚSharedMemoryrŽ   Úunlink)r,   r„  Zsegmentr   r   r   Údestroy_segmentì  s
    
z$_SharedMemoryTracker.destroy_segmentc                 C   s"   | j d d … D ]}|  |¡ qd S r   )r�  rˆ  rƒ  r   r   r   r‡  õ  s    z_SharedMemoryTracker.unlinkc                 C   s(   t  d| jj› dtƒ › �¡ |  ¡  d S )NzCall z.__del__ in )r   rz   r3   r4   r   r‡  r.   r   r   r   Ú__del__ú  s    z_SharedMemoryTracker.__del__c                 C   s   | j | jfS r   r€  r.   r   r   r   r/   þ  s    z!_SharedMemoryTracker.__getstate__c                 C   s   | j |Ž  d S r   )r-   r0   r   r   r   r2     s    z!_SharedMemoryTracker.__setstate__N)
r4   r6   r7   r-   r…  rˆ  r‡  r‰  r/   r2   r   r   r   r   r  à  s   	r  c                   @   sR   e Zd Zejdddg Zdd„ Zdd„ Zde_d	d
„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚSharedMemoryServerÚtrack_segmentÚrelease_segmentÚlist_segmentsc                 O   sZ   t j| f|ž|Ž | j}t|tƒr,t |¡}td|› dtƒ › �ƒ| _	t
 dtƒ › �¡ d S )NZshm_rT   z"SharedMemoryServer started by pid )rV   r-   r*   rG   rc   ÚosÚfsdecoder  r   Úshared_memory_contextr   rz   )r,   r?   Úkwargsr*   r   r   r   r-   
  s    

ÿzSharedMemoryServer.__init__c                  O   st   t | ƒdkr| d }n4d|kr(|d }n"| s6tdƒ‚ntdt | ƒd  ƒ‚ttj| d dƒrhtj|d	< tj| |ŽS )
Nr´   r¶   r)   zDdescriptor 'create' of 'SharedMemoryServer' object needs an argumentrµ   r	   r  Z_shared_memory_proxyr�  )r¯   rI   rö   r,   rd   r�  rV   rX   )r?   r‘  Ztypeodr)   r   r   r   rX     s    



ÿ
zSharedMemoryServer.createz&($self, c, typeid, /, *args, **kwargs)c                 C   s   | j  ¡  t | |¡S r   )r�  r‡  rV   rW   rª   r   r   r   rW   )  s    
zSharedMemoryServer.shutdownc                 C   s   | j  |¡ d S r   )r�  r…  ©r,   r=   r„  r   r   r   r‹  .  s    z SharedMemoryServer.track_segmentc                 C   s   | j  |¡ d S r   )r�  rˆ  r’  r   r   r   rŒ  2  s    z"SharedMemoryServer.release_segmentc                 C   s   | j jS r   )r�  r�  rª   r   r   r   r�  7  s    z SharedMemoryServer.list_segmentsN)r4   r6   r7   rV   rÁ   r-   rX   rÂ   rW   r‹  rŒ  r�  r   r   r   r   rŠ    s   ÿ
rŠ  c                   @   s8   e Zd ZeZdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Z	dS )r   c                 O   sN   t jdkrddlm} | ¡  tj| f|ž|Ž t | j	j
› dtƒ › �¡ d S )NÚposixr	   )Úresource_trackerz created by pid )rŽ  r   Ú r”  Zensure_runningr   r-   r   rz   r3   r4   r   )r,   r?   r‘  r”  r   r   r   r-   I  s
    
zSharedMemoryManager.__init__c                 C   s   t  | jj› dtƒ › �¡ d S )Nz.__del__ by pid )r   rz   r3   r4   r   r.   r   r   r   r‰  U  s    zSharedMemoryManager.__del__c                 C   sh   | j jtjkrP| j jtjkr&tdƒ‚n*| j jtjkr>tdƒ‚ntd | j j¡ƒ‚|  | j	| j
| j| j¡S )Nz"Already started SharedMemoryServerz!SharedMemoryManager has shut downrÑ   )rË   rÄ   rÃ   rÅ   rÆ   r   rÇ   rJ   ræ   rÒ   rÉ   rÊ   rÌ   r.   r   r   r   rÓ   Y  s    

ÿ ÿzSharedMemoryManager.get_serverc                 C   sx   | j | j| jd��\}tjd d|d�}zt|d d|jfƒ W n. tk
rh } z| ¡  |‚W 5 d }~X Y nX W 5 Q R X |S )NrÔ   T)rX   Úsizer‹  )	rÍ   rÉ   rÊ   r   r†  rC   r   ÚBaseExceptionr‡  )r,   r–  r›   Zsmsr“   r   r   r   r†  f  s     z SharedMemoryManager.SharedMemoryc                 C   sv   | j | j| jd��Z}t |¡}zt|d d|jjfƒ W n0 tk
rf } z|j 	¡  |‚W 5 d }~X Y nX W 5 Q R X |S )NrÔ   r‹  )
rÍ   rÉ   rÊ   r   ÚShareableListrC   Zshmr   r—  r‡  )r,   r3  r›   Zslr“   r   r   r   r˜  r  s    

 z!SharedMemoryManager.ShareableListN)
r4   r6   r7   rŠ  ræ   r-   r‰  rÓ   r†  r˜  r   r   r   r   r   =  s   
)NNNT)T)SÚ__all__rw   rl   rã   r   ZqueuerD  rŽ  r   r²   r   r•  r
   Úcontextr   r   r   r   r   r   r   r   Z	HAS_SHMEMÚImportErrorr   r  Z
view_typesr$   r'   Z	view_typerS  r   rC   r<   rŒ   rK   rS   rU   rV   rÃ   rp   rq   ZXmlListenerZ	XmlClientrg   r   r±   r  r   r#  r)  r   r*  r-  r4  r5  r:  r?  rG  rI  rP  rW  rX  ri  rk  rù   ro  ZBasePoolProxyrp  r   rx  rs   rm   ry  rz  r{  r|  r}  r~  r½   r  rŠ  r   r   r   r   r   Ú<module>   sÌ   ÿ


  c

þ	 w
 4    ÿ

	
	
 ÿ

û

ÿ%8