
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!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                   @   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__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__Ú__doc__Ú	__slots__r-   r/   r2   r5   r   r   r   r   r   <   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
    ú#RETURNN)ÚsendÚrecvÚconvert_to_error)Úcr+   Ú
methodnameÚargsÚkwdsÚkindÚresultr   r   r   ÚdispatchS   s
    rD   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 strrG   zUnserializable message: %s
zUnrecognized message type {!r})Ú
isinstanceÚstrÚ	TypeErrorÚformatr   ÚRemoteErrorÚ
ValueError)rB   rC   r   r   r   r=   ]   s    
  ÿÿ
r=   c                   @   s   e Zd Zdd„ ZdS )rL   c                 C   s   dt | jd ƒ d S )NzM
---------------------------------------------------------------------------
r   zK---------------------------------------------------------------------------)rI   r@   r.   r   r   r   Ú__str__m   s    zRemoteError.__str__N)r4   r6   r7   rN   r   r   r   r   rL   l   s   rL   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_methodst   s    
rT   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>)rT   r%   r   r   r   Úpublic_methods   s    rV   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&e_d'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/S )0Ú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   )rH   ÚbytesrJ   rK   r   Úregistryr   ÚAuthenticationStringÚauthkeyÚlistener_clientÚlistenerr*   Ú	id_to_objÚid_to_refcountÚid_to_local_proxy_objÚ	threadingÚLockÚmutex)r,   re   r*   rg   Ú
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 )z(
        Run the server forever
        zresetting stdout, stderrr   )ÚtargetTr	   N)rm   Ú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©rs   r@   T)ri   ZacceptÚOSErrorrm   r   Úhandle_requestr�   r‚   )r,   r>   Útr   r   r   r€   ¸   s    
zServer.accepterc                 C   sL  d } }}zTt  || j¡ t  || j¡ | ¡ }|\}}}}|| jksTtd| ƒ‚t| |ƒ}W n tk
r~   dt	ƒ f}	Y n>X z||f|ž|Ž}W n tk
r²   dt	ƒ f}	Y n
X d|f}	z| 
|	¡ W nt tk
�r> }
 zTz| 
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 )z)
        Handle a new connection
        Nz%r unrecognizedrF   r:   zFailure to send message: %rz ... request was %rú ... exception was %r)r
   Zdeliver_challengerg   Zanswer_challenger<   ÚpublicÚAssertionErrorr   Ú	Exceptionr   r;   r   ÚinfoÚclose)r,   r>   ÚfuncnamerC   ÚrequestÚignorer@   rA   rS   ÚmsgÚer   r   r   rŠ   Â   s4    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 )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=%rrE   ú#PROXYr:   rF   z$got EOF -- exiting thread serving %rr   rG   zexception in thread serving %rz ... message was %rrŒ   r	   )r   r{   rm   Úcurrent_threadr   r<   r;   rj   ru   rƒ   ÚKeyErrorrl   ÚAttributeErrorr   r   r�   ÚgetrY   r   r*   r   Úfallback_mappingÚEOFErrorrx   r~   r�   r‘   )r,   Úconnr<   r;   rj   r?   r&   r“   Úidentr@   rA   ÚexposedÚ	gettypeidÚkeZ	second_keZfunctionÚresr–   r•   r)   ZridentZrexposedÚtokenZfallback_funcrC   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   ©rI   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)rN   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 )zO
        Return some info --- useful to spot problems with refcounting
        rb   z  %s:       refcount=%s
    %sr   NéK   Ú
)	ro   r$   rk   r"   ÚsortrQ   rI   rj   Újoin)r,   r>   rC   r"   rŸ   r   r   r   r\   G  s    
ÿÿzServer.debug_infoc                 C   s
   t | jƒS )z*
        Number of shared objects
        )Úlenrk   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 )z'
        Shutdown this process
        z!manager received shutdown message©r:   Nr   N)ru   Úsetr   r{   r;   Ú	tracebackÚ	print_exc)r,   r>   rµ   r   r   r   rX   ^  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 )z>
        Create a new shared object and return its id
        é   z8descriptor 'create' of 'Server' object needs an argumentr)   ú7create expected at least 2 positional arguments, got %dr	   é   r   Nz2Passing '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²   rJ   ÚpopÚwarningsÚwarnÚDeprecationWarningÚtuplero   re   rM   rV   rH   ÚdictrK   r   r$   r+   r   r{   r´   rj   rk   r_   )r@   rA   r,   r>   r)   r¼   rP   r    Úmethod_to_typeidÚ	proxytyper&   rŸ   r   r   r   rY   k  sp    

