U
    d                     @   s  d dl m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
 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mZmZ ddddgZejd  dkZerdd Zn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 qG dd deZdi fddZdd ZG d d! d!e Z!d"d# Z"d$d% Z#G d&d' d'eZ$G d(d) d)eZ%ej&ej'fej(ej)fd*Z*G d+d deZ+G d,d- d-e,Z-G d.d deZ.d/d0 Z/i fd1d2Z0djd4d5Z1G d6d7 d7eZ2G d8d9 d9eZ3dkd:d;Z4G d<d= d=e.Z5G d>d? d?e.Z6G d@dA dAe6Z7G dBdC dCe.Z8G dDdE dEe.Z9G dFdG dGe.Z:G dHdI dIe.Z;dJZ<ese<dK7 Z<e0dLe<Z=G dMdN dNe=Z>e0dOdPZ?dQZ@ese@dR7 Z@e0dSe@ZAe0dTdUZBdVdVdVdWdWdXeB_CG dYdT dTeBZDG dZd de+ZEeEd[e eEd\e eEd]ejFe8 eEd^ejGe6 eEd_ejHe6 eEd`ejIe6 eEdaejJe6 eEdbejKe7 eLedcreEdcejMe9 eEdde
jNeD eEdeee> eEdfeOe? eEd9e3e; eEd;e4eA eEd7e2e: eEjdWe5dgdh eEjdVdgdi dS )l    )absolute_importN)
format_exc   )
connection)context)pool)process)	reduction)util)get_context)Queueitems	monotonicBaseManagerSyncManager	BaseProxyToken   c                 C   s   t j | j|  ffS N)arraytypecodetobytesa r   5/tmp/pip-unpacked-wheel-lulkwrw3/billiard/managers.pyreduce_array*   s    r   c                 C   s   t j | j|  ffS r   )r   r   tostringr   r   r   r   r   -   s    c                 C   s   g | ]}t ti | qS r   )typegetattr.0namer   r   r   
<listcomp>1   s   r#   )r   keysvaluesc                 C   s   t t | ffS r   )listobjr   r   r   rebuild_as_list5   s    r)   c                   @   s4   e Zd ZdZdZdd Zdd Zdd Zd	d
 ZdS )r   z4
    Type to uniquely indentify a shared object
    typeidaddressidc                 C   s   |||  | _ | _| _d S r   r*   )selfr+   r,   r-   r   r   r   __init__E   s    zToken.__init__c                 C   s   | j | j| jfS r   r*   r.   r   r   r   __getstate__H   s    zToken.__getstate__c                 C   s   |\| _ | _| _d S r   r*   )r.   stater   r   r   __setstate__K   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-   r0   r   r   r   __repr__N   s    zToken.__repr__N)	r5   
__module____qualname____doc__	__slots__r/   r1   r3   r6   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   dispatchW   s
    rE   c                 C   s\   | dkr|S | dkr,t |tks$tt|S | dkrPt |tksDttd| S tdS d S )N#ERROR
#TRACEBACK#UNSERIALIZABLEzUnserializable message: %s
zUnrecognized message type)r   strAssertionErrorRemoteError
ValueError)rC   rD   r   r   r   r>   b   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---------------------------------------------------------------------------)rI   rA   r0   r   r   r   __str__q   s    zRemoteError.__str__N)r5   r7   r8   rM   r   r   r   r   rK   o   s   rK   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    
rS   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>)rS   r'   r   r   r   public_methods   s    rU   c                	   @   s   e Zd ZdZdddddddd	d
g	Zdd Zdd Zdd Zdd Zdd Z	dd Z
dd Zdd Zeee
dZdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.S )/ServerzM
    Server class which runs in a process controlled by a manager object
    shutdowncreateaccept_connectionget_methods
debug_infonumber_of_objectsdummyincrefdecrefc                 C   sb   t |tst|| _t|| _t| \}}||dd| _| jj	| _	ddi| _
i | _t | _d S )N   )r,   backlog0Nr   )
isinstancebytesrJ   registryr   AuthenticationStringauthkeylistener_clientlistenerr,   	id_to_objid_to_refcount	threadingRLockmutex)r.   rf   r,   rh   
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rt	
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   rA   T)rj   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 unrecognizedrG   r;   zFailure to send message: %rz ... request was %r ... exception was %r)r   Zdeliver_challengerh   Zanswer_challenger=   publicrJ   r   	Exceptionr   r<   r
   infoclose)r.   r?   funcnamerD   requestignorerA   rB   rR   msgexcr   r   r   r      s4    zServer.handle_requestc                 C   sr  t dt j |j}|j}| j}| j	 snzd }}| }|\}}}	}
