
][\                 @   s  d  d d d g Z  d d l Z d d l Z d d l Z d d l Z d d l 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   Z e j e j e  d d   d d d f D Z e d e k	 rMd d   Z x e D] Z e j e e  q0Wn  Gd d   d e  Z f  i  d d  Z d d   Z Gd d   d e  Z d  d!   Z d" d#   Z Gd$ d%   d% e  Z Gd& d'   d' e  Z  i e
 j! e
 j" f d( 6e
 j# e
 j$ f d) 6Z% Gd* d    d  e  Z& Gd+ d,   d, e'  Z( Gd- d   d e  Z) d. d/   Z* i  d0 d1  Z+ d d d d2 d3 d4  Z, Gd5 d6   d6 e  Z- Gd7 d8   d8 e  Z. d2 d9 d:  Z/ Gd; d<   d< e)  Z0 Gd= d>   d> e)  Z1 Gd? d@   d@ e1  Z2 GdA dB   dB e)  Z3 GdC dD   dD e)  Z4 GdE dF   dF e)  Z5 GdG dH   dH e)  Z6 e+ dI dJ dK dL dM dN dO dP dQ dR dS dT dU dV dW dX dY dZ d[ d\ f  Z7 Gd] d^   d^ e7  Z8 e+ d_ dK dL dM dN dR d` da db dc d d dX dd de df d f  Z9 e+ dg dN dM dR f  Z: e+ dh di dj dk dl dm dn do dp dq dr ds f  Z; i dt dj 6dt dp 6dt dr 6du dl 6du dm 6e; _< Gdv dh   dh e;  Z= Gdw d   d e&  Z> e> j dx e j?  e> j dy e j?  e> j dz e j@ e3  e> j d{ e jA e1  e> j d| e jB e1  e> j d} e jC e1  e> j d~ e jD e1  e> j d e jE e2  e> j d e jF e4  e> j d e jG e=  e> j d e e8  e> j d eH e9  e> j d8 e. e6  e> j d: e/ e:  e> j d6 e- e5  e> j du d e0 d d e> j dt d d d S)BaseManagerSyncManager	BaseProxyToken    N)time)
format_exc   )
connection)context)pool)process)	reduction)util)get_contextc             C   s   t  j  |  j |  j   f f S)N)arraytypecodetobytes)a r   ./usr/lib/python3.4/multiprocessing/managers.pyreduce_array%   s    r   c             C   s(   g  |  ] } t  t i  |      q Sr   )typegetattr).0namer   r   r   
<listcomp>)   s   	 r   itemskeysvaluesc             C   s   t  t  |   f f S)N)list)objr   r   r   rebuild_as_list+   s    r!   c               @   sL   e  Z d  Z d Z d Z d d   Z d d   Z d	 d
   Z d d   Z d S)r   z4
    Type to uniquely indentify a shared object
    typeidaddressidc             C   s!   | | | |  _  |  _ |  _ d  S)N)r"   r#   r$   )selfr"   r#   r$   r   r   r   __init__:   s    zToken.__init__c             C   s   |  j  |  j |  j f S)N)r"   r#   r$   )r%   r   r   r   __getstate__=   s    zToken.__getstate__c             C   s   | \ |  _  |  _ |  _ d  S)N)r"   r#   r$   )r%   stater   r   r   __setstate__@   s    zToken.__setstate__c             C   s   d |  j  |  j |  j f S)Nz#Token(typeid=%r, address=%r, id=%r))r"   r#   r$   )r%   r   r   r   __repr__C   s    zToken.__repr__N)ztypeidzaddresszid)	__name__
__module____qualname____doc__	__slots__r&   r'   r)   r*   r   r   r   r   r   4   s   c             C   sN   |  j  | | | | f  |  j   \ } } | d k r; | St | |   d S)zL
    Send a message to manager using connection `c` and return response
    z#RETURNN)sendrecvconvert_to_error)cr$   
methodnameargskwdskindresultr   r   r   dispatchK   s
    r9   c             C   s~   |  d k r | S|  d k r> t  |  t k s4 t  t |  S|  d k rp t  |  t k sb t  t d |  St d  Sd  S)Nz#ERRORz
