o
    f                     @   sP  g d 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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 W n eyk   dZY nw dZe d dd Zeeje dd dD Zed eurd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,e0Z1G d-d. d.e Z2d/d0 Z3i fd1d2Z4		dmd3d4Z5G d5d6 d6e Z6G d7d8 d8e Z7dnd9d:Z8G d;d< d<e2Z9G d=d> d>e2Z:G d?d@ d@e:Z;G dAdB dBe2Z<G dCdD dDe2Z=G dEdF dFe2Z>G dGdH dHe2Z?e4dIdJZ@G dKdL dLe@ZAe4dMdNZBdOdPieB_Ce4dQdRZDe4dSdTZEdUdUdUdPdPdVeE_CG dWdS dSeEZFG dXdY dYe/ZGeGdZejH eGd[ejH eGd\ejIe< eGd]ejJe: eGd^ejKe: eGd_ejLe: eGd`ejMe: eGdaejNe; eGdbejOe= eGdcejPeF eGddeeA eGdeeQeB eGd8e7e? eGd:e8eD eGd6e6e> eGjdPe9ddf eGjdUddg er&G dhdi diZRG djdk dke(ZSG dld de/ZTdS dS )o)BaseManagerSyncManager	BaseProxyToken    N)getpid)
format_exc   )
connection)	reductionget_spawning_popenProcessError)pool)process)util)get_context)shared_memoryFTSharedMemoryManagerc                 C   s   t j | j|  ffS N)arraytypecodetobytes)a r   //usr/lib/python3.10/multiprocessing/managers.pyreduce_array/      r   c                 C   s   g | ]
}t ti | qS r   )typegetattr.0namer   r   r   
<listcomp>3       r!   )itemskeysvaluesc                 C   s   t t | ffS r   )listobjr   r   r   rebuild_as_list5      r)   c                   @   s4   e Zd ZdZdZdd Zdd Zdd Zd	d
 ZdS )r   z3
    Type to uniquely identify a shared object
    typeidaddressidc                 C   s   |||| _ | _| _d S r   r+   )selfr,   r-   r.   r   r   r   __init__D   s   zToken.__init__c                 C   s   | j | j| jfS r   r+   r/   r   r   r   __getstate__G      zToken.__getstate__c                 C   s   |\| _ | _| _d S r   r+   r/   stater   r   r   __setstate__J   r   zToken.__setstate__c                 C   s   d| j j| j| j| jf S )Nz %s(typeid=%r, address=%r, id=%r))	__class____name__r,   r-   r.   r1   r   r   r   __repr__M   s   zToken.__repr__N)	r8   
__module____qualname____doc__	__slots__r0   r2   r6   r9   r   r   r   r   r   >   s    r   r   c                 C   s4   |  ||||f |  \}}|dkr|S t||)zL
    Send a message to manager using connection `c` and return response
    #RETURN)sendrecvconvert_to_error)cr.   
methodnameargskwdskindresultr   r   r   dispatchU   s
   
rH   c                 C   s^   | dkr|S | dv r(t |tstd|| t|| dkr$td| S t|S td| S )N#ERROR)
#TRACEBACK#UNSERIALIZABLEz.Result {0!r} (kind '{1}') type is {2}, not strrK   zUnserializable message: %s
zUnrecognized message type {!r})
isinstancestr	TypeErrorformatr   RemoteError
ValueError)rF   rG   r   r   r   rA   _   s   

rA   c                   @   s   e Zd Zdd ZdS )rP   c                 C   s   dt | jd  d S )NzM
---------------------------------------------------------------------------
r   zK---------------------------------------------------------------------------)rM   rD   r1   r   r   r   __str__o   s   zRemoteError.__str__N)r8   r:   r;   rR   r   r   r   r   rP   n   s    rP   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_methodsv   s   

rX   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"   z"public_methods.<locals>.<listcomp>)rX   r'   r   r   r   public_methods   s   rZ   c                   @   s   e Zd ZdZg dZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Z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   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-   backlog0Nr   )rL   bytesrN   rO   r   registryr   AuthenticationStringauthkeylistener_clientlistenerr-   	id_to_objid_to_refcountid_to_local_proxy_obj	threadingLockmutex)r/   rj   r-   rl   
serializerListenerClientr   r   r   r0      s   


zServer.__init__c              	   C   s   t  | _| t _zGt j| jd}d|_|	  z| j
 s*| jd | j
 rW n ttfy6   Y nw W tjtjkrKtd tjt_tjt_td dS tjtjkretd tjt_tjt_td w )z(
        Run the server forever
        )targetTr   zresetting stdout, stderrr   N)rr   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/   r~   r   r   r   serve_forever   s2   





zServer.serve_foreverc                 C   sF   	 z| j  }W n	 ty   Y q w tj| j|fd}d|_|  q)NTrx   rD   )rn   acceptOSErrorrr   r}   handle_requestr   r   )r/   rB   tr   r   r   r~      s   zServer.accepterc                 C   s:  d }z*t || j t || j | }|\}}}}|| jv s&J d| t| |}W n ty:   dt f}Y n!w z||g|R i |}	W n tyV   dt f}Y nw d|	f}z|	| W d S  ty }
 z-z
|	dt f W n	 ty~   Y nw t
d| t
d| t
d|
 W Y d }
~
d S d }
~
ww )Nz%r unrecognizedrJ   r>   zFailure to send message: %rz ... request was %r ... exception was %r)r	   deliver_challengerl   answer_challenger@   publicr   	Exceptionr   r?   r   info)r/   rB   requestignorefuncnamerD   rE   rW   msgrG   er   r   r   _handle_request   s<   zServer._handle_requestc                 C   sJ   zz|  | W n	 ty   Y nw W |  dS W |  dS |  w )z)
        Handle a new connection
        N)r   r   closer/   connr   r   r   r      s   zServer.handle_requestc                 C   s  t dt j |j}|j}| j}| j	 sdzd }}| }|\}}}	}
z	|| \}}}W n& t
yU } zz
| j| \}}}W n	 t
yJ   |w W Y d}~nd}~ww ||vretd|t||f t||}z	||	i |
}W n ty } z
d|f}W Y d}~n*d}~ww |o||d}|r| |||\}}t|| j|}d||ff}nd|f}W n` ty   |du rdt f}n(z| j| }|| |||g|	R i |
}d|f}W n ty   dt f}Y nw Y n& ty   t dt j td	 Y n ty   dt f}Y nw zz|| W n ty)   |d
t f Y nw W n1 ty\ } z$t dt j t d| t d| |  td W Y d}~nd}~ww | j	 rdS dS )zQ
        Handle requests from the proxies in a particular process/thread
        z$starting server thread to service %rNz+method %r of %r object is not in exposed=%rrI   #PROXYr>   rJ   z$got EOF -- exiting thread serving %rr   rK   zexception in thread serving %rz ... message was %rr   r   )r   r   rr   current_threadr    r@   r?   ro   rz   r   KeyErrorrq   AttributeErrorr   r   r   getr]   r   r-   r   fallback_mappingEOFErrorr   r   r   r   )r/   r   r@   r?   ro   rC   r(   r   identrD   rE   exposed	gettypeidkefunctionresr   r   r,   ridentrexposedtokenfallback_funcrG   r   r   r   serve_client   s   