|| \}}}||krxt
d|t||f t||}z||	|
}W n* tk
r } zd|f}W 5 d}~X Y nLX |o||d}|r| |||\}}t|| j|}d||ff}nd|f}W n t
k
r   |dkr0d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 z8z|| W n& tk
r   |d
t|f Y nX W q$ tk
rj } 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=%rrF   #PROXYr;   rG   z$got EOF -- exiting thread serving %rr   rH   zexception in thread serving %rz ... message was %rr   r   )r
   r{   rm   current_threadr"   r=   r<   rk   ru   r   AttributeErrorr   r   r   getrX   r   r,   r   fallback_mappingEOFErrorrx   r~   reprr   r   )r.   connr=   r<   rk   r@   r(   r   identrA   rB   exposedZ	gettypeidfunctionresr   r   r+   ZridentZrexposedtokenZfallback_funcrD   r   r   r   serve_client   s      


   zServer.serve_clientc                 C   s   |S r   r   r.   r   r   r(   r   r   r   fallback_getvalue1  s    zServer.fallback_getvaluec                 C   s   t |S r   rI   r   r   r   r   fallback_str4  s    zServer.fallback_strc                 C   s   t |S r   )r   r   r   r   r   fallback_repr7  s    zServer.fallback_repr)rM   r6   	#GETVALUEc                 C   s   d S r   r   r.   r?   r   r   r   r]   @  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   NK   
)	ro   r&   rk   r$   sortrP   rl   rI   join)r.   r?   rD   r$   r   r   r   r   r[   C  s    
zServer.debug_infoc                 C   s   t | jd S )z*
        Number of shared objects
        r   )lenrk   r   r   r   r   r\   R  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   rW   X  s    
zServer.shutdownc              
   O   s   | j  | j| \}}}}|dkr@t|dkr2|r6t|d }	n
|||}	|dkrZt|	}|dk	rt|tksrtt|t| }dt|	 }
t	
d||
 |	t||f| j|
< |
| jkrd| j|
< | ||
 |
t|fW  5 Q R  S Q R X dS )z>
        Create a new shared object and return its id
        Nr   r   z%xz&%r callable returned object with id %r)ro   rf   r   rJ   rU   r   dictr&   r-   r
   r{   r   rk   rl   r^   tuple)r.   r?   r+   rA   rB   rO   r   method_to_typeid	proxytyper(   r   r   r   r   rX   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   rk   r-   )r.   r?   r   r   r   r   rZ     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   rY     s    

zServer.accept_connectionc              	   C   s(   | j  | j|  d7  < W 5 Q R X d S )Nr   )ro   rl   r.   r?   r   r   r   r   r^     s    zServer.increfc              	   C   sd   | j T | j| dkst| j|  d8  < | j| dkrV| j|= | j|= td| W 5 Q R X d S )Nr   r   zdisposing of obj with id %r)ro   rl   rJ   rk   r
   r{   r   r   r   r   r_     s    zServer.decrefN)r5   r7   r8   r9   r   r/   r   r   r   r   r   r   r   r   r]   r[   r\   rW   rX   rZ   rY   r^   r_   r   r   r   r   rV      s:       
"J#rV   c                   @   s   e Zd ZdgZdZdZdZdS )Statevaluer   r      N)r5   r7   r8   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 krt  j}|| _t || _t | _tj| j_	|| _
t| \| _| _|pTt | _d S r   )r   rv   rh   _addressrg   _authkeyr   _stater   r   _serializerri   Z	_Listener_Clientr   _ctx)r.   r,   rh   rp   ctxr   r   r   r/     s    

zBaseManager.__init__c                 C   s   t | j| j| j| jffS r   )r   from_addressr   r   r   r0   r   r   r   
__reduce__  s    zBaseManager.__reduce__c                 C   s(   | j jtjkstt| j| j| j| j	S )zX
        Return server object with serve_forever() method and address attribute
        )