ÿ

 ÿ
ÿ
 ÿÿ

ÿ



 ÿÿzServer.createz$($self, c, typeid, /, *args, **kwds)c                 C   s   t | j|j d ƒS )zL
        Return the methods of the shared object indicated by token
        r	   )r¿   rj   r+   )r,   r>   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)rm   r˜   r   r;   r¥   )r,   r>   r   r   r   r   rZ   °  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)ro   rk   r™   rl   rj   r   r{   )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)rk   rl   r   r{   ro   rŽ   rK   rj   )r,   r>   rŸ   r   r   r   r`   Ê  s,    
ÿ þÿ

zServer.decrefN)r4   r6   r7   r8   r�   r-   r‡   r€   rŠ   r¥   r§   r©   r«   rœ   r^   r\   r]   rX   rY   Ú__text_signature__r[   rZ   r_   r`   r   r   r   r   rW   ‰   s<       ÿ
"Qý=rW   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   r9   Ú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 r   )r   rv   rg   Ú_addressrf   Ú_authkeyrÄ   Ú_staterÆ   rÅ   Ú_serializerrh   Z	_ListenerÚ_Clientr   Ú_ctx)r,   r*   rg   rp   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
        úAlready started serverúManager has shut downúUnknown state {!r})rÌ   rÅ   rÄ   rÆ   rÇ   r   rÈ   rK   rW   Ú	_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
        ©rg   Nr^   )	rh   rÍ   rÊ   rË   rD   rÄ   rÇ   rÌ   rÅ   )r,   rq   rr   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
        rÐ   rÑ   rÒ   Nz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È   rK   rP   rJ   r
   ZPiperÏ   ZProcessr   Ú_run_serverrÓ   rÊ   rË   rÍ   Ú_processr±   Z	_identityr4   r   r‚   r‘   r<   r   ÚFinalizeÚ_finalize_managerrÎ   rX   )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 )z@
        Create a server, report its address and run it
        Nzmanager serving at %r)
ÚsignalÚSIGINTÚSIG_IGNÚ_Serverr;   r*   r‘   r   r�   r‡   )	Úclsre   r*   rg   rp   rã   rà   rá   Úserverr   r   r   rÜ   S  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 5 | ¡  X t
|| j|ƒ|fS )zP
        Create a new shared object; return the token and exposed tuple
        zserver not yet startedrÕ   NrY   )rÌ   rÅ   rÄ   rÇ   rŽ   rÎ   rÊ   rË   r‘   rD   r   )r,   r)   r@   rA   rž   r+   r    r   r   r   Ú_createj  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±   v  s    

zBaseManager.joinc                 C   s2   | j | j| jd�}zt|ddƒW ¢S | ¡  X dS )zS
        Return some info about the servers shared objects and connections
        rÕ   Nr\   ©rÎ   rÊ   rË   r‘   rD   ©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 )z5
        Return the number of shared objects
        rÕ   Nr]   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È   rK   r.   r   r   r   Ú	__enter__“  s    

ÿzBaseManager.__enter__c                 C   s   |   ¡  d S r   )rX   ©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 )zQ
        Shutdown the manager process; will be registered as a finalizer
        z#sending shutdown message to managerrÕ   NrX   g      ð?)rí   zmanager still aliveÚ	terminatez'trying to `terminate()` manager processgš™™™™™¹?z#manager still alive after terminate)rë   r   r�   r‘   rD   r�   r±   Úhasattrrö   rÄ   rÈ   rÅ   r   Ú_address_to_localr™   )r   r*   rg   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 ]8\}}t|ƒtksrt	d| ƒ‚t|ƒtksRt	d| ƒ‚qR|||ˆ 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©Úmanagerrg   r    rÕ   r`   )	r   r{   rê   rÍ   rË   rÎ   r*   rD   r+   )r,   r@   rA   r¤   ZexpÚproxyrž   ©rÂ   r)   r   r   rR   â  s       þz"BaseManager.register.<locals>.temp)Ú__dict__rÓ   ÚcopyÚ	AutoProxyr   r$   r!   r   rI   rŽ   r4   Úsetattr)