zServer.serve_clientc                 C   s   |S r   r   r/   r   r   r(   r   r   r   fallback_getvalue?     zServer.fallback_getvaluec                 C      t |S r   rM   r   r   r   r   fallback_strB     zServer.fallback_strc                 C   r   r   )reprr   r   r   r   fallback_reprE  r   zServer.fallback_repr)rR   r9   	#GETVALUEc                 C   s   d S r   r   r/   rB   r   r   r   rb   N  r   zServer.dummyc              
   C   s   | j ; g }t| j }|  |D ]}|dkr1|d|| j| t| j| d dd f  qd|W  d   S 1 sAw   Y  dS )zO
        Return some info --- useful to spot problems with refcounting
        rg   z  %s:       refcount=%s
    %sr   NK   
)	rt   r&   rp   r$   sortrU   rM   ro   join)r/   rB   rG   r$   r   r   r   r   r`   Q  s   
$zServer.debug_infoc                 C   s
   t | jS )z*
        Number of shared objects
        )lenrp   r   r   r   r   ra   a  s   
zServer.number_of_objectsc                 C   s`   z)zt d |d W n   ddl}|  Y W | j  dS W | j  dS | j  w )z'
        Shutdown this process
        z!manager received shutdown messager>   Nr   N)r   r   r?   	traceback	print_excrz   set)r/   rB   r   r   r   r   r\   h  s   