#TRACEBACKz#UNSERIALIZABLEzUnserializable message: %s
zUnrecognized message type)r   strAssertionErrorRemoteError
ValueError)r7   r8   r   r   r   r2   U   s    
r2   c               @   s   e  Z d  Z d d   Z d S)r<   c             C   s)   d d d d t  |  j d  d d S)N
-K   r   )r:   r5   )r%   r   r   r   __str__b   s    zRemoteError.__str__N)r+   r,   r-   rA   r   r   r   r   r<   a   s   r<   c             C   sL   g  } x? t  |   D]1 } t |  |  } t |  r | j |  q q W| S)z4
    Return a list of names of methods of `obj`
    )dirr   callableappend)r    tempr   funcr   r   r   all_methodsi   s    rG   c             C   s   d d   t  |   D S)zP
    Return a list of names of methods of `obj` which do not start with '_'
    c             S   s&   g  |  ] } | d  d k r |  q S)r   _r   )r   r   r   r   r   r   x   s   	 z"public_methods.<locals>.<listcomp>)rG   )r    r   r   r   public_methodst   s    rI   c            	   @   s  e  Z d  Z d Z d d d d d d d d	 d
 g	 Z d d   Z d d   Z d d   Z d d   Z d d   Z	 d d   Z
 d d   Z d d   Z i e d 6e d 6e
 d 6Z 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 d0 S)1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   s   t  | t  s t  | |  _ t j |  |  _ t | \ } } | d | d d  |  _ |  j j	 |  _	 i d  f  f d 6|  _
 i  |  _ t j   |  _ d  S)Nr#   Zbacklog   0)
isinstancebytesr;   registryr   AuthenticationStringauthkeylistener_clientlistenerr#   	id_to_objid_to_refcount	threadingRLockmutex)r%   rX   r#   rZ   
serializerListenerClientr   r   r   r&      s    		zServer.__init__c             C   s   t  j   |  _ |  t j   _ zq t  j d |  j  } d | _ | j	   y* x# |  j j
   sq |  j j d  qO WWn t t f k
 r Yn XWd t j t j k r t j d  t j t _ t j t _ n  t j d  Xd S)z(
        Run the server forever
        targetTr   Nzresetting stdout, stderrr   )r_   Event
stop_eventr   current_process_manager_serverThreadaccepterdaemonstartis_setwaitKeyboardInterrupt
SystemExitsysstdout
__stdout__r   debug
__stderr__stderrexit)r%   rk   r   r   r   serve_forever   s     	
	zServer.serve_foreverc             C   sf   x_ y |  j  j   } Wn t k
 r- w Yn Xt j d |  j d | f  } d | _ | j   q d  S)Nre   r5   T)r\   ZacceptOSErrorr_   rj   handle_requestrl   rm   )r%   r3   tr   r   r   rk      s    	zServer.accepterc          '   C   s  d } } } yv t  j | |  j  t  j | |  j  | j   } | \ } } } } | |  j k st t d |   t |  |  } Wn! t k
 r d t	   f }	 YnG Xy | | | |  } Wn! t k
 r d t	   f }	 Yn Xd | f }	 y | j
 |	  Wn t k
 r}
 zd y | j
 d t	   f  Wn t k
 rBYn Xt j d |	  t j d |  t j d |
  WYd d }
 ~
 Xn X| j   d S)z)
        Handle a new connection
        Nz%r unrecognizedz
#TRACEBACKz#RETURNzFailure to send message: %rz ... request was %rz ... exception was %r)r	   Zdeliver_challengerZ   Zanswer_challenger1   publicr;   r   	Exceptionr   r0   r   infoclose)r%   r3   Zfuncnamer8   requestignorer5   r6   rF   msger   r   r   r{      s4    #zServer.handle_requestc          *   C   s+  t  j d t j   j  | j } | j } |  j } x|  j j	   s&y/d } } |   } | \ } } }	 }
 | | \ } } } | | k r t
 d | t |  | f   n  t | |  } y | |	 |
   } Wn1 t k
 r} z d | f } WYd d } ~ Xnp X| o| j | d  } | rh|  j | | |  \ } } t | |  j |  } d | | f f } n d | f } Wn t
 k
 r| d k rd t   f } n\ y8 |  j | } | |  | | | |	 |
  } d | f } Wn! t k
 rd t   f } Yn XYnX t k
 r:t  j d t j   j  t j d	  Yn! t k
 rZd t   f } Yn XyP y | |  Wn; t k
 r} z | d
 t |  f  WYd d } ~ Xn XWq7 t k
 r"} zU t  j d t j   j  t  j d |  t  j d |  | j   t j d  WYd d } ~ Xq7 Xq7 Wd S)zQ
        Handle requests from the proxies in a particular process/thread
        z$starting server thread to service %rNz+method %r of %r object is not in exposed=%rz#ERRORz#PROXYz#RETURNz