rè   r)   rP   rÂ   r    rÁ   Úcreate_methodÚkeyrÅ   rR   r   rþ   r   ÚregisterÇ  s*    

ÿ   ÿ

zBaseManager.register)NNrÉ   N)Nr   )Nr   )N)NNNNT)r4   r6   r7   r8   rÓ   rW   rç   r-   rÔ   rÖ   r‚   ÚclassmethodrÜ   rê   r±   rð   rñ   rò   rõ   Ústaticmethodrß   Úpropertyr*   r  r   r   r   r   r   ý  s8     ÿ
	
+   ÿ
	



    ÿ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 rc   )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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 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Í   rh   rÎ   Ú_owned_by_managerr   rf   rË   rv   rg   Ú_increfr  Ú_after_fork)	r,   r¤   rp   rü   rg   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Õ   rZ   )r   r{   r   rv   r   rm   r˜   rÎ   r  r*   rË   rD   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 )	zV
        Try to call a method of the referent and return a copy of the result
        z#thread %r does not own a connectionr:   r—   éÿÿÿÿrû   rÕ   Nr`   )r  r
   rš   r   r{   rm   r˜   r   r  r;   r  r<   r  rÓ   r)   r  r*   rÍ   rË   rÎ   rD   r+   r=   )r,   r?   r@   rA   rž   rB   rC   r    r¤   rÂ   rý   r   r   r   Ú_callmethod6  s6    ÿ
   þzBaseProxy._callmethodc                 C   s
   |   d¡S )z9
        Get a copy of the value of the referent
        r¬   ©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   r{   r  r+   rÎ   r*   rË   rD   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   r{   r*   rD   r�   r÷   rm   r˜   r   r
   r‘   )r¤   rg   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 )Nrg   Ú_isautoFr    )	r   rË   r   rù   ÚRebuildProxyr  r  rÍ   r   ©r,   rA   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 )zV
        Return representation of the referent (or a fall-back if that fails)
        r5   Nr  z; '__str__()' failed>)r  r�   rª   r.   r   r   r   rN   £  s    zBaseProxy.__str__)NNNTF)r4   r6   r7   r8   rø   r   ZForkAwareThreadLockr  r-   r  r  r  r  r  r!  r  r  r&  r5   rN   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.
    rw   Nz*Rebuild a proxy owned by manager, token=%rTr  r_   Z_inheritingF)
r   r   rv   r*   r   r{   r+   rl   rj   r»   )rS   r¤   rp   rA   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 )zB
    Return a proxy type whose methods are given by `exposed`
    zOdef %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 )z*
    Return an auto-proxy for `token`
    r	   NrÕ   r[   zAutoProxy[%s])rü   rg   r_   T)rh   r*   r‘   rD   rË   r   rv   rg   r*  r)   r#  )
r¤   rp   rü   rg   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 )NrU   z%s=%rz%s(%s)z, )	r$   rÿ   r!   Ú
startswithrQ   r°   r3   r4   r±   )r,   r!   rR   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   ©r0  r.   r   r   r   r›     s    z	Value.getc                 C   s
   || _ d S r   r2  ©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/  r0  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   Úsequencer1  r   r   r   ÚArray  s    r5  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 )Nr7  r  ©r,   r@   r   r   r   r7    s    zIteratorProxy.__next__c                 G   s   |   d|¡S )Nr;   r  r:  r   r   r   r;     s    zIteratorProxy.sendc                 G   s   |   d|¡S )Nr8  r  r:  r   r   r   r8    s    zIteratorProxy.throwc                 G   s   |   d|¡S )Nr‘   r  r:  r   r   r   r‘   !  s    zIteratorProxy.closeN)	r4   r6   r7   rù   r9  r7  r;   r8  r‘   r   r   r   r   r6    s   r6  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 )NrA  r  )r,   Únr   r   r   rA  6  s    zConditionProxy.notifyc                 C   s
   |   d¡S )NrB  r  r.   r   r   r   rB  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í   rC   ZendtimeZwaittimer   r   r   Úwait_for:  s    