zServer.shutdownc                O   s  | j q | j| \}}}}|du r"|st|dkrtd|d }	n||i |}	|du r1t|	}|durLt|tsDtd|t	|t
|t
| }dt|	 }
td||
 |	t||f| j|
< |
| jvrmd| j|
< W d   n1 sww   Y  | ||
 |
t|fS )z>
        Create a new shared object and return its id
        Nr   z4Without callable, must have one non-keyword argumentr   z,Method_to_typeid {0!r}: type {1!s}, not dictz%xz&%r callable returned object with id %r)rt   rj   r   rQ   rZ   rL   dictrN   rO   r   r&   r.   r   r   r   ro   rp   rc   tuple)r/   rB   r,   rD   rE   rT   r   method_to_typeid	proxytyper(   r   r   r   r   r]   u  s:   




zServer.createc                 C   s   t | j|j d S )zL
        Return the methods of the shared object indicated by token
        r   )r   ro   r.   )r/   rB   r   r   r   r   r_     s   zServer.get_methodsc                 C   s"   |t  _|d | | dS )z=
        Spawn a new thread to serve this connection
        r   N)rr   r   r    r?   r   )r/   rB   r    r   r   r   r^     s   

zServer.accept_connectionc                 C   s   | j R z| j|  d7  < W n5 tyD } z)|| jv r8d| j|< | j| | j|< | j| \}}}td| n|W Y d }~nd }~ww W d    d S W d    d S 1 sXw   Y  d S )Nr   z&Server re-enabled tracking & INCREF %r)rt   rp   r   rq   ro   r   r   )r/   rB   r   r   r(   r   r   r   r   r   rc     s$   

"zServer.increfc                 C   s   || j vr|| jv rtd| d S | j2 | j | dkr,td|| j| | j | | j |  d8  < | j | dkr@| j |= W d    n1 sJw   Y  || j vryd| j|< td| | j | j|= W d    d S 1 srw   Y  d S 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)rp   rq   r   r   rt   AssertionErrorrO   ro   )r/   rB   r   r   r   r   rd     s0   






"zServer.decrefN)r8   r:   r;   r<   r   r0   r   r~   r   r   r   r   r   r   r   rb   r`   ra   r\   r]   r_   r^   rc   rd   r   r   r   r   r[      s2    
Q$r[   c                   @   s   e Zd ZdgZdZdZdZdS )Statevaluer   r      N)r8   r:   r;   r=   INITIALSTARTEDSHUTDOWNr   r   r   r   r     s
    r   )pickle	xmlrpclibc                   @   s   e Zd ZdZi ZeZ		d"ddZdd Zdd	 Z	d#ddZ
e	
d#ddZdd Zd$ddZdd Zdd Zdd Zdd Zedd Zedd Ze		d%d d!ZdS )&r   z!
    Base class for managers
    Nr   c                 C   s\   |d u r	t  j}|| _t || _t | _tj| j_	|| _
t| \| _| _|p*t | _d S r   )r   r{   rl   _addressrk   _authkeyr   _stater   r   _serializerrm   	_Listener_Clientr   _ctx)r/   r-   rl   ru   ctxr   r   r   r0     s   

zBaseManager.__init__c                 C   sb   | j jtjkr&| j jtjkrtd| j jtjkrtd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   rO   r[   	_registryr   r   r   r1   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
        rl   Nrb   )	rm   r   r   r   rH   r   r   r   r   )r/   rv   rw   r   r   r   r   connect  s   zBaseManager.connectr   c              	   C   s0  | j jtjkr&| j jtjkrtd| j jtjkrtdtd| j j|dur2t|s2t	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)duplexr   :c                 s   s    | ]}t |V  qd S r   r   )r   ir   r   r   	<genexpr>0  s    z$BaseManager.start.<locals>.<genexpr>-r   rD   exitpriority)!r   r   r   r   r   r   r   rO   rT   rN   r	   Piper   Processr   _run_serverr   r   r   r   _processr   	_identityr8   r    r   r   r@   r   Finalize_finalize_managerr   r\   )r/   initializerinitargsreaderwriterr   r   r   r   r     s>   




