o
    €¨Êh•�  ã                   @   sú  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 ddlm	Z	 ddlm
Z
 dd	lmZ dd
lmZ d dlmZ d dlmZ g d¢Ze jd  dkZerZdd„ Zndd„ Ze
 eje¡ dd„ dD ƒZed  eur�dd„ ZeD ]Ze
 ee¡ qxG dd„ dƒ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%ƒZ!G d&d'„ d'ƒZ"ej#ej$fej%ej&fd(œZ'G d)d*„ d*ƒZ(G d+d,„ d,e)ƒZ*G d-d.„ d.ƒZ+d/d0„ Z,i fd1d2„Z-		3dkd4d5„Z.G d6d7„ d7ƒZ/G d8d9„ d9ƒZ0dld:d;„Z1G d<d=„ d=e+ƒZ2G d>d?„ d?e+ƒZ3G d@dA„ dAe3ƒZ4G dBdC„ dCe+ƒZ5G dDdE„ dEe+ƒZ6G dFdG„ dGe+ƒZ7G dHdI„ dIe+ƒZ8dJZ9e�s9e9dK7 Z9e-dLe9ƒZ:G dMdN„ dNe:ƒZ;e-dOdPƒZ<dQZ=e�sTe=dR7 Z=e-dSe=ƒZ>e-dTdUƒZ?dVdVdVdWdWdXœe?_@G dYdT„ dTe?ƒZAG dZd[„ d[e(ƒZBeB d\e¡ eB d]e¡ eB d^ejCe5¡ eB d_ejDe3¡ eB d`ejEe3¡ eB daejFe3¡ eB dbejGe3¡ eB dcejHe4¡ eIeddƒ�rÁeB ddejJe6¡ eB deejKeA¡ eB dfee;¡ eB dgeLe<¡ eB d9e0e8¡ eB d;e1e>¡ eB d7e/e7¡ eBjdWe2dhdi� eBjdVdhdj� dS )mé    N)Ú
format_excé   )Ú
connection)Úcontext)Úpool)Úprocess)Ú	reduction)Úutil)Úget_context)ÚQueue)Ú	monotonic)ÚBaseManagerÚSyncManagerÚ	BaseProxyÚTokené   c                 C   ó   t j | j|  ¡ ffS ©N)ÚarrayÚtypecodeÚtobytes©Úa© r   úC/var/www/html/env/lib/python3.10/site-packages/billiard/managers.pyÚreduce_array*   ó   r   c                 C   r   r   )r   r   Útostringr   r   r   r   r   -   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_list5   ó   r*   c                   @   s4   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ ZdS )r   z3
    Type to uniquely identify a shared object
    ©ÚtypeidÚaddressÚidc                 C   s   |||| _ | _| _d S r   r,   )Úselfr-   r.   r/   r   r   r   Ú__init__E   s   zToken.__init__c                 C   s   | j | j| jfS r   r,   ©r0   r   r   r   Ú__getstate__H   ó   zToken.__getstate__c                 C   s   |\| _ | _| _d S r   r,   )r0   Ústater   r   r   Ú__setstate__K   r   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/   r2   r   r   r   Ú__repr__N   s   ÿzToken.__repr__N)	r8   Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r1   r3   r6   r9   r   r   r   r   r   ?   s    r   r   c                 C   s4   |   ||||f¡ |  ¡ \}}|dkr|S t||ƒ‚)zL
    Send a message to manager using connection `c` and return response
    ú#RETURN)ÚsendÚrecvÚconvert_to_error)Úcr/   Ú
methodnameÚargsÚkwdsÚkindÚresultr   r   r   ÚdispatchW   s
   
rH   c                 C   sX   | dkr|S | dkrt |ƒtu sJ ‚t|ƒS | dkr(t |ƒtu s"J ‚td| ƒS tdƒS )Nú#ERRORú
#TRACEBACKú#UNSERIALIZABLEzUnserializable message: %s
zUnrecognized message type)r   ÚstrÚRemoteErrorÚ
ValueError)rF   rG   r   r   r   rA   b   s   rA   c                   @   s   e Zd Zdd„ ZdS )rM   c                 C   s   dt | jd ƒ d S )NzM
---------------------------------------------------------------------------
r   zK---------------------------------------------------------------------------)rL   rD   r2   r   r   r   Ú__str__q   s   zRemoteError.__str__N)r8   r:   r;   rO   r   r   r   r   rM   o   s    rM   c                 C   s2   g }t | ƒD ]}t| |ƒ}t|ƒr| |¡ q|S )z4
    Return a list of names of methods of `obj`
    )Údirr   ÚcallableÚappend)r)   Útempr"   Úfuncr   r   r   Úall_methodsy   s   