zConditionProxy.wait_for)N)r	   )N)r4   r6   r7   rù   r„   rA  rB  rG  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 rC  r  rì   r   r   r   r„   U  s    zEventProxy.wait)N)r4   r6   r7   rù   rƒ   r´   r
  r„   r   r   r   r   rH  M  s
   rH  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 rC  r  rì   r   r   r   r„   [  s    zBarrierProxy.waitc                 C   s
   |   d¡S )NrL  r  r.   r   r   r   rL  ]  s    zBarrierProxy.abortc                 C   s
   |   d¡S )NrM  r  r.   r   r   r   rM  _  s    zBarrierProxy.resetc                 C   s   |   dd¡S )NrK  )Úpartiesr  r.   r   r   r   rN  a  s    zBarrierProxy.partiesc                 C   s   |   dd¡S )NrK  )Ú	n_waitingr  r.   r   r   r   rO  d  s    zBarrierProxy.n_waitingc                 C   s   |   dd¡S )NrK  )Úbrokenr  r.   r   r   r   rP  g  s    zBarrierProxy.broken)N)r4   r6   r7   rù   r„   rL  rM  r  rN  rO  rP  r   r   r   r   rJ  Y  s   


rJ  c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚNamespaceProxy)rK  Ú__setattr__Ú__delattr__c                 C   s0   |d dkrt  | |¡S t  | d¡}|d|fƒS )Nr   rU   r  rK  )ÚobjectrK  ©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   rU   r  rR  )rT  rR  rK  )r,   r  rÅ   rV  r   r   r   rR  s  s    zNamespaceProxy.__setattr__c                 C   s0   |d dkrt  | |¡S t  | d¡}|d|fƒS )Nr   rU   r  rS  )rT  rS  rK  rU  r   r   r   rS  x  s    zNamespaceProxy.__delattr__N)r4   r6   r7   rù   rW  rR  rS  r   r   r   r   rQ  l  s   rQ  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 rI  r  r3  r   r   r   r´   ƒ  s    zValueProxy.setN)r4   r6   r7   rù   r›   r´   r  rÅ   r   r   r   r   rX    s   rX  ÚBaseListProxy)Ú__add__Ú__contains__Ú__delitem__Ú__getitem__Ú__len__Ú__mul__Ú__reversed__Ú__rmul__Ú__setitem__rQ   Ú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 )Nrd  r  r3  r   r   r   Ú__iadd__�  s    zListProxy.__iadd__c                 C   s   |   d|f¡ | S )Nri  r  r3  r   r   r   ri  ’  s    zListProxy.__imul__N)r4   r6   r7   rk  ri  r   r   r   r   rj  Ž  s   rj  Ú	DictProxy)r[  r\  r]  r9  r^  rb  r
  r   r›   r!   r"   r»   ÚpopitemÚ
setdefaultr,  r#   r9  ÚIteratorÚ
ArrayProxy)r^  r]  rb  Ú	PoolProxy)ZapplyÚapply_asyncr‘   ÚimapÚimap_unorderedr±   ÚmapÚ	map_asyncÚstarmapÚstarmap_asyncrö   ZAsyncResult)rr  rv  rx  rs  rt  c                   @   s   e Zd Zdd„ Zdd„ ZdS )rq  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   rq  ±  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)r4   r6   r7   r8   r   r   r   r   r   »  s   ÚQueueZJoinableQueuert   rn   ÚRLockÚ	SemaphoreÚBoundedSemaphoreÚ	ConditionÚBarrierÚPoolr$   rÀ   )rÂ   r  )r  c                   @   sL   e Zd 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 )Ú_SharedMemoryTrackerz+Manages one or more shared memory segments.c                 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 )z6Adds the supplied shared memory block name to tracker.zRegister segment ú in pid N)r   r{   r   r‚  rQ   ©r,   Úsegment_namer   r   r   Úregister_segmentç  s    z%_SharedMemoryTracker.register_segmentc                 C   sB   t  d|›dtƒ › �¡ | j |¡ t |¡}| ¡  | ¡  dS )z‚Calls unlink() on the shared memory block with the supplied name
            and removes it from the list of blocks being tracked.zDestroy segment rƒ  N)	r   r{   r   r‚  rg  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 )z<Calls destroy_segment() on all tracked shared memory blocks.N)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   r{   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   r8   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_rU   z"SharedMemoryServer started by pid )rW   r-   r*   rH   rd   ÚosÚfsdecoder€  r   Úshared_memory_contextr   r{   )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 )
zˆCreate a new distributed-shared object (not backed by a shared
            memory block) and return its id to be used in a Proxy Object.r·   r¹   r)   zDdescriptor 'create' of 'SharedMemoryServer' object needs an argumentr¸   r	   r  Z_shared_memory_proxyr‘  )r²   rJ   r÷   r,   re   r‘  rW   rY   )r@   r’  Ztypeodr)   r   r   r   rY     s    