zBaseManager.startc           	      C   s^   t  t jt j |du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   )	clsrj   r-   rl   ru   r   r   r   serverr   r   r   r   B  s   zBaseManager._run_serverc                O   sl   | j jtjksJ d| j| j| jd}zt|dd|f| |\}}W |  n|  w t	|| j||fS )zP
        Create a new shared object; return the token and exposed tuple
        zserver not yet startedr   Nr]   )
r   r   r   r   r   r   r   rH   r   r   )r/   r,   rD   rE   r   r.   r   r   r   r   _createY  s   zBaseManager._createc                 C   s2   | j dur| j | | j  sd| _ dS dS dS )zC
        Join the manager process (if it has been spawned)
        N)r   r   is_aliver/   timeoutr   r   r   r   e  s   


zBaseManager.joinc                 C   4   | j | j| jd}zt|ddW |  S |  w )zS
        Return some info about the servers shared objects and connections
        r   Nr`   r   r   r   rH   r   r   r   r   r   _debug_infon     zBaseManager._debug_infoc                 C   r   )z5
        Return the number of shared objects
        r   Nra   r   r   r   r   r   _number_of_objectsx  r  zBaseManager._number_of_objectsc                 C   sf   | j jtjkr|   | j jtjkr1| j jtjkrtd| j jtjkr(tdtd| j j| S )NzUnable to start serverr   r   )	r   r   r   r   r   r   r   r   rO   r1   r   r   r   	__enter__  s   zBaseManager.__enter__c                 C      |    d S r   )r\   r/   exc_typeexc_valexc_tbr   r   r   __exit__     zBaseManager.__exit__c                 C   s   |   rYtd z|||d}zt|dd W |  n|  w W n	 ty,   Y nw | jdd |   rYtd t| drYtd	 |   | jdd |   rYtd
 t	j
|_ztj|= W dS  tyn   Y dS w )zQ
        Shutdown the manager process; will be registered as a finalizer
        z#sending shutdown message to managerr   Nr\   g      ?)r   zmanager still alive	terminatez'trying to `terminate()` manager processz#manager still alive after terminate)r   r   r   rH   r   r   r   hasattrr  r   r   r   r   _address_to_localr   )r   r-   rl   r5   r   r   r   r   r   r     s2   




zBaseManager._finalize_managerc                 C      | j S r   )r   r1   r   r   r   r-     s   zBaseManager.addressTc           
         s   d| j vr| j | _ du rt |pt dd}|p t dd}|rFt| D ]\}}t|tu s9J d| t|tu sEJ d| q)||| f| j< |rc fdd}	|	_	t
| |	 dS dS )z9
        Register a typeid with the manager type
        r   N	_exposed__method_to_typeid_z%r is not a stringc                   sf   t d | jg|R i |\}} || j| | j|d}| j|j| jd}t|d d|jf |S )Nz)requesting creation of a shared %r objectmanagerrl   r   r   rd   )	r   r   r   r   r   r   r-   rH   r.   )r/   rD   rE   r   expproxyr   r   r,   r   r   rV     s   z"BaseManager.register.<locals>.temp)__dict__r   copy	AutoProxyr   r&   r#   r   rM   r8   setattr)
r   r,   rT   r   r   r   create_methodkeyr   rV   r   r  r   register  s&   



zBaseManager.register)NNr   Nrh   r   )NNNNT)r8   r:   r;   r<   r   r[   r   r0   r   r   r   classmethodr   r   r   r  r  r  r
  staticmethodr   propertyr-   r  r   r   r   r   r     s6    

	+
	



r   c                   @      e Zd Zdd Zdd ZdS )ProcessLocalSetc                 C   s   t | dd  d S )Nc                 S      |   S r   )clearr'   r   r   r   <lambda>  s    z*ProcessLocalSet.__init__.<locals>.<lambda>)r   register_after_forkr1   r   r   r   r0     r   zProcessLocalSet.__init__c                 C   s   t | dfS rh   )r   r1   r   r   r   
__reduce__  r  zProcessLocalSet.__reduce__N)r8   r:   r;   r0   r'  r   r   r   r   r"        r"  c                   @   s   e Zd ZdZi Ze Z		dddZdd Z	d	i fd
dZ
dd Zdd Zedd Zdd Zdd Zdd Zdd Zdd ZdS )r   z.
    A base for proxies of shared objects
    NTFc           	      C   s   t j! t j|jd }|d u rt t f}|t j|j< W d    n1 s'w   Y  |d | _|d | _	|| _
| j
j| _|| _|| _t| d | _|| _|d urYt|| _n| jd urd| jj| _nt j| _|rp|   t| t j d S )Nr   r   )r   _mutexr  r   r-   r   ForkAwareLocalr"  _tls_idset_tokenr.   _id_managerr   rm   r   _owned_by_managerr   rk   r   r{   rl   _increfr&  _after_fork)	r/   r   ru   r  rl   r   rc   manager_owned	tls_idsetr   r   r   r0     s.   



zBaseProxy.__init__c                 C   sd   t d t j}t jdkr|dt j 7 }| j| jj	| j
d}t|d d|f || j_d S )Nzmaking connection to manager
MainThread|r   r^   )r   r   r   r{   r    rr   r   r   r-  r-   r   rH   r+  r	   )r/   r    r   r   r   r   _connect  s   

zBaseProxy._connectr   c                 C   s   z| j j}W n ty    tdt j |   | j j}Y nw |	| j
|||f | \}}|dkr7|S |dkrm|\}}| jj|j d }	| jj|_|	|| j| j| j|d}
| j|j| jd}t|dd|jf |
S t||)	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   Nrd   )r+  r	   r   r   r   rr   r   r    r7  r?   r.  r@   r/  r   r,   r-  r-   r   r   r   rH   r.   rA   )r/   rC   rD   rE   r   rF   rG   r   r   r   r  r   r   r   _callmethod%  s2   


zBaseProxy._callmethodc                 C   
   |  dS )z9
        Get a copy of the value of the referent
        r   r9  r1   r   r   r   	_getvalueC  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o5| jj}tj| tj| j| j|| j| j
| jfdd| _d S )Nz%owned_by_manager skipped INCREF of %rr   rc   z	INCREF %r
   r   )r0  r   r   r-  r.   r   r-   r   rH   r.  r,  addr/  r   r   r   _decrefr+  _close)r/   r   r5   r   r   r   r1  I  s   
zBaseProxy._increfc              
   C   s   | | j |d u s|jtjkrBztd| j || j|d}t|d d| jf W n t	yA } ztd| W Y d }~nd }~ww td| j |sbt
|drdtdt j |j  |`d S d S d S )Nz	DECREF %rr   rd   z... decref failed %sz%DECREF %r -- manager already shutdownr	   z-thread %r has no more proxies so closing conn)discardr.   r   r   r   r   r   r-   rH   r   r  rr   r   r    r	   r   )r   rl   r5   tlsidsetr   r   r   r   r   r   r?  ]  s$   
zBaseProxy._decrefc              
   C   sJ   d | _ z|   W d S  ty$ } ztd|  W Y d }~d S d }~ww )Nzincref failed: %s)r/  r1  r   r   r   )r/   r   r   r   r   r2  v  s   zBaseProxy._after_forkc                 C   sZ   i }t  d ur| j|d< t| ddr!| j|d< tt| j| j|ffS tt| | j| j|ffS )Nrl   _isautoFr   )	r   r   r   r  RebuildProxyr  r-  r   r   r/   rE   r   r   r   r'  ~  s   