€rU   c                 C   s   dd„ t | ƒD ƒS )zP
    Return a list of names of methods of `obj` which do not start with '_'
    c                 S   s   g | ]
}|d  dkr|‘qS )r   Ú_r   r    r   r   r   r#   ‰   s    z"public_methods.<locals>.<listcomp>)rU   r(   r   r   r   Úpublic_methods…   s   rW   c                   @   s¬   e Zd ZdZg 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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   sb   t |tƒsJ ‚|| _t |¡| _t| \}}||dd�| _| jj| _ddi| _	i | _
t ¡ | _d S )Né   )r.   ÚbacklogÚ0©Nr   )Ú
isinstanceÚbytesÚregistryr   ÚAuthenticationStringÚauthkeyÚlistener_clientÚlistenerr.   Ú	id_to_objÚid_to_refcountÚ	threadingÚRLockÚmutex)r0   rh   r.   rj   Ú
serializerÚListenerÚClientr   r   r   r1   —   s   

zServer.__init__c              	   C   sÖ   t  ¡ | _| t ¡ _zGt j| jd�}d|_| 	¡  z| j 
¡ s*| j d¡ | j 
¡ rW n ttfy6   Y nw W tjtjkrKt d¡ tjt_tjt_t d¡ dS tjtjkret d¡ tjt_tjt_t d¡ w )z(
        Run the server forever
        )ÚtargetTr   zresetting stdout, stderrr   N)ro   ÚEventÚ
stop_eventr   Úcurrent_processÚ_manager_serverÚThreadÚaccepterÚdaemonÚstartÚis_setÚwaitÚKeyboardInterruptÚ
SystemExitÚsysÚstdoutÚ
__stdout__r	   ÚdebugÚ
__stderr__ÚstderrÚexit)r0   r{   r   r   r   Úserve_forever¥   s2   



ÿ€ÿ€
ü
zServer.serve_foreverc                 C   sF   	 z| j  ¡ }W n	 ty   Y q w tj| j|fd�}d|_| ¡  q)NT©ru   rD   )rl   ÚacceptÚOSErrorro   rz   Úhandle_requestr|   r}   )r0   rB   Útr   r   r   r{   »   s   ÿùzServer.accepterc                 C   sJ  d } }}z*t  || j¡ t  || j¡ | ¡ }|\}}}}|| jv s*J d| ƒ‚t| |ƒ}W n ty>   dtƒ f}	Y n!w z||g|¢R i |¤Ž}W n tyZ   dtƒ f}	Y nw d|f}	z| 	|	¡ W n8 tyž }
 z,z
| 	dtƒ f¡ W n	 ty�   Y nw t
 d|	¡ t
 d|¡ t
 d|
¡ W Y d}
~
nd}
~
ww | ¡  dS )z)
        Handle a new connection
        Nz%r unrecognizedrJ   r>   zFailure to send message: %rz ... request was %rú ... exception was %r)r   Údeliver_challengerj   Úanswer_challenger@   Úpublicr   Ú	Exceptionr   r?   r	   ÚinfoÚclose)r0   rB   ÚfuncnamerG   ÚrequestÚignorerD   rE   rT   ÚmsgÚexcr   r   r   r�   Å   s>   ÿÿÿ€ù	zServer.handle_requestc                 C   sv  t  dt ¡ j¡ |j}|j}| j}| j 	¡ �s9zod }}|ƒ }|\}}}	}