r   r   r   r   rJ   rV   	_registryr   r   r   r0   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
        rh   Nr]   )	ri   r   r   r   rE   r   r   r   r   )r.   rq   rr   r   r   r   r   connect  s    zBaseManager.connectr   c              	   C   s   | j jtjkst|dk	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)Zduplexr   :c                 s   s   | ]}t |V  qd S r   r   )r!   ir   r   r   	<genexpr>  s     z$BaseManager.start.<locals>.<genexpr>-r   rA   Zexitpriority)r   r   r   r   rJ   rO   	TypeErrorr   ZPiper   Processr   _run_serverr   r   r   r   _processr   Z	_identityr5   r"   r   r   r=   r   r
   Finalize_finalize_managerr   rW   )r.   initializerinitargsreaderwriterr   r   r   r   r     s:       


  zBaseManager.startc           	      C   sN   |dk	r||  |  ||||}||j |  td|j |  dS )z@
        Create a server, report its address and run it
        Nzmanager serving at %r)_Serverr<   r,   r   r
   r   r   )	clsrf   r,   rh   rp   r   r   r   serverr   r   r   r     s    zBaseManager._run_serverc                 O   sd   | j jtjkstd| j| j| jd}zt	|dd|f| |\}}W 5 |  X t
|| j||fS )zP
        Create a new shared object; return the token and exposed tuple
        zserver not yet startedr   NrX   )r   r   r   r   rJ   r   r   r   r   rE   r   )r.   r+   rA   rB   r   r-   r   r   r   r   _create  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   (  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   rE   r.   r   r   r   r   _debug_info1  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   s,   | j jtjkr|   | j jtjks(t| S r   )r   r   r   r   r   r   rJ   r0   r   r   r   	__enter__E  s    zBaseManager.__enter__c                 C   s   |    d S r   )rW   r.   exc_typeexc_valexc_tbr   r   r   __exit__K  s    zBaseManager.__exit__c                 C   s   |   rtd z,|||d}zt|dd W 5 |  X W n tk
rR   Y nX | jdd |   rtd t| drtd	 |   | jd
d |   rt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   NrW   g      ?)r   zmanager still alive	terminatez'trying to `terminate()` manager processg?z#manager still alive after terminate)r   r
   r   r   rE   r   r   hasattrr   r   r   r   r   _address_to_localKeyError)r   r,   rh   r2   r   r   r   r   r   r   N  s.    




zBaseManager._finalize_managerc                 C   s   | j S r   )r   r0   r   r   r   <lambda>n      zBaseManager.<lambda>Tc           
         s   d| j kr| j | _ dkr"t |p0t dd}|p@t dd}|rt|D ]8\}}t|tksntd| t|tksNtd| qN||| 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managerrh   r   r   r_   )	r
   r{   r   r   r   r   r,   rE   r-   )r.   rA   rB   r   expproxyr   r   r+   r   r   rQ     s       z"BaseManager.register.<locals>.temp)__dict__r   copy	AutoProxyr   r   r   rI   rJ   r5   setattr)
r   r+   rO   r   r   r   create_methodkeyr   rQ   r   r   r   registerp  s*    

   

zBaseManager.register)NNr   N)Nr   )Nr   )N)NNNNT)r5   r7   r8   r9   r   rV   r   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   r     r   z*ProcessLocalSet.__init__.<locals>.<lambda>)r
   register_after_forkr0   r   r   r   r/     s    zProcessLocalSet.__init__c                 C   s   t | dfS rc   )r   r0   r   r   r   r     s    zProcessLocalSet.__reduce__N)r5   r7   r8   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
    NTc              	   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	rt|| _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   ri   r   r   rg   r   rv   rh   _increfr  _after_fork)r.   r   rp   r   rh   r   r^   Z	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 manager
MainThread|r   rY   )r
   r{   r   rv   r"   rm   r   r   r  r,   r   rE   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 )	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   Nr_   )r
  r   r   r
   r{   rm   r   r"   r  r<   r  r=   r  r   r+   r  r,   r   r   r   rE   r-   r>   )r.   r@   rA   rB   r   rC   rD   r   r   r   r   r   r   r   _callmethod  s6    
   zBaseProxy._callmethodc                 C   s
   |  dS )z9
        Get a copy of the value of the referent
        r   r  r0   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oP| 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   rE   r  r
   r{   r-   r  addr  r   r   r   _decrefr
  _close)r.   r   r2   r   r   r   r    s     
  zBaseProxy._increfc              
   C   s   | | j |d ks |jtjkrz2td| j || j|d}t|d d| jf W q t	k
r } ztd| W 5 d }~X Y qX ntd| j |st
|drt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,   rE   r   r   rm   r   r"   r   r   )r   rh   r2   ZtlsZidsetr   r   r   r   r   r   r    s     
zBaseProxy._decrefc              
   C   sF   d | _ z|   W n. tk