#TRACEBACKz$got EOF -- exiting thread serving %rr   z#UNSERIALIZABLEzexception in thread serving %rz ... message was %rz ... exception was %rr   )r   ru   r_   current_threadr   r1   r0   r]   rg   rn   AttributeErrorr   r   r~   getrL   r   r#   r   fallback_mappingEOFErrorrr   rx   reprr   r   )r%   connr1   r0   r]   r4   r    r   identr5   r6   exposedZ	gettypeidZfunctionZresr   r   r"   ZridentZrexposedtokenZfallback_funcr8   r   r   r   serve_client   sl    				
		-	
zServer.serve_clientc             C   s   | S)Nr   )r%   r   r   r    r   r   r   fallback_getvalue  s    zServer.fallback_getvaluec             C   s
   t  |  S)N)r:   )r%   r   r   r    r   r   r   fallback_str"  s    zServer.fallback_strc             C   s
   t  |  S)N)r   )r%   r   r   r    r   r   r   fallback_repr%  s    zServer.fallback_reprrA   r*   z	#GETVALUEc             C   s   d  S)Nr   )r%   r3   r   r   r   rQ   .  s    zServer.dummyc             C   s   |  j  j   z g  } t |  j j    } | j   xY | D]Q } | d k r< | j d | |  j | t |  j | d  d d  f  q< q< Wd j	 |  SWd |  j  j
   Xd S)zO
        Return some info --- useful to spot problems with refcounting
        rU   z  %s:       refcount=%s
    %sr   Nr@   r>   )ra   acquirer   r]   r   sortrD   r^   r:   joinrelease)r%   r3   r8   r   r   r   r   r   rO   1  s    
	-zServer.debug_infoc             C   s   t  |  j  d S)z*
        Number of shared objects
        r   )lenr]   )r%   r3   r   r   r   rP   C  s    zServer.number_of_objectsc             C   sX   zC y t  j d  | j d  Wn d d l } | j   Yn XWd |  j j   Xd S)z'
        Shutdown this process
        z!manager received shutdown message#RETURNNr   )r   N)r   ru   r0   	traceback	print_excrg   set)r%   r3   r   r   r   r   rK   I  s    zServer.shutdownc          
   O   s\  |  j  j   z:|  j | \ } } } } | d k ra t |  d k rN | sT t  | d }	 n | | |   }	 | d k r t |	  } n  | d k	 r t |  t k s t  t |  t |  } n  d t	 |	  }
 t
 j d | |
  |	 t |  | f |  j |
 <|
 |  j k r&d |  j |
 <n  |  j | |
  |
 t |  f SWd |  j  j   Xd S)z>
        Create a new shared object and return its id
        Nr   r   z%xz&%r callable returned object with id %r)ra   r   rX   r   r;   rI   r   dictr   r$   r   ru   r   r]   r^   rR   tupler   )r%   r3   r"   r5   r6   rC   r   method_to_typeid	proxytyper    r   r   r   r   rL   V  s(    zServer.createc             C   s   t  |  j | j d  S)zL
        Return the methods of the shared object indicated by token
        r   )r   r]   r$   )r%   r3   r   r   r   r   rN   |  s    zServer.get_methodsc             C   s-   | t  j   _ | j d  |  j |  d S)z=
        Spawn a new thread to serve this connection
        #RETURNN)r   N)r_   r   r   r0   r   )r%   r3   r   r   r   r   rM     s    zServer.accept_connectionc          
   C   s7   |  j  j   z |  j | d 7<Wd  |  j  j   Xd  S)Nr   )ra   r   r^   r   )r%   r3   r   r   r   r   rR     s    zServer.increfc          
   C   s   |  j  j   zh |  j | d k s) t  |  j | d 8<|  j | d k rt |  j | =|  j | =t j d |  n  Wd  |  j  j   Xd  S)Nr   r   zdisposing of obj with id %r)ra   r   r^   r;   r]   r   ru   r   )r%   r3   r   r   r   r   rS     s    zServer.decrefN)r+   r,   r-   r.   r}   r&   ry   rk   r{   r   r   r   r   r   rQ   rO   rP   rK   rL   rN   rM   rR   rS   r   r   r   r   rJ   ~   s0   
"J
&rJ   c               @   s+   e  Z d  Z d g Z d Z d Z d Z d S)Statevaluer   r      N)r+   r,   r-   r/   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 d d d  Z d d   Z d d	   Z	 d f  d
 d  Z
 e d f  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 d d d d    Z d S)!r   z!
    Base class for managers
    Nr   c             C   s   | d  k r t  j   j } n  | |  _ t  j |  |  _ t   |  _ t j |  j _	 | |  _
 t | \ |  _ |  _ | p t   |  _ d  S)N)r   rh   rZ   _addressrY   _authkeyr   _stater   r   _serializerr[   Z	_Listener_Clientr   _ctx)r%   r#   rZ   rb   Zctxr   r   r   r&     s    		zBaseManager.__init__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   r;   rJ   	_registryr   r   r   )r%   r   r   r   