|| \}}}||vr<t
d|t|ƒ|f ƒ‚t||ƒ}z	||	i |
¤Ž}W n ty` } z
d|f}W Y d}~n*d}~ww |oh| |d¡}|r‚|  |||¡\}}t|| j|ƒ}d||ff}nd|f}W n^ t
yÂ   |du r˜dtƒ f}n(z| j| }|| |||g|	¢R i |
¤Ž}d|f}W n ty¿   dtƒ f}Y nw Y n$ tyØ   t  dt ¡ j¡ t d	¡ Y n tyå   dtƒ f}Y nw zz||ƒ W n tyþ   |d
t|ƒfƒ Y nw W n1 t�y1 } z$t  dt ¡ j¡ t  d|¡ t  d|¡ | ¡  t d¡ W Y d}~nd}~ww | j 	¡ rdS 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=%rrI   ú#PROXYr>   rJ   z$got EOF -- exiting thread serving %rr   rK   zexception in thread serving %rz ... message was %rr�   r   )r	   r…   ro   Úcurrent_threadr"   r@   r?   rm   rw   r~   ÚAttributeErrorr   r   r“   ÚgetrZ   r   r.   r   Úfallback_mappingÚEOFErrorr‚   rˆ   Úreprr”   r•   )r0   Úconnr@   r?   rm   rC   r)   r—   ÚidentrD   rE   ÚexposedÚ	gettypeidÚfunctionÚresrš   r™   r-   ÚridentÚrexposedÚtokenÚfallback_funcrG   r   r   r   Úserve_clientç   s–   ÿ
ÿÿ
€ÿ€
ÿÿÿÿ€ÿÿÿ€ÿ€úÉzServer.serve_clientc                 C   s   |S r   r   ©r0   r¢   r£   r)   r   r   r   Úfallback_getvalue1  ó   zServer.fallback_getvaluec                 C   ó   t |ƒS r   ©rL   r­   r   r   r   Úfallback_str4  ó   zServer.fallback_strc                 C   r°   r   )r¡   r­   r   r   r   Úfallback_repr7  r³   zServer.fallback_repr)rO   r9   ú	#GETVALUEc                 C   s   d S r   r   ©r0   rB   r   r   r   r_   @  r¯   zServer.dummyc              
   C   s�   | j �; g }t| j ¡ ƒ}| ¡  |D ]}|dkr1| d|| j| t| j| d ƒdd… f ¡ qd |¡W  d  ƒ S 1 sAw   Y  dS )zO
        Return some info --- useful to spot problems with refcounting
        rd   z  %s:       refcount=%s
    %sr   NéK   Ú
)	rq   r'   rm   r%   ÚsortrR   rn   rL   Újoin)r0   rB   rG   r%   r£   r   r   r   r]   C  s   
ÿÿ€$÷zServer.debug_infoc                 C   s   t | jƒd S )z*
        Number of shared objects
        r   )Úlenrm   r¶   r   r   r   r^   R  s   zServer.number_of_objectsc                 C   s`   z)zt  d¡ | d¡ W n   ddl}| ¡  Y W | j ¡  dS W | j ¡  dS | j ¡  w )z'
        Shutdown this process
        z!Manager received shutdown message©r>   Nr   N)r	   r…   r?   Ú	tracebackÚ	print_excrw   Úset)r0   rB   r½   r   r   r   rY   X  s   
ûzServer.shutdownc                 O   s  | j �t | j| \}}}}|du r t|ƒdkr|rJ ‚|d }	n||i |¤Ž}	|du r/t|	ƒ}|durCt|ƒtu s;J ‚t|ƒt|ƒ }dt|	ƒ }
t 	d||
¡ |	t
|ƒ|f| j|
< |
| jvrdd| j|
< |  ||
¡ |
t|ƒfW  d  ƒ S 1 szw   Y  dS )z>
        Create a new shared object and return its id
        Nr   r   z%xz&%r callable returned object with id %r)rq   rh   r»   rW   r   Údictr'   r/   r	   r…   r¿   rm   rn   r`   Útuple)r0   rB   r-   rD   rE   rQ   r¤   Úmethod_to_typeidÚ	proxytyper)   r£   r   r   r   rZ   e  s(   
ÿ



$ãzServer.createc                 C   s   t | j|j d ƒS )zL
        Return the methods of the shared object indicated by token
        r   )rÁ   rm   r/   )r0   rB   rª   r   r   r   r\   ˆ  s   zServer.get_methodsc                 C   s"   |t  ¡ _| d¡ |  |¡ dS )z=
        Spawn a new thread to serve this connection
        r¼   N)ro   rœ   r"   r?   r¬   )r0   rB   r"   r   r   r   r[   Ž  s   

zServer.accept_connectionc                 C   s>   | j � | j|  d7  < W d   ƒ d S 1 sw   Y  d S )Nr   )rq   rn   ©r0   rB   r£   r   r   r   r`   –  s   "ÿzServer.increfc                 C   sŠ   | j �8 | j| dksJ ‚| j|  d8  < | j| dkr3| j|= | j|= t d|¡ W d   ƒ d S W d   ƒ d S 1 s>w   Y  d S )Nr   r   zdisposing of obj with id %r)rq   rn   rm   r	   r…   rÄ   r   r   r   ra   š  s   û"ýzServer.decrefN)r8   r:   r;   r<   r’   r1   r‰   r{   r�   r¬   r®   r²   r´   rŸ   r_   r]   r^   rY   rZ   r\   r[   r`   ra   r   r   r   r   rX   �   s0    
"Jý#rX   c                   @   s   e Zd ZdgZdZdZdZdS )ÚStateÚvaluer   r   é   N)r8   r:   r;   r=   ÚINITIALÚSTARTEDÚSHUTDOWNr   r   r   r   rÅ   §  s
    rÅ   )ÚpickleÚ	xmlrpclibc                   @   s´   e Zd ZdZi ZeZ		d$dd„Z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 u r	t  ¡ j}|| _t  |¡| _tƒ | _tj| j_	|| _
t| \| _| _|p*tƒ | _d S r   )r   rx   rj   Ú_addressri   Ú_authkeyrÅ   Ú_staterÈ   rÆ   Ú_serializerrk   Ú	_ListenerÚ_Clientr
   Ú_ctx)r0   r.   rj   rr   Úctxr   r   r   r1   Â  s   