zBaseProxy.__reduce__c                 C   r#  r   )r<  )r/   memor   r   r   __deepcopy__  r   zBaseProxy.__deepcopy__c                 C   s   dt | j| jjt| f S )Nz<%s object, typeid %r at %#x>)r   r8   r-  r,   r.   r1   r   r   r   r9     s   zBaseProxy.__repr__c                 C   s4   z|  dW S  ty   t| dd d  Y S w )zV
        Return representation of the referent (or a fall-back if that fails)
        r9   Nr8  z; '__str__()' failed>)r9  r   r   r1   r   r   r   rR     s
   zBaseProxy.__str__NNNTF)r8   r:   r;   r<   r  r   ForkAwareThreadLockr)  r0   r7  r9  r<  r1  r  r?  r2  r'  rH  r9   rR   r   r   r   r   r     s$    
)	
r   c                 C   s   t t dd}|r*|j|jkr*td| d|d< |j|jvr*|j|j |j|j< |	ddo8t t dd }| ||fd|i|S )	z5
    Function used for unpickling proxy objects.
    r|   Nz*Rebuild a proxy owned by manager, token=%rTr3  rc   _inheritingF)
r   r   r{   r-   r   r   r.   rq   ro   pop)rW   r   ru   rE   r   rc   r   r   r   rE    s   