get_server  s    zBaseManager.get_serverc             C   sN   t  |  j \ } } | |  j d |  j } t | d d  t j |  j _ d S)z>
        Connect manager object to the server process
        rZ   NrQ   )	r[   r   r   r   r9   r   r   r   r   )r%   rc   rd   r   r   r   r   connect  s    zBaseManager.connectc             C   sm  |  j  j t j k s t  | d k	 rC t |  rC t d   n  t j d d  \ } } |  j	 j
 d t |   j d |  j |  j |  j |  j | | | f  |  _ d j d d	   |  j j D  } t |   j d
 | |  j _ |  j j   | j   | j   |  _ | j   t j |  j  _ t j |  t |   j d |  j |  j |  j |  j  |  j f d d |  _ d S)z@
        Spawn a server process for this manager object
        Nzinitializer must be a callableZduplexFre   r5   :c             s   s   |  ] } t  |  Vq d  S)N)r:   )r   ir   r   r   	<genexpr>  s    z$BaseManager.start.<locals>.<genexpr>r?   exitpriorityr   )r   r   r   r   r;   rC   	TypeErrorr	   ZPiper   ZProcessr   _run_serverr   r   r   r   _processr   Z	_identityr+   r   rm   r   r1   r   r   Finalize_finalize_managerr   rK   )r%   initializerinitargsreaderwriterr   r   r   r   rm     s(    "

zBaseManager.startc       	      C   sl   | d k	 r | |   n  |  j  | | | |  } | j | j  | j   t j d | j  | j   d S)z@
        Create a server, report its address and run it
        Nzmanager serving at %r)_Serverr0   r#   r   r   r   ry   )	clsrX   r#   rZ   rb   r   r   r   serverr   r   r   r     s    
zBaseManager._run_serverc             O   s   |  j  j t j k s! t d   |  j |  j d |  j } z) t | d d | f | |  \ } } Wd | j	   Xt
 | |  j |  | f S)zP
        Create a new shared object; return the token and exposed tuple
        zserver not yet startedrZ   NrL   )r   r   r   r   r;   r   r   r   r9   r   r   )r%   r"   r5   r6   r   r$   r   r   r   r   _create  s    !)zBaseManager._createc             C   sA   |  j  d k	 r= |  j  j |  |  j  j   s= d |  _  q= n  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   sA   |  j  |  j d |  j } z t | d d  SWd | j   Xd S)zS
        Return some info about the servers shared objects and connections
        rZ   NrO   )r   r   r   r9   r   )r%   r   r   r   r   _debug_info$  s    zBaseManager._debug_infoc          
   C   sA   |  j  |  j d |  j } z t | d d  SWd | j   Xd S)z5
        Return the number of shared objects
        rZ   NrP   )r   r   r   r9   r   )r%   r   r   r   r   _number_of_objects.  s    zBaseManager._number_of_objectsc             C   sA   |  j  j t j k r" |  j   n  |  j  j t j k s= t  |  S)N)r   r   r   r   rm   r   r;   )r%   r   r   r   	__enter__8  s    zBaseManager.__enter__c             C   s   |  j    d  S)N)rK   )r%   exc_typeexc_valexc_tbr   r   r   __exit__>  s    zBaseManager.__exit__c             C   s  |  j    r t j d  y8 | | d | } z t | d d  Wd | j   XWn t k
 re Yn X|  j d d  |  j    r t j d  t |  d  r t j d	  |  j   |  j d d
  |  j    r t j d  q q q n  t	 j
 | _ y t j | =Wn t k
 rYn Xd S)zQ
        Shutdown the manager process; will be registered as a finalizer
        z#sending shutdown message to managerrZ   NrK   r   g      ?zmanager still alive	terminatez'trying to `terminate()` manager processg?z#manager still alive after terminate)r   r   r   r9   r   r~   r   hasattrr   r   r   r   r   _address_to_localKeyError)r   r#   rZ   r(   r   r   r   r   r   r   A  s.    