zBaseManager.__init__c                 C   s   t | ƒj| j| j| jffS r   )r   Úfrom_addressrÍ   rÎ   rÐ   r2   r   r   r   Ú
__reduce__Î  s   ÿzBaseManager.__reduce__c                 C   s(   | j jtjks	J ‚t| j| j| j| jƒS )zX
        Return server object with serve_forever() method and address attribute
        )	rÏ   rÆ   rÅ   rÈ   rX   Ú	_registryrÍ   rÎ   rÐ   r2   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
        ©rj   Nr_   )	rk   rÐ   rÍ   rÎ   rH   rÅ   rÉ   rÏ   rÆ   )r0   rs   rt   r¢   r   r   r   ÚconnectÚ  s   zBaseManager.connectr   c              	   C   sö   | j jtjks	J ‚|durt|ƒst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
        Nzinitializer must be a callableF)ÚduplexrŠ   ú:c                 s   s   � | ]}t |ƒV  qd S r   r±   )r!   Úir   r   r   Ú	<genexpr>õ  s   € z$BaseManager.start.<locals>.<genexpr>ú-r   ©rD   Úexitpriority)rÏ   rÆ   rÅ   rÈ   rQ   Ú	TypeErrorr   ÚPiperÓ   ÚProcessr   Ú_run_serverr×   rÍ   rÎ   rÐ   Ú_processrº   Ú	_identityr8   r"   r}   r•   r@   rÉ   r	   ÚFinalizeÚ_finalize_managerrÒ   rY   )r0   ÚinitializerÚinitargsÚreaderÚwriterr£   r   r   r   r}   ã  s0   
ÿþ



ÿüzBaseManager.startc           	      C   sN   |dur||Ž  |   ||||¡}| |j¡ | ¡  t d|j¡ | ¡  dS )z@
        Create a server, report its address and run it
        Nzmanager serving at %r)Ú_Serverr?   r.   r•   r	   r”   r‰   )	Úclsrh   r.   rj   rr   rí   rê   rë   Úserverr   r   r   rå     s   zBaseManager._run_serverc                 O   sl   | j jtjksJ dƒ‚| j| j| jd�}zt|dd|f| |ƒ\}}W | ¡  n| ¡  w t	|| j|ƒ|fS )zP
        Create a new shared object; return the token and exposed tuple
        zserver not yet startedrÙ   NrZ   )
rÏ   rÆ   rÅ   rÉ   rÒ   rÍ   rÎ   rH   r•   r   )r0   r-   rD   rE   r¢   r/   r¤   r   r   r   Ú_create  s   

ÿzBaseManager._createc                 C   s2   | j dur| j  |¡ | j  ¡ sd| _ dS dS dS )zC
        Join the manager process (if it has been spawned)
        N)ræ   rº   Úis_alive©r0   Útimeoutr   r   r   rº   (  s   


ýzBaseManager.joinc                 C   ó4   | j | j| jd�}zt|ddƒW | ¡  S | ¡  w )zS
        Return some info about the servers shared objects and connections
        rÙ   Nr]   ©rÒ   rÍ   rÎ   rH   r•   ©r0   r¢   r   r   r   Ú_debug_info1  ó   zBaseManager._debug_infoc                 C   rõ   )z5
        Return the number of shared objects
        rÙ   Nr^   rö   r÷   r   r   r   Ú_number_of_objects;  rù   zBaseManager._number_of_objectsc                 C   s,   | j jtjkr|  ¡  | j jtjksJ ‚| S r   )rÏ   rÆ   rÅ   rÈ   r}   rÉ   r2   r   r   r   Ú	__enter__E  s   zBaseManager.__enter__c                 C   ó   |   ¡  d S r   )rY   ©r0   Úexc_typeÚexc_valÚexc_tbr   r   r   Ú__exit__K  ó   zBaseManager.__exit__c                 C   sÞ   |   ¡ rYt d¡ z|||d�}zt|ddƒ W | ¡  n| ¡  w W n	 ty,   Y nw | jdd� |   ¡ rYt d¡ t| dƒrYt d	¡ |  ¡  | jd
d� |   ¡ rYt d¡ t	j
|_ztj|= W dS  tyn   Y dS w )zQ
        Shutdown the manager process; will be registered as a finalizer
        z#sending shutdown message to managerrÙ   NrY   g      ð?)rô   zmanager still aliveÚ	terminatez'trying to `terminate()` manager processgš™™™™™¹?z#manager still alive after terminate)rò   r	   r”   rH   r•   r“   rº   Úhasattrr  rÅ   rÊ   rÆ   r   Ú_address_to_localÚKeyError)r   r.   rj   r5   rÒ   r¢   r   r   r   ré   N  s2   