rE  c                 C   sn   t |}z|| |f W S  ty   Y nw i }|D ]}td||f | qt| 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   _cachedicmeth	ProxyTyper   r   r   MakeProxyType  s"   rR  c                 C   s   t | d }|du r%|| j|d}zt|dd| f}W |  n|  w |du r0|dur0|j}|du r9t j}td| j	 |}	|	| |||||d}
d|
_
|
S )z*
    Return an auto-proxy for `token`
    r   Nr   r_   zAutoProxy[%s])r  rl   rc   r3  T)rm   r-   rH   r   r   r   r{   rl   rR  r,   rD  )r   ru   r  rl   r   rc   r3  r   r   rQ  r  r   r   r   r    s    

r  c                   @   r!  )	Namespacec                K   s   | j | d S r   )r  updaterF  r   r   r   r0     r3   zNamespace.__init__c                 C   sZ   t | j }g }|D ]\}}|ds|d||f  q|  d| jjd|f S )NrY   z%s=%rz%s(%s)z, )	r&   r  r#   
startswithrU   r   r7   r8   r   )r/   r#   rV   r    r   r   r   r   r9     s   
zNamespace.__repr__N)r8   r:   r;   r0   r9   r   r   r   r   rS    r(  rS  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      || _ || _d S r   )	_typecode_value)r/   r   r   lockr   r   r   r0        
zValue.__init__c                 C   r  r   rY  r1   r   r   r   r     s   z	Value.getc                 C   s
   || _ d S r   r\  r/   r   r   r   r   r        
z	Value.setc                 C   s   dt | j| j| jf S )Nz
%s(%r, %r))r   r8   rX  rY  r1   r   r   r   r9     s   zValue.__repr__NT)	r8   r:   r;   r0   r   r   r9   r   r   r   r   r   r   rV    s    
rV  c                 C   s   t  | |S r   )r   )r   sequencerZ  r   r   r   Array  r  ra  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 r   r   r1   r   r   r   __iter__  r   zIteratorProxy.__iter__c                 G      |  d|S )Nrc  r;  r/   rD   r   r   r   rc  
  r  zIteratorProxy.__next__c                 G   rg  )Nr?   r;  rh  r   r   r   r?     r  zIteratorProxy.sendc                 G   rg  )Nrd  r;  rh  r   r   r   rd    r  zIteratorProxy.throwc                 G   rg  )Nr   r;  rh  r   r   r   r     r  zIteratorProxy.closeN)	r8   r:   r;   r  rf  rc  r?   rd  r   r   r   r   r   rb    s    rb  c                   @   s2   e Zd ZdZdddZdd Zdd	 Zd
d ZdS )AcquirerProxy)acquirereleaseTNc                 C   s"   |d u r|fn||f}|  d|S Nrj  r;  )r/   blockingr   rD   r   r   r   rj    s   zAcquirerProxy.acquirec                 C   r:  Nrk  r;  r1   r   r   r   rk    r^  zAcquirerProxy.releasec                 C   r:  rl  r;  r1   r   r   r   r    r^  zAcquirerProxy.__enter__c                 C   r:  rn  r;  r  r   r   r   r
    r^  zAcquirerProxy.__exit__)TN)r8   r:   r;   r  rj  rk  r  r
  r   r   r   r   ri    s    
ri  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)rj  rk  r   notify
notify_allNc                 C      |  d|fS Nr   r;  r   r   r   r   r   #  r*   zConditionProxy.waitr   c                 C   rr  )Nrp  r;  )r/   nr   r   r   rp  %  r*   zConditionProxy.notifyc                 C   r:  )Nrq  r;  r1   r   r   r   rq  '  r^  zConditionProxy.notify_allc                 C   sj   | }|r|S |d urt  | }nd }d }|s3|d ur)|t   }|dkr)	 |S | | | }|r|S )Nr   )time	monotonicr   )r/   	predicater   rG   endtimewaittimer   r   r   wait_for)  s"   
zConditionProxy.wait_forr   )r   )r8   r:   r;   r  r   rp  rq  rz  r   r   r   r   ro  !  s    