ÿ
zSharedMemoryServer.createz&($self, c, typeid, /, *args, **kwargs)c                 C   s   | j  ¡  t | |¡S )zACall unlink() on all tracked shared memory, terminate the Server.)r‘  rˆ  rW   rX   r­   r   r   r   rX   )  s    
zSharedMemoryServer.shutdownc                 C   s   | j  |¡ dS )z?Adds the supplied shared memory block name to Server's tracker.N)r‘  r†  ©r,   r>   r…  r   r   r   rŒ  .  s    z SharedMemoryServer.track_segmentc                 C   s   | j  |¡ dS )zˆCalls unlink() on the shared memory block with the supplied name
            and removes it from the tracker instance inside the Server.N)r‘  r‰  r“  r   r   r   r�  2  s    z"SharedMemoryServer.release_segmentc                 C   s   | j jS )zbReturns a list of names of shared memory blocks that the Server
            is currently tracking.)r‘  r‚  r­   r   r   r   rŽ  7  s    z SharedMemoryServer.list_segmentsN)r4   r6   r7   rW   r�   r-   rY   rÃ   rX   rŒ  r�  rŽ  r   r   r   r   r‹    s   ÿ
r‹  c                   @   s<   e Zd ZdZeZdd„ Zdd„ Zdd„ Zdd	„ Z	d
d„ Z
dS )r   a¡  Like SyncManager but uses SharedMemoryServer instead of Server.

        It provides methods for creating and returning SharedMemory instances
        and for creating a list-like object (ShareableList) backed by shared
        memory.  It also provides methods that create and return Proxy Objects
        that support synchronization across processes (i.e. multi-process-safe
        locks and semaphores).
        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   r{   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   r{   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 )z@Better than monkeypatching for now; merge into Server ultimatelyz"Already started SharedMemoryServerz!SharedMemoryManager has shut downrÒ   )rÌ   rÅ   rÄ   rÆ   rÇ   r   rÈ   rK   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 )zoReturns a new SharedMemory instance with the specified size in
            bytes, to be tracked by the manager.rÕ   NT)rY   ÚsizerŒ  )	rÎ   rÊ   rË   r   r‡  rD   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 )z�Returns a new ShareableList instance populated with the values
            from the input sequence, to be tracked by the manager.rÕ   NrŒ  )
rÎ   rÊ   rË   r   ÚShareableListrD   Zshmr   r˜  rˆ  )r,   r4  rž   Zslr–   r   r   r   r™  r  s    

 z!SharedMemoryManager.ShareableListN)r4   r6   r7   r8   r‹  rç   r-   rŠ  rÔ   r‡  r™  r   r   r   r   r   =  s   	)NNNT)T)SÚ__all__rx   rm   rä   r   ZqueuerE  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_typerT  r   rD   r=   r�   rL   rT   rV   rW   rÄ   rq   rr   ZXmlListenerZ	XmlClientrh   r   r´   r	  r   r$  r*  r  r+  r.  r5  r6  r;  r@  rH  rJ  rQ  rX  rY  rj  rl  rú   rp  ZBasePoolProxyrq  r   ry  rt   rn   rz  r{  r|  r}  r~  r  rÀ   r€  r‹  r   r   r   r   r   Ú<module>   sÌ   ÿ


  c

þ	 w
 4    ÿ

	
	
 ÿ

û

ÿ%8