ÿ



ÿzBaseManager._finalize_managerc                 C   ó   | j S r   )rÍ   r2   r   r   r   Ú<lambda>n  s    zBaseManager.<lambda>Tc           
         sÆ   d| j vr| j ¡ | _ˆ du rt‰ |ptˆ ddƒ}|p tˆ ddƒ}|rD| ¡ D ]\}}t|ƒtu s7J d| ƒ‚t|ƒtu sCJ d| ƒ‚q'|||ˆ f| jˆ< |ra‡ ‡fdd„}	ˆ|	_t	| ˆ|	ƒ dS dS )z9
        Register a typeid with the manager type
        r×   NÚ	_exposed_Ú_method_to_typeid_z%r is not a stringc                    sf   t  dˆ¡ | jˆg|¢R i |¤Ž\}}ˆ || j| | j|d�}| j|j| jd�}t|d d|jfƒ |S )Nz)requesting creation of a shared %r object©Úmanagerrj   r¤   rÙ   ra   )	r	   r…   rñ   rÐ   rÎ   rÒ   r.   rH   r/   )r0   rD   rE   rª   ÚexpÚproxyr¢   ©rÃ   r-   r   r   rS   �  s   þz"BaseManager.register.<locals>.temp)
Ú__dict__r×   ÚcopyÚ	AutoProxyr   r$   r   rL   r8   Úsetattr)
rï   r-   rQ   rÃ   r¤   rÂ   Úcreate_methodÚkeyrÆ   rS   r   r  r   Úregisterp  s&   

þ
ÿ
ôzBaseManager.register)NNrË   Nre   r   )NNNNT)r8   r:   r;   r<   r×   rX   rî   r1   rÖ   rØ   rÚ   r}   Úclassmethodrå   rñ   rº   rø   rú   rû   r  Ústaticmethodré   Úpropertyr.   r  r   r   r   r   r   »  s6    
ÿ
	$ÿ
	


ÿr   c                   @   ó   e Zd Zdd„ Zdd„ ZdS )ÚProcessLocalSetc                 C   s   t  | dd„ ¡ d S )Nc                 S   ó   |   ¡ S r   )Úclearr(   r   r   r   r  ¢  s    z*ProcessLocalSet.__init__.<locals>.<lambda>)r	   Úregister_after_forkr2   r   r   r   r1   ¡  r   zProcessLocalSet.__init__c                 C   s   t | ƒdfS re   )r   r2   r   r   r   rÖ   ¤  r  zProcessLocalSet.__reduce__N)r8   r:   r;   r1   rÖ   r   r   r   r   r  Ÿ  ó    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
    NTc                 C   sì   t j�! t j |jd ¡}|d u rt ¡ tƒ f}|t j|j< W d   ƒ n1 s'w   Y  |d | _|d | _	|| _
| j
j| _|| _|| _t| d | _|d urVt |¡| _n| jd ura| jj| _nt ¡ j| _|rm|  ¡  t | t j¡ d S )Nr   r   )r   Ú_mutexr  rž   r.   r	   ÚForkAwareLocalr  Ú_tlsÚ_idsetÚ_tokenr/   Ú_idÚ_managerrÐ   rk   rÒ   r   ri   rÎ   rx   rj   Ú_increfr  Ú_after_fork)r0   rª   rr   r  rj   r¤   r`   Ú	tls_idsetr   r   r   r1   ³  s,   €ü



zBaseProxy.__init__c                 C   sd   t  d¡ t ¡ j}t ¡ jdkr|dt ¡ j 7 }| j| jj	| j
d�}t|d d|fƒ || j_d S )Nzmaking connection to managerÚ
MainThreadú|rÙ   r[   )r	   r…   r   rx   r"   ro   rœ   rÒ   r$  r.   rÎ   rH   r"  r   )r0   r"   r¢   r   r   r   Ú_connectÖ  s   

zBaseProxy._connectr   c                 C   sä   z| j j}W n ty    t dt ¡ j¡ |  ¡  | j j}Y nw | 	| j
|||f¡ | ¡ \}}|dkr7|S |dkrm|\}}| jj|j d }	| jj|_|	|| j| j| j|d�}
| j|j| jd�}t|dd|jfƒ |
S t||ƒ‚)	zW
        Try to call a method of the referrent and return a copy of the result
        z#thread %r does not own a connectionr>   r›   éÿÿÿÿr  rÙ   Nra   )r"  r   r�   r	   r…   ro   rœ   r"   r,  r?   r%  r@   r&  r×   r-   r$  r.   rÐ   rÎ   rÒ   rH   r/   rA   )r0   rC   rD   rE   r¢   rF   rG   r¤   rª   rÃ   r  r   r   r   Ú_callmethodß  s2   ÿü

þ
zBaseProxy._callmethodc                 C   ó
   |   d¡S )z9
        Get a copy of the value of the referent
        rµ   ©r.  r2   r   r   r   Ú	_getvalueý  s   
zBaseProxy._getvaluec              	   C   s‚   | j | jj| jd�}t|d d| jfƒ t d| jj¡ | j	 
| j¡ | jo(| jj}tj| tj| j| j|| j| j	| j fdd�| _d S )NrÙ   r`   z	INCREF %ré
   rà   )rÒ   r$  r.   rÎ   rH   r%  r	   r…   r/   r#  Úaddr&  rÏ   rè   r   Ú_decrefr"  Ú_close)r0   r¢   r5   r   r   r   r'    s   