ro  c                   @   s2   e Zd ZdZdd Zdd Zdd Zdd	d
ZdS )
EventProxy)r   r   r$  r   c                 C   r:  )Nr   r;  r1   r   r   r   r   >  r^  zEventProxy.is_setc                 C   r:  Nr   r;  r1   r   r   r   r   @  r^  zEventProxy.setc                 C   r:  )Nr$  r;  r1   r   r   r   r$  B  r^  zEventProxy.clearNc                 C   rr  rs  r;  r   r   r   r   r   D  r*   zEventProxy.waitr   )r8   r:   r;   r  r   r   r$  r   r   r   r   r   r{  <  s    r{  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   rr  rs  r;  r   r   r   r   r   J  r*   zBarrierProxy.waitc                 C   r:  )Nr  r;  r1   r   r   r   r  L  r^  zBarrierProxy.abortc                 C   r:  )Nr  r;  r1   r   r   r   r  N  r^  zBarrierProxy.resetc                 C      |  ddS )Nr~  )partiesr;  r1   r   r   r   r  P     zBarrierProxy.partiesc                 C   r  )Nr~  )	n_waitingr;  r1   r   r   r   r  S  r  zBarrierProxy.n_waitingc                 C   r  )Nr~  )brokenr;  r1   r   r   r   r  V  r  zBarrierProxy.brokenr   )r8   r:   r;   r  r   r  r  r   r  r  r  r   r   r   r   r}  H  s    


r}  c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	NamespaceProxy)r~  __setattr____delattr__c                 C   s0   |d dkrt | |S t | d}|d|fS )Nr   rY   r9  r~  )objectr~  r/   r  
callmethodr   r   r   __getattr__]     zNamespaceProxy.__getattr__c                 C   s4   |d dkrt | ||S t | d}|d||fS )Nr   rY   r9  r  )r  r  r~  )r/   r  r   r  r   r   r   r  b  s   zNamespaceProxy.__setattr__c                 C   s0   |d dkrt | |S t | d}|d|fS )Nr   rY   r9  r  )r  r  r~  r  r   r   r   r  g  r  zNamespaceProxy.__delattr__N)r8   r:   r;   r  r  r  r  r   r   r   r   r  [  s
    r  c                   @   s4   e Zd ZdZdd Zdd ZeeeZee	j
ZdS )
ValueProxy)r   r   c                 C   r:  )Nr   r;  r1   r   r   r   r   p  r^  zValueProxy.getc                 C   rr  r|  r;  r]  r   r   r   r   r  r*   zValueProxy.setN)r8   r:   r;   r  r   r   r   r   r  typesGenericAlias__class_getitem__r   r   r   r   r  n  s    
r  BaseListProxy)__add____contains____delitem____getitem____len____mul____reversed____rmul____setitem__rU   countextendindexinsertrL  removereverser   __imul__c                   @   r!  )	ListProxyc                 C      |  d|f | S )Nr  r;  r]  r   r   r   __iadd__     zListProxy.__iadd__c                 C   r  )Nr  r;  r]  r   r   r   r    r  zListProxy.__imul__N)r8   r:   r;   r  r  r   r   r   r   r    s    r  	DictProxy)r  r  r  rf  r  r  r$  r  r   r#   r$   rL  popitem
setdefaultrT  r%   rf  Iterator
ArrayProxy)r  r  r  	PoolProxy)applyapply_asyncr   imapimap_unorderedr   map	map_asyncstarmapstarmap_asyncr  AsyncResult)r  r  r  r  r  c                   @   r!  )r  c                 C   re  r   r   r1   r   r   r   r    r   zPoolProxy.__enter__c                 C   r  r   )r  r  r   r   r   r
    r  zPoolProxy.__exit__N)r8   r:   r;   r  r
  r   r   r   r   r    r(  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)r8   r:   r;   r<   r   r   r   r   r     s    r   QueueJoinableQueuery   rs   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   rW  r   shared_memory_context_namesegment_names)r/   r    r  r   r   r   r0     r[  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  rU   r/   segment_namer   r   r   register_segment  s   z%_SharedMemoryTracker.register_segmentc                 C   sB   t d|dt   | j| t|}|  |  dS )zCalls 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  r  r   SharedMemoryr   unlink)r/   r  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   r7   r8   r   r  r1   r   r   r   __del__  s   z_SharedMemoryTracker.__del__c                 C   s   | j | jfS r   r  r1   r   r   r   r2     r  z!_SharedMemoryTracker.__getstate__c                 C   s   | j |  d S r   )r0   r4   r   r   r   r6     r*   z!_SharedMemoryTracker.__setstate__N)r8   r:   r;   r<   r0   r  r  r  r  r2   r6   r   r   r   r   r    s    	r  c                   @   sJ   e Zd Zejg d Zdd Zdd Zdd Zdd	 Zd