zBaseManager._finalize_managerc             C   s   |  j  S)N)r   )r%   r   r   r   <lambda>a  s    zBaseManager.<lambda>Tc       
         s-  d |  j  k r$ |  j j   |  _ n    d k r9 t   n  | pN t   d d  } | pf t   d d  } | r xg t | j    D]P \ } } t |  t k s t	 d |   t |  t k s t	 d |   q Wn  | | |   f |  j  <| r)   f d d   }	  |	 _
 t |   |	  n  d S)z9
        Register a typeid with the manager type
        r   N	_exposed__method_to_typeid_z%r is not a stringc          	      s   t  j d   |  j  | |  \ } }   | |  j d |  d |  j d | } |  j | j d |  j } t | d  d | j f  | S)Nz)requesting creation of a shared %r objectmanagerrZ   r   rS   )	r   ru   r   r   r   r   r#   r9   r$   )r%   r5   r6   r   Zexpproxyr   )r   r"   r   r   rE   ~  s    z"BaseManager.register.<locals>.temp)__dict__r   copy	AutoProxyr   r   r   r   r:   r;   r+   setattr)
r   r"   rC   r   r   r   create_methodkeyr   rE   r   )r   r"   r   registerc  s     	")
	zBaseManager.register)r+   r,   r-   r.   r   rJ   r   r&   r   r   rm   classmethodr   r   r   r   r   r   r   staticmethodr   propertyr#   r   r   r   r   r   r     s*   		$	

 	c               @   s(   e  Z d  Z d d   Z d d   Z d S)ProcessLocalSetc             C   s   t  j |  d d    d  S)Nc             S   s
   |  j    S)N)clear)r    r   r   r   r     s    z*ProcessLocalSet.__init__.<locals>.<lambda>)r   register_after_fork)r%   r   r   r   r&     s    zProcessLocalSet.__init__c             C   s   t  |   f  f S)N)r   )r%   r   r   r   
__reduce__  s    zProcessLocalSet.__reduce__N)r+   r,   r-   r&   r   r   r   r   r   r     s   r   c               @   s   e  Z d  Z d Z i  Z e j   Z d d d d d d  Z d d   Z	 f  i  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   sA  t  j j   zP t  j j | j d   } | d  k r\ t j   t   f } | t  j | j <n  Wd  t  j j	   X| d |  _
 | d |  _ | |  _ |  j j |  _ | |  _ | |  _ t | d |  _ | d  k	 r t j |  |  _ n3 |  j d  k	 r|  j j |  _ n t j   j |  _ | r*|  j   n  t j |  t  j  d  S)Nr   r   )r   _mutexr   r   r   r#   r   ZForkAwareLocalr   r   _tls_idset_tokenr$   _id_managerr   r[   r   r   rY   r   rh   rZ   _increfr   _after_fork)r%   r   rb   r   rZ   r   rR   Z	tls_idsetr   r   r   r&     s,    			zBaseProxy.__init__c             C   s   t  j d  t j   j } t j   j d k rK | d t j   j 7} n  |  j |  j j	 d |  j
 } t | d  d | f  | |  j _ d  S)Nzmaking connection to managerZ
MainThread|rZ   rM   )r   ru   r   rh   r   r_   r   r   r   r#   r   r9   r   r	   )r%   r   r   r   r   r   _connect  s    zBaseProxy._connectc             C   sE  y |  j  j } WnA t k
 rS t j d t j   j  |  j   |  j  j } Yn X| j	 |  j
 | | | f  | j   \ } } | d k r | S| d k r2| \ } } |  j j | j d
 }	 |  j j | _ |	 | |  j d |  j d |  j d | }
 |  j | j d |  j } t | d d	 | j f  |
 St | |   d S)zW
        Try to call a method of the referrent and return a copy of the result
        z#thread %r does not own a connectionz#RETURNz#PROXYr   r   rZ   r   NrS   )r   r	   r   r   ru   r_   r   r   r   r0   r   r1   r   r   r"   r   r#   r   r   r   r9   r$   r2   )r%   r4   r5   r6   r   r7   r8   r   r   r   r   r   r   r   _callmethod  s,    	