ÿüzBaseProxy._increfc              
   C   sÌ   |  | j¡ |d u s|jtjkrBzt d| j¡ || j|d�}t|d d| jfƒ W n t	yA } zt d|¡ W Y d }~nd }~ww t d| j¡ |sbt
|dƒrdt dt ¡ j¡ |j ¡  |`d S d S d S )Nz	DECREF %rrÙ   ra   z... decref failed %sz%DECREF %r -- manager already shutdownr   z-thread %r has no more proxies so closing conn)Údiscardr/   rÆ   rÅ   rÉ   r	   r…   r.   rH   r“   r  ro   rœ   r"   r   r•   )rª   rj   r5   ÚtlsÚidsetrÒ   r¢   rš   r   r   r   r4    s$   €ÿÿ
üzBaseProxy._decrefc              
   C   sH   d | _ z|  ¡  W d S  ty# } zt d|¡ W Y d }~d S d }~ww )Nzincref failed: %s)r&  r'  r“   r	   r”   )r0   rš   r   r   r   r(  ,  s   €þzBaseProxy._after_forkc                 C   s\   i }t  ¡ d ur| j|d< t| ddƒr"| j|d< tt| j| j|ffS tt	| ƒ| j| j|ffS )Nrj   Ú_isautoFr¤   )
r   Úget_spawning_popenrÎ   r   r	  ÚRebuildProxyr  r$  rÐ   r   ©r0   rE   r   r   r   rÖ   4  s   

ÿÿzBaseProxy.__reduce__c                 C   r  r   )r1  )r0   Úmemor   r   r   Ú__deepcopy__A  r³   zBaseProxy.__deepcopy__c                 C   s   dt | ƒj| jjt| ƒf S )Nz<%s object, typeid %r at %#x>)r   r8   r$  r-   r/   r2   r   r   r   r9   D  s   ÿzBaseProxy.__repr__c                 C   s4   z|   d¡W S  ty   t| ƒdd… d  Y S w )zV
        Return representation of the referent (or a fall-back if that fails)
        r9   Nr-  z; '__str__()' failed>)r.  r“   r¡   r2   r   r   r   rO   H  s
   ÿzBaseProxy.__str__©NNNT)r8   r:   r;   r<   r  r	   ÚForkAwareThreadLockr   r1   r,  r.  r1  r'  r  r4  r(  rÖ   r>  r9   rO   r   r   r   r   r   ¬  s$    
ÿ#	
r   c                 C   sd   t t ¡ ddƒ}|r|j|jkr|j|j d S | dd¡o&t t ¡ ddƒ }| ||fd|i|¤ŽS )z‚
    Function used for unpickling proxy objects.

    If possible the shared object is returned, or otherwise a proxy for it.
    ry   Nr   r`   TÚ_inheritingF)r   r   rx   r.   rm   r/   Úpop)rT   rª   rr   rE   rð   r`   r   r   r   r;  V  s   þr;  c                 C   sn   t |ƒ}z|| |f W S  ty   Y nw i }|D ]}td||f |ƒ qt| tf|ƒ}||_||| |f< |S )zC
    Return an 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¤   Ú_cacheÚdicÚmethÚ	ProxyTyper   r   r   ÚMakeProxyTypel  s"   ÿÿÿrH  Tc           
      C   sž   t | d }|du r%|| j|d�}zt|dd| fƒ}W | ¡  n| ¡  w |du r0|dur0|j}|du r9t ¡ j}td| j	 |ƒ}|| ||||d�}	d|	_
|	S )z*
    Return an auto-proxy for `token`
    r   NrÙ   r\   zAutoProxy[%s])r  rj   r`   T)rk   r.   rH   r•   rÎ   r   rx   rj   rH  r-   r9  )