r@ } 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rD| j|d< tt| j| j|ffS tt	| | j| j|ffS d S )Nrh   _isautoFr   )
r   Zget_spawning_popenr   r   r   RebuildProxyr   r  r   r   r.   rB   r   r   r   r   4  s    

zBaseProxy.__reduce__c                 C   s   |   S r   )r  )r.   memor   r   r   __deepcopy__A  s    zBaseProxy.__deepcopy__c                 C   s   dt | j| jjt| f S )Nz<%s object, typeid %r at %#x>)r   r5   r  r+   r-   r0   r   r   r   r6   D  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)
        r6   Nr  z; '__str__()' failed>)r  r   r   r0   r   r   r   rM   H  s    zBaseProxy.__str__)NNNT)r5   r7   r8   r9   r   r
   ZForkAwareThreadLockr	  r/   r  r  r  r  r  r  r  r   r!  r6   rM   r   r   r   r   r     s&         
#	
c                 C   sh   t t dd}|r0|j|jkr0|j|j d S |ddoLt t dd }| ||fd|i|S dS )z
    Function used for unpickling proxy objects.

    If possible the shared object is returned, or otherwise a proxy for it.
    rw   Nr   r^   TZ_inheritingF)r   r   rv   r,   rk   r-   pop)rR   r   rp   rB   r   r^   r   r   r   r  V  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 )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   _cacheZdicmeth	ProxyTyper   r   r   MakeProxyTypel  s     r'  Tc           
      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   rZ   zAutoProxy[%s])r   rh   r^   T)ri   r,   r   rE   r   r   rv   rh   r'  r+   r  )
r   rp   r   rh   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   r4   r5   r   )r.   r   rQ   r"   r   r   r   r   r6     s    
zNamespace.__repr__N)r5   r7   r8   r/   r6   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-  r0   r   r   r   r     s    z	Value.getc                 C   s
   || _ d S r   r/  r.   r   r   r   r   r     s    z	Value.setc                 C   s   dt | j| j| jf S )Nz
%s(%r, %r))r   r5   r,  r-  r0   r   r   r   r6     s    
 zValue.__repr__N)T)	r5   r7   r8   r/   r   r   r6   r  r   r   r   r   r   r+    s
   
r+  c                 C   s   t  | |S r   )r   )r   sequencer.  r   r   r   Array  s    r2  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   )r4  nextr<   r5  r   c                 G   s   |  d|S )Nr6  r  r.   rA   r   r   r   r6    s    zIteratorProxy.nextc                 C   s   | S r   r   r0   r   r   r   __iter__  s    zIteratorProxy.__iter__c                 G   s   |  d|S )Nr4  r  r7  r   r   r   r4    s    zIteratorProxy.__next__c                 G   s   |  d|S )Nr<   r  r7  r   r   r   r<     s    zIteratorProxy.sendc                 G   s   |  d|S )Nr5  r  r7  r   r   r   r5    s    zIteratorProxy.throwc                 G   s   |  d|S )Nr   r  r7  r   r   r   r     s    zIteratorProxy.closeN)r5   r7   r8   rx   version_infoZ_exposedr   r6  r8  r4  r<   r5  r   r   r   r   r   r3    s   r3  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.   blockingr   rA   r   r   r   r;    s    zAcquirerProxy.acquirec                 C   s
   |  dS Nr<  r  r0   r   r   r   r<    s    zAcquirerProxy.releasec                 C   s
   |  dS r=  r  r0   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)r5   r7   r8   r   r;  r<  r   r   r   r   r   r   r:    s
   