d Z	dd Z
dS )SharedMemoryServer)track_segmentrelease_segmentlist_segmentsc                 O   s`   t j| g|R i | | j}t|trt|}td| dt  | _	t
dt   d S )Nshm_rY   z"SharedMemoryServer started by pid )r[   r0   r-   rL   ri   osfsdecoder  r   shared_memory_contextr   r   )r/   rD   kwargsr-   r   r   r   r0     s   

zSharedMemoryServer.__init__c                O   s:   t | j| d dr| j|d< tj| ||g|R i |S )zCreate a new distributed-shared object (not backed by a shared
            memory block) and return its id to be used in a Proxy Object.r8  _shared_memory_proxyr  )r  rj   r  r[   r]   )r/   rB   r,   rD   r  r   r   r   r]     s   
zSharedMemoryServer.createc                 C   s   | j   t| |S )zACall unlink() on all tracked shared memory, terminate the Server.)r  r  r[   r\   r   r   r   r   r\     s   
zSharedMemoryServer.shutdownc                 C      | j | dS )z?Adds the supplied shared memory block name to Server's tracker.N)r  r  r/   rB   r  r   r   r   r    s   z SharedMemoryServer.track_segmentc                 C   r  )zCalls 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    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    s   z SharedMemoryServer.list_segmentsN)r8   r:   r;   r[   r   r0   r]   r\   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   sT   t jdkrddlm} |  tj| g|R i | t| j	j
 dt   d S )Nposixr   )resource_trackerz created by pid )r  r     r  ensure_runningr   r0   r   r   r7   r8   r   )r/   rD   r  r  r   r   r   r0   /  s
   
zSharedMemoryManager.__init__c                 C   s   t | jj dt   d S )Nz.__del__ by pid )r   r   r7   r8   r   r1   r   r   r   r  ;  s   zSharedMemoryManager.__del__c                 C   sd   | j jtjkr&| j jtjkrtd| j jtjkrtd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   rO   r   r   r   r   r   r1   r   r   r   r   ?  s   zSharedMemoryManager.get_serverc                 C   s   | j | j| jd/}tjdd|d}zt|dd|jf W n ty/ } z|  |d}~ww W d   |S 1 s;w   Y  |S )zoReturns a new SharedMemory instance with the specified size in
            bytes, to be tracked by the manager.r   NT)r]   sizer  )	r   r   r   r   r  rH   r    BaseExceptionr  )r/   r  r   smsr   r   r   r   r  L  s   
z SharedMemoryManager.SharedMemoryc                 C   s   | j | j| jd.}t|}zt|dd|jjf W n ty. } z|j	  |d}~ww W d   |S 1 s:w   Y  |S )zReturns a new ShareableList instance populated with the values
            from the input sequence, to be tracked by the manager.r   Nr  )
r   r   r   r   ShareableListrH   shmr    r  r  )r/   r`  r   slr   r   r   r   r  X  s   


z!SharedMemoryManager.ShareableListN)r8   r:   r;   r<   r  r   r0   r  r   r  r  r   r   r   r   r   #  s    	rI  r_  )U__all__r   rr   r   r   queueru  r  r  r   r   r   r  r	   contextr
   r   r   r   r   r   r   r   ImportError	HAS_SHMEMrU   r   r  
view_typesr&   r)   	view_typer  r   rH   rA   r   rP   rX   rZ   r[   r   rv   rw   XmlListener	XmlClientrm   r   r   r"  r   rE  rR  r  rS  rV  ra  rb  ri  ro  r{  r}  r  r  r  r  r  r  r  BasePoolProxyr  r   r  ry   rs   r  r  r  r  r  r  r   r  r  r   r   r   r   r   <module>   s   



  P

	 w
 4



	



%-