zBaseProxy._callmethodc             C   s   |  j  d  S)z9
        Get a copy of the value of the referent
        z	#GETVALUE)r   )r%   r   r   r   	_getvalue  s    zBaseProxy._getvaluec          
   C   s   |  j  |  j j d |  j } t | d  d |  j f  t j d |  j j  |  j	 j
 |  j  |  j or |  j j } t j |  t j d |  j |  j | |  j |  j	 |  j  f d d |  _ d  S)NrZ   rR   z	INCREF %rr5   r   
   )r   r   r#   r   r9   r   r   ru   r$   r   addr   r   r   r   _decrefr   Z_close)r%   r   r(   r   r   r   r     s    zBaseProxy._increfc             C   s
  | j  |  j  | d  k s. | j t j k r yE t j d |  j  | |  j d | } t | d  d |  j f  Wq t	 k
 r } z t j d |  WYd  d  } ~ Xq Xn t j d |  j  | rt
 | d  rt j d t j   j  | j j   | ` n  d  S)Nz	DECREF %rrZ   rS   z... decref failed %sz%DECREF %r -- manager already shutdownr	   z-thread %r has no more proxies so closing conn)discardr$   r   r   r   r   ru   r#   r9   r~   r   r_   r   r   r	   r   )r   rZ   r(   ZtlsZidsetr   r   r   r   r   r   r     s    &	zBaseProxy._decrefc             C   sT   d  |  _  y |  j   Wn6 t k
 rO } z t j d |  WYd  d  } ~ Xn Xd  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  j   d  k	 r( |  j | d <n  t |  d d  rc |  j | d <t t |  j |  j | f f St t	 |   |  j |  j | f f Sd  S)NrZ   _isautoFr   )
r
   Zget_spawning_popenr   r   r   RebuildProxyr   r   r   r   )r%   r6   r   r   r   r   $  s    zBaseProxy.__reduce__c             C   s
   |  j    S)N)r   )r%   memor   r   r   __deepcopy__1  s    zBaseProxy.__deepcopy__c             C   s*   d t  |   j |  j j d t |   f S)Nz<%s object, typeid %r at %s>z0x%x)r   r+   r   r"   r$   )r%   r   r   r   r*   4  s    zBaseProxy.__repr__c             C   sB   y |  j  d  SWn* t k
 r= t |   d d  d SYn Xd S)zV
        Return representation of the referent (or a fall-back if that fails)
        r*   Nr   z; '__str__()' failed>r   )r   r~   r   )r%   r   r   r   rA   8  s    zBaseProxy.__str__)r+   r,   r-   r.   r   r   ZForkAwareThreadLockr   r&   r   r   r   r   r   r   r   r   r   r*   rA   r   r   r   r   r     s   %	c             C   s   t  t j   d d  } | rB | j | j k rB | j | j d S| j d d  oj t  t j   d d  } |  | | d | | Sd S)z
    Function used for unpickling proxy objects.

    If possible the shared object is returned, or otherwise a proxy for it.
    ri   Nr   rR   TZ_inheritingF)r   r   rh   r#   r]   r$   pop)rF   r   rb   r6   r   rR   r   r   r   r   E  s    r   c             C   s   t  |  } y | |  | f SWn t k
 r2 Yn Xi  } x% | D] } t d | | f |  q@ Wt |  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   MakeProxyTypeZ  s    	r   Tc       
      C   s   t  | d } | d k r\ | |  j d | } z t | d d |  f  } Wd | j   Xn  | d k r | d k	 r | j } n  | d k r t j   j } n  t d |  j	 |  } | |  | d | d | d | }	 d |	 _
 |	 S)	z*
    Return an auto-proxy for `token`
    r   NrZ   rN   zAutoProxy[%s]r   rR   T)r[   r#   r9   r   r   r   rh   rZ   r   r"   r   )
r   rb   r   rZ   r   rR   r   r   r   r   r   r   r   r   p  s    		r   c               @   s(   e  Z d  Z d d   Z d d   Z d S)	Namespacec             K   s   |  j  j |  d  S)N)r   update)r%   r6   r   r   r   r&     s    zNamespace.__init__c             C   sy   t  |  j j    } g  } x= | D]5 \ } } | j d  s" | j d | | f  q" q" W| j   d t j d |  S)NrH   z%s=%rzNamespace(%s)z, )r   r   r   
startswithrD   r   r:   r   )r%   r   rE   r   r   r   r   r   r*     s    
zNamespace.__repr__N)r+   r,   r-   r&   r*   r   r   r   r   r     s   r   c               @   sR   e  Z d  Z d d d  Z d d   Z d d   Z d d	   Z e e e  Z d
 S)ValueTc             C   s   | |  _  | |  _ d  S)N)	_typecode_value)r%   r   r   lockr   r   r   r&     s    	zValue.__init__c             C   s   |  j  S)N)r  )r%   r   r   r   r     s    z	Value.getc             C   s   | |  _  d  S)N)r  )r%   r   r   r   r   r     s    z	Value.setc             C   s    d t  |   j |  j |  j f S)Nz
%s(%r, %r))r   r+   r  r  )r%   r   r   r   r*     s    zValue.__repr__N)	r+   r,   r-   r&   r   r   r*   r   r   r   r   r   r   r     s
   r   c             C   s   t  j  |  |  S)N)r   )r   Zsequencer  r   r   r   Array  s    r  c               @   sR   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__r0   throwr   c             C   s   |  S)Nr   )r%   r   r   r   __iter__  s    zIteratorProxy.__iter__c             G   s   |  j  d |  S)Nr  )r   )r%   r5   r   r   r   r    s    zIteratorProxy.__next__c             G   s   |  j  d |  S)Nr0   )r   )r%   r5   r   r   r   r0     s    zIteratorProxy.sendc             G   s   |  j  d |  S)Nr  )r   )r%   r5   r   r   r   r    s    zIteratorProxy.throwc             G   s   |  j  d |  S)Nr   )r   )r%   r5   r   r   r   r     s    zIteratorProxy.closeN)z__next__zsendzthrowzclose)	r+   r,   r-   r   r  r  r0   r  r   r   r   r   r   r    s   r  c               @   sL   e  Z d  Z d Z d d d d  Z d d   Z d	 d
   Z d d   Z d S)AcquirerProxyr   r   TNc             C   s1   | d  k r | f n	 | | f } |  j  d |  S)Nr   )r   )r%   Zblockingr   r5   r   r   r   r     s    !zAcquirerProxy.acquirec             C   s   |  j  d  S)Nr   )r   )r%   r   r   r   r     s    zAcquirerProxy.releasec             C   s   |  j  d  S)Nr   )r   )r%   r   r   r   r     s    zAcquirerProxy.__enter__c             C   s   |  j  d  S)Nr   )r   )r%   r   r   r   r   r   r   r     s    zAcquirerProxy.__exit__)zacquirezrelease)r+   r,   r-   r   r   r   r   r   r   r   r   r   r	    s
   r	  c               @   sL   e  Z d  Z d Z d d d  Z d	 d
   Z d d   Z d d d  Z d S)ConditionProxyr   r   ro   notify
notify_allNc             C   s   |  j  d | f  S)Nro   )r   )r%   r   r   r   r   ro     s    zConditionProxy.waitc             C   s   |  j  d  S)Nr  )r   )r%   r   r   r   r    s    zConditionProxy.notifyc             C   s   |  j  d  S)Nr  )r   )r%   r   r   r   r    s    zConditionProxy.notify_allc             C   s   |   } | r | S| d  k	 r/ t    | } n d  } d  } xL | s | d  k	 rp | t    } | d k rp Pqp n  |  j |  |   } q> W| S)Nr   )_timero   )r%   Z	predicater   r8   ZendtimeZwaittimer   r   r   wait_for  s    		zConditionProxy.wait_for)zacquirezreleasezwaitznotifyz
notify_all)r+   r,   r-   r   ro   r  r  r  r   r   r   r   r
    s
   r
  c               @   sI   e  Z d  Z d Z d d   Z d d   Z d	 d
   Z d d d  Z d S)
EventProxyrn   r   r   ro   c             C   s   |  j  d  S)Nrn   )r   )r%   r   r   r   rn     s    zEventProxy.is_setc             C   s   |  j  d  S)Nr   )r   )r%   r   r   r   r     s    zEventProxy.setc             C   s   |  j  d  S)Nr   )r   )r%   r   r   r   r     s    zEventProxy.clearNc             C   s   |  j  d | f  S)Nro   )r   )r%   r   r   r   r   ro     s    zEventProxy.wait)zis_setzsetzclearzwait)r+   r,   r-   r   rn   r   r   ro   r   r   r   r   r    s
   r  c               @   ss   e  Z d  Z d Z d d d  Z d d	   Z d
 d   Z e d d    Z e d d    Z	 e d d    Z
 d S)BarrierProxy__getattribute__ro   abortresetNc             C   s   |  j  d | f  S)Nro   )r   )r%   r   r   r   r   ro     s    zBarrierProxy.waitc             C   s   |  j  d  S)Nr  )r   )r%   r   r   r   r    s    zBarrierProxy.abortc             C   s   |  j  d  S)Nr  )r   )r%   r   r   r   r    s    zBarrierProxy.resetc             C   s   |  j  d d  S)Nr  parties)zparties)r   )r%   r   r   r   r    s    zBarrierProxy.partiesc             C   s   |  j  d d  S)Nr  	n_waiting)z	n_waiting)r   )r%   r   r   r   r    s    zBarrierProxy.n_waitingc             C   s   |  j  d d  S)Nr  broken)zbroken)r   )r%   r   r   r   r    s    zBarrierProxy.broken)z__getattribute__zwaitzabortzreset)r+   r,   r-   r   ro   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 d d	   Z d
 S)NamespaceProxyr  __setattr____delattr__c             C   sB   | d d k r  t  j |  |  St  j |  d  } | d | f  S)Nr   rH   r   r  )objectr  )r%   r   
callmethodr   r   r   __getattr__  s    zNamespaceProxy.__getattr__c             C   sH   | d d k r# t  j |  | |  St  j |  d  } | d | | f  S)Nr   rH   r   r  )r  r  r  )r%   r   r   r  r   r   r   r    s    zNamespaceProxy.__setattr__c             C   sB   | d d k r  t  j |  |  St  j |  d  } | d | f  S)Nr   rH   r   r  )r  r  r  )r%   r   r  r   r   r   r    s    zNamespaceProxy.__delattr__N)z__getattribute__z__setattr__z__delattr__)r+   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)	
ValueProxyr   r   c             C   s   |  j  d  S)Nr   )r   )r%   r   r   r   r     s    zValueProxy.getc             C   s   |  j  d | f  S)Nr   )r   )r%   r   r   r   r   r     s    zValueProxy.setN)zgetzset)r+   r,   r-   r   r   r   r   r   r   r   r   r   r    s   r  BaseListProxy__add____contains____delitem____getitem____len____mul____reversed____rmul____setitem__rD   countextendindexinsertr   removereverser   __imul__c               @   s(   e  Z d  Z d d   Z d d   Z d S)	ListProxyc             C   s   |  j  d | f  |  S)Nr)  )r   )r%   r   r   r   r   __iadd__$  s    zListProxy.__iadd__c             C   s   |  j  d | f  |  S)Nr.  )r   )r%   r   r   r   r   r.  '  s    zListProxy.__imul__N)r+   r,   r-   r0  r.  r   r   r   r   r/  #  s   r/  	DictProxyr   r   r   Zhas_keypopitem
setdefaultr   
ArrayProxy	PoolProxyZapplyZapply_asyncr   ZimapZimap_unorderedr   mapZ	map_asyncstarmapZstarmap_asyncr   ZAsyncResultIteratorc               @   s(   e  Z d  Z d d   Z d d   Z d S)r5  c             C   s   |  S)Nr   )r%   r   r   r   r   D  s    zPoolProxy.__enter__c             C   s   |  j    d  S)N)r   )r%   r   r   r   r   r   r   r   F  s    zPoolProxy.__exit__N)r+   r,   r-   r   r   r   r   r   r   r5  C  s   c               @   s   e  Z d  Z d Z d S)r   a(  
    Subclass of `BaseManager` which supports a number of shared object types.

    The types registered are those intended for the synchronization
    of threads, plus `dict`, `list` and `Namespace`.

    The `multiprocessing.Manager()` function creates started instances of
    this class.
    N)r+   r,   r-   r.   r   r   r   r   r   M  s   	QueueZJoinableQueuerf   Lockr`   	SemaphoreBoundedSemaphore	ConditionBarrierPoolr   r   r   r   F)I__all__rr   r_   r   Zqueuer   r  r   r    r	   r
   r   r   r   r   r   r   r   Z
view_typesr   r!   Z	view_typer  r   r9   r2   r~   r<   rG   rI   rJ   r   rc   rd   ZXmlListenerZ	XmlClientr[   r   r   r   r   r   r   r   r   r   r  r  r	  r
  r  r  r  r  r  r/  r1  r4  ZBasePoolProxyr   r5  r   r9  rf   r:  r`   r;  r<  r=  r>  r?  r   r   r   r   r   <module>   s   

 #

		