r:  c                   @   s4   e Zd ZdZdddZdd Zdd Zdd	d
ZdS )ConditionProxy)r;  r<  r   notify
notify_allNc                 C   s   |  d|fS Nr   r  r   r   r   r   r     s    zConditionProxy.waitc                 C   s
   |  dS )NrA  r  r0   r   r   r   rA    s    zConditionProxy.notifyc                 C   s
   |  dS )NrB  r  r0   r   r   r   rB    s    zConditionProxy.notify_allc                 C   s`   | }|r|S |d k	r"t  | }nd }d }|s\|d k	rJ|t   }|dkrJq\| | | }q*|S )Nr   )r   r   )r.   	predicater   rD   endtimewaittimer   r   r   wait_for  s    

zConditionProxy.wait_for)N)N)r5   r7   r8   r   r   rA  rB  rG  r   r   r   r   r@    s
   
r@  c                   @   s2   e Zd ZdZdd Zdd Zdd Zdd	d
ZdS )
EventProxy)r   r   r  r   c                 C   s
   |  dS )Nr   r  r0   r   r   r   r     s    zEventProxy.is_setc                 C   s
   |  dS Nr   r  r0   r   r   r   r     s    zEventProxy.setc                 C   s
   |  dS )Nr  r  r0   r   r   r   r    s    zEventProxy.clearNc                 C   s   |  d|fS rC  r  r   r   r   r   r     s    zEventProxy.wait)N)r5   r7   r8   r   r   r   r  r   r   r   r   r   rH    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  r0   r   r   r   rL  (  s    zBarrierProxy.abortc                 C   s
   |  dS )NrM  r  r0   r   r   r   rM  +  s    zBarrierProxy.resetc                 C   s   |  ddS )NrK  )partiesr  r0   r   r   r   rN  .  s    zBarrierProxy.partiesc                 C   s   |  ddS )NrK  )	n_waitingr  r0   r   r   r   rO  2  s    zBarrierProxy.n_waitingc                 C   s   |  ddS )NrK  )brokenr  r0   r   r   r   rP  6  s    zBarrierProxy.broken)N)r5   r7   r8   r   r   rL  rM  r  rN  rO  rP  r   r   r   r   rJ  "  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   rT   r  rK  )objectrK  r.   r  
callmethodr   r   r   __getattr__>  s    zNamespaceProxy.__getattr__c                 C   s4   |d dkrt | ||S t | d}|d||fS )Nr   rT   r  rR  )rT  rR  rK  )r.   r  r   rV  r   r   r   rR  D  s    zNamespaceProxy.__setattr__c                 C   s0   |d dkrt | |S t | d}|d|fS )Nr   rT   r  rS  )rT  rS  rK  rU  r   r   r   rS  J  s    zNamespaceProxy.__delattr__N)r5   r7   r8   r   rW  rR  rS  r   r   r   r   rQ  ;  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  r0   r   r   r   r   T  s    zValueProxy.getc                 C   s   |  d|fS rI  r  r0  r   r   r   r   W  s    zValueProxy.setN)r5   r7   r8   r   r   r   r  r   r   r   r   r   rX  Q  s   rX  )__add____contains____delitem____getitem____len____mul____reversed____rmul____setitem__rP   countextendindexinsertr"  removereverser   __imul__)__getslice____setslice__Z__delslice__BaseListProxyc                   @   s   e Zd Zdd Zdd ZdS )	ListProxyc                 C   s   |  d|f | S )Nrc  r  r0  r   r   r   __iadd__i  s    zListProxy.__iadd__c                 C   s   |  d|f | S )Nrh  r  r0  r   r   r   rh  m  s    zListProxy.__imul__N)r5   r7   r8   rm  rh  r   r   r   r   rl  g  s   rl  	DictProxy)rZ  r[  r\  r]  ra  r  r   r   Zhas_keyr   r$   r"  popitem
setdefaultr)  r%   )r]  r\  ra  )ri  rj  
ArrayProxy	PoolProxy)applyapply_asyncr   imapimap_unorderedr   map	map_asyncstarmapstarmap_asyncr   ZAsyncResultIterator)rt  rx  rz  ru  rv  c                   @   s   e Zd Zdd Zdd ZdS )rr  c                 C   s   | S r   r   r0   r   r   r   r     s    zPoolProxy.__enter__c                 G   s   |    d S r   )r   )r.   exc_infor   r   r   r     s    zPoolProxy.__exit__N)r5   r7   r8   r   r   r   r   r   r   rr    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)r5   r7   r8   r9   r   r   r   r   r     s   r   ZJoinableQueuert   Lockrn   	SemaphoreBoundedSemaphore	ConditionBarrierPoolr&   r   F)r   r   )r   )NNNT)T)P
__future__r   rx   rm   r   r   r    r   r   r   r   r	   r
   r   Zfiver   r   r   __all__r9  PY3r   r  Z
view_typesr&   r)   Z	view_typerT  r   rE   r>   r   rK   rS   rU   rV   r   rq   rr   ZXmlListenerZ	XmlClientri   r   r   r  r   r  r'  r   r(  r+  r2  r3  r:  r@  rH  rJ  rQ  rX  Z_ListProxy_Attributesrk  rl  rn  Z_ArrayProxy_Attributesrq  ZBasePoolProxyr   rr  r   rt   r}  rn   r~  r  r  r   r  r  r   r   r   r   r   <module>
   s   

  


 e +    





	