rª   rr   r  rj   r¤   r`   rÒ   r¢   rG  r  r   r   r   r  ‚  s    

ÿr  c                   @   r  )Ú	Namespacec                 K   s   | j  |¡ d S r   )r  Úupdater<  r   r   r   r1   ¢  r4   zNamespace.__init__c                 C   sZ   t | j ¡ ƒ}g }|D ]\}}| d¡s| d||f ¡ q| ¡  d| jjd |¡f S )NrV   z%s=%rz%s(%s)z, )	r'   r  r$   Ú
startswithrR   r¹   r7   r8   rº   )r0   Ú_itemsrS   r"   rÆ   r   r   r   r9   ¥  s   
€zNamespace.__repr__N)r8   r:   r;   r1   r9   r   r   r   r   rI     r  rI  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)r0   r   rÆ   Úlockr   r   r   r1   ±  s   
zValue.__init__c                 C   r  r   ©rO  r2   r   r   r   rž   µ  s   z	Value.getc                 C   s
   || _ d S r   rQ  ©r0   rÆ   r   r   r   r¿   ¸  ó   
z	Value.setc                 C   s   dt | ƒj| j| jf S )Nz
%s(%r, %r))r   r8   rN  rO  r2   r   r   r   r9   »  s   
ÿzValue.__repr__N©T)	r8   r:   r;   r1   rž   r¿   r9   r  rÆ   r   r   r   r   rM  ¯  s    
rM  c                 C   s   t   | |¡S r   )r   )r   ÚsequencerP  r   r   r   ÚArrayÁ  r  rV  c                   @   sT   e Zd Zejd dkrdZndZdd„ Zdd„ Zd	d
„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚIteratorProxyr   r   )Ú__next__r?   Úthrowr•   )rX  Únextr?   rY  r•   c                 G   ó   |   d|¡S )NrZ  r0  ©r0   rD   r   r   r   rZ  Ï  r  zIteratorProxy.nextc                 C   ó   | S r   r   r2   r   r   r   Ú__iter__Ò  r¯   zIteratorProxy.__iter__c                 G   r[  )NrX  r0  r\  r   r   r   rX  Õ  r  zIteratorProxy.__next__c                 G   r[  )Nr?   r0  r\  r   r   r   r?   Ø  r  zIteratorProxy.sendc                 G   r[  )NrY  r0  r\  r   r   r   rY  Û  r  zIteratorProxy.throwc                 G   r[  )Nr•   r0  r\  r   r   r   r•   Þ  r  zIteratorProxy.closeN)r8   r:   r;   r‚   Úversion_infoÚ_exposedr	  rZ  r^  rX  r?   rY  r•   r   r   r   r   rW  É  s    rW  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 u r|fn||f}|   d|¡S ©Nrb  r0  )r0   Úblockingrô   rD   r   r   r   rb  å  s   zAcquirerProxy.acquirec                 C   r/  ©Nrc  r0  r2   r   r   r   rc  é  rS  zAcquirerProxy.releasec                 C   r/  rd  r0  r2   r   r   r   rû   ì  rS  zAcquirerProxy.__enter__c                 C   r/  rf  r0  rý   r   r   r   r  ï  rS  zAcquirerProxy.__exit__)TN)r8   r:   r;   r	  rb  rc  rû   r  r   r   r   r   ra  â  s    
ra  c                   @   s4   e Zd ZdZddd„Zdd„ Zdd„ Zdd	d
„ZdS )ÚConditionProxy)rb  rc  r   ÚnotifyÚ
notify_allNc                 C   ó   |   d|f¡S ©Nr   r0  ró   r   r   r   r   ö  r+   zConditionProxy.waitc                 C   r/  )Nrh  r0  r2   r   r   r   rh  ù  rS  zConditionProxy.notifyc                 C   r/  )Nri  r0  r2   r   r   r   ri  ü  rS  zConditionProxy.notify_allc                 C   sf   |ƒ }|r|S |d urt ƒ | }nd }d }|s1|d ur'|t ƒ  }|dkr'	 |S |  |¡ |ƒ }|r|S )Nr   )r   r   )r0   Ú	predicaterô   rG   ÚendtimeÚwaittimer   r   r   Úwait_forÿ  s"   

þúzConditionProxy.wait_forr   )r8   r:   r;   r	  r   rh  ri  ro  r   r   r   r   rg  ó  s    
rg  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   r/  )Nr~   r0  r2   r   r   r   r~     rS  zEventProxy.is_setc                 C   r/  ©Nr¿   r0  r2   r   r   r   r¿     rS  zEventProxy.setc                 C   r/  )Nr  r0  r2   r   r   r   r    rS  zEventProxy.clearNc                 C   rj  rk  r0  ró   r   r   r   r     r+   zEventProxy.waitr   )r8   r:   r;   r	  r~   r¿   r  r   r   r   r   r   rp    s    rp  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   rj  rk  r0  ró   r   r   r   r   %  r+   zBarrierProxy.waitc                 C   r/  )Nrt  r0  r2   r   r   r   rt  (  rS  zBarrierProxy.abortc                 C   r/  )Nru  r0  r2   r   r   r   ru  +  rS  zBarrierProxy.resetc                 C   ó   |   dd¡S )Nrs  )Úpartiesr0  r2   r   r   r   rw  .  ó   zBarrierProxy.partiesc                 C   rv  )Nrs  )Ú	n_waitingr0  r2   r   r   r   ry  2  rx  zBarrierProxy.n_waitingc                 C   rv  )Nrs  )Úbrokenr0  r2   r   r   r   rz  6  rx  zBarrierProxy.brokenr   )r8   r:   r;   r	  r   rt  ru  r  rw  ry  rz  r   r   r   r   rr  "  s    


rr  c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚNamespaceProxy)rs  Ú__setattr__Ú__delattr__c                 C   s0   |d dkrt  | |¡S t  | d¡}|d|fƒS )Nr   rV   r.  rs  )Úobjectrs  ©r0   r  Ú
callmethodr   r   r   Ú__getattr__>  ó   zNamespaceProxy.__getattr__c                 C   s4   |d dkrt  | ||¡S t  | d¡}|d||fƒS )Nr   rV   r.  r|  )r~  r|  rs  )r0   r  rÆ   r€  r   r   r   r|  D  s   zNamespaceProxy.__setattr__c                 C   s0   |d dkrt  | |¡S t  | d¡}|d|fƒS )Nr   rV   r.  r}  )r~  r}  rs  r  r   r   r   r}  J  r‚  zNamespaceProxy.__delattr__N)r8   r:   r;   r	  r�  r|  r}  r   r   r   r   r{  ;  s
    r{  c                   @   s*   e Zd ZdZdd„ Zdd„ ZeeeƒZdS )Ú
ValueProxy)rž   r¿   c                 C   r/  )Nrž   r0  r2   r   r   r   rž   T  rS  zValueProxy.getc                 C   rj  rq  r0  rR  r   r   r   r¿   W  r+   zValueProxy.setN)r8   r:   r;   r	  rž   r¿   r  rÆ   r   r   r   r   rƒ  Q  s
    rƒ  )Ú__add__Ú__contains__Ú__delitem__Ú__getitem__Ú__len__Ú__mul__Ú__reversed__Ú__rmul__Ú__setitem__rR   ÚcountÚextendÚindexÚinsertrB  ÚremoveÚreverser¹   Ú__imul__)Ú__getslice__Ú__setslice__Ú__delslice__ÚBaseListProxyc                   @   r  )Ú	ListProxyc                 C   ó   |   d|f¡ | S )NrŽ  r0  rR  r   r   r   Ú__iadd__i  ó   zListProxy.__iadd__c                 C   r™  )Nr“  r0  rR  r   r   r   r“  m  r›  zListProxy.__imul__N)r8   r:   r;   rš  r“  r   r   r   r   r˜  g  s    r˜  Ú	DictProxy)r…  r†  r‡  rˆ  rŒ  r  r  rž   Úhas_keyr$   r%   rB  ÚpopitemÚ
setdefaultrJ  r&   )rˆ  r‡  rŒ  )r”  r•  Ú
ArrayProxyÚ	PoolProxy)ÚapplyÚapply_asyncr•   ÚimapÚimap_unorderedrº   ÚmapÚ	map_asyncÚstarmapÚstarmap_asyncr  ÚAsyncResultÚIterator)r£  r§  r©  r¤  r¥  c                   @   r  )r¡  c                 C   r]  r   r   r2   r   r   r   rû   �  r¯   zPoolProxy.__enter__c                 G   rü   r   )r  )r0   Úexc_infor   r   r   r  ’  r  zPoolProxy.__exit__N)r8   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 `billiard.Manager()` function creates started instances of
    this class.
    N)r8   r:   r;   r<   r   r   r   r   r   ›  s    r   r   ÚJoinableQueuerv   ÚLockrp   Ú	SemaphoreÚBoundedSemaphoreÚ	ConditionÚBarrierÚPoolr'   rÀ   F)rÃ   r  )r  r?  rT  )Mr‚   ro   r   r½   r   Ú r   r   r   r   r   r	   r
   Úqueuer   Útimer   Ú__all__r_  ÚPY3r   r  Ú
view_typesr'   r*   Ú	view_typer   rH   rA   r“   rM   rU   rW   rX   rÅ   rs   rt   ÚXmlListenerÚ	XmlClientrk   r   r¿   r  r   r;  rH  r  rI  rM  rV  rW  ra  rg  rp  rr  r{  rƒ  Ú_ListProxy_Attributesr—  r˜  rœ  Ú_ArrayProxy_Attributesr   ÚBasePoolProxyr
  r¡  r   rv   r®  rp   r¯  r°  r±  r  r²  r³  rÀ   r   r   r   r   Ú<module>   sÄ   
ÿ
  

þ
 e +
ÿ




û	
ÿ