o ?Og@sPgdZddlZddlZddlZddlZddlZddlZddlZddlZddlm Z ddl m Z ddl m Z ddlmZmZmZddl mZdd l mZdd l mZdd l mZzdd l mZWn eykd ZYnwdZedddZeejedddDZedeurddZeD]ZeeeqGddde Z!difddZ"ddZ#Gddde$Z%d d!Z&d"d#Z'Gd$d%d%e Z(Gd&d'd'e Z)e j*e j+fe j,e j-fd(Z.Gd)d*d*e Z/Gd+d,d,e0Z1Gd-d.d.e Z2d/d0Z3ifd1d2Z4  dmd3d4Z5Gd5d6d6e Z6Gd7d8d8e Z7dnd9d:Z8Gd;d<dd>e2Z:Gd?d@d@e:Z;GdAdBdBe2ZGdGdHdHe2Z?e4dIdJZ@GdKdLdLe@ZAe4dMdNZBdOdPieB_Ce4dQdRZDe4dSdTZEdUdUdUdPdPdVeE_CGdWdSdSeEZFGdXdYdYe/ZGeGdZejHeGd[ejHeGd\ejIe<eGd]ejJe:eGd^ejKe:eGd_ejLe:eGd`ejMe:eGdaejNe;eGdbejOe=eGdcejPeFeGddeeAeGdeeQeBeGd8e7e?eGd:e8eDeGd6e6e>eGjdPe9d dfeGjdUd dger&GdhdidiZRGdjdkdke(ZSGdldde/ZTdSdS)o) BaseManager SyncManager BaseProxyTokenN)getpid) format_exc) connection) reductionget_spawning_popen ProcessError)pool)process)util) get_context) shared_memoryFTSharedMemoryManagercCstj|j|ffSN)arraytypecodetobytes)ar?/opt/alt/python310/lib64/python3.10/multiprocessing/managers.py reduce_array/rcCsg|] }tti|qSr)typegetattr.0namerrr 3r!)itemskeysvaluescCstt|ffSr)listobjrrrrebuild_as_list5r)c@s4eZdZdZdZddZddZddZd d Zd S) rz3 Type to uniquely identify a shared object typeidaddressidcCs||||_|_|_dSrr+)selfr,r-r.rrr__init__DszToken.__init__cCs|j|j|jfSrr+r/rrr __getstate__GzToken.__getstate__cCs|\|_|_|_dSrr+r/staterrr __setstate__JrzToken.__setstate__cCsd|jj|j|j|jfS)Nz %s(typeid=%r, address=%r, id=%r)) __class____name__r,r-r.r1rrr__repr__MszToken.__repr__N) r8 __module__ __qualname____doc__ __slots__r0r2r6r9rrrrr>s rrcCs4|||||f|\}}|dkr|St||)zL Send a message to manager using connection `c` and return response #RETURN)sendrecvconvert_to_error)cr. methodnameargskwdskindresultrrrdispatchUs   rHcCs^|dkr|S|dvr(t|tstd||t||dkr$td|St|Std|S)N#ERROR) #TRACEBACK#UNSERIALIZABLEz.Result {0!r} (kind '{1}') type is {2}, not strrKzUnserializable message: %s zUnrecognized message type {!r}) isinstancestr TypeErrorformatr RemoteError ValueError)rFrGrrrrA_s   rAc@seZdZddZdS)rPcCsdt|jddS)NzM --------------------------------------------------------------------------- rzK---------------------------------------------------------------------------)rMrDr1rrr__str__oszRemoteError.__str__N)r8r:r;rRrrrrrPns rPcCs2g}t|D]}t||}t|r||q|S)z4 Return a list of names of methods of `obj` )dirrcallableappend)r(tempr funcrrr all_methodsvs   rXcCsddt|DS)zP Return a list of names of methods of `obj` which do not start with '_' cSsg|] }|ddkr|qS)r_rrrrrr!r"z"public_methods..)rXr'rrrpublic_methodssrZc@seZdZdZgdZddZddZddZd d Zd d Z d dZ ddZ ddZ ddZ e e e dZddZddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(S))ServerzM Server class which runs in a process controlled by a manager object ) shutdowncreateaccept_connection get_methods debug_infonumber_of_objectsdummyincrefdecrefcCsxt|tstd|t|||_t||_t |\}}||dd|_ |j j |_ ddi|_ i|_ i|_t|_dS)Nz&Authkey {0!r} is type {1!s}, not bytes)r-Zbacklog0Nr)rLbytesrNrOrregistryrAuthenticationStringauthkeylistener_clientlistenerr- id_to_objid_to_refcountid_to_local_proxy_obj threadingLockmutex)r/rir-rk serializerListenerClientrrrr0s     zServer.__init__c Cst|_|t_zGtj|jd}d|_| z|j s*|j d|j rWn t t fy6YnwWtjtjkrKtdtjt_tjt_tddStjtjkretdtjt_tjt_tdw)z( Run the server forever )targetTrzresetting stdout, stderrrN)rqEvent stop_eventrcurrent_process_manager_serverThreadaccepterdaemonstartis_setwaitKeyboardInterrupt SystemExitsysstdout __stdout__rdebug __stderr__stderrexit)r/r}rrr serve_forevers2         zServer.serve_forevercCsF z|j}Wn tyYqwtj|j|fd}d|_|q)NTrwrD)rmZacceptOSErrorrqr|handle_requestr~r)r/rBtrrrr}s zServer.accepterc Cs:d}z*t||jt||j|}|\}}}}||jvs&Jd|t||}Wnty:dtf}Yn!wz ||g|Ri|} WntyVdtf}Ynwd| f}z| |WdSty} z-z | dtfWn ty~Ynwt d|t d|t d| WYd} ~ dSd} ~ ww)Nz%r unrecognizedrJr>zFailure to send message: %rz ... request was %r ... exception was %r) r Zdeliver_challengerkZanswer_challenger@publicr Exceptionrr?rinfo) r/rBrequestignorefuncnamerDrErWmsgrGerrr_handle_requests<      zServer._handle_requestcCsJzz||Wn tyYnwW|dSW|dS|w)z) Handle a new connection N)rrcloser/connrrrrs  zServer.handle_requestc Cstdtj|j}|j}|j}|j sdzd}}|}|\}}} } z ||\}} } Wn&t yU} zz |j |\}} } Wn t yJ| wWYd} ~ nd} ~ ww|| vret d|t || ft||}z || i| }Wnty}z d|f}WYd}~n*d}~ww| o| |d}|r||||\}}t||j|}d||ff}nd|f}Wn`t y|durdtf}n(z|j|}|||||g| Ri| }d|f}Wntydtf}YnwYn&tytdtjtd Yntydtf}Ynwzz||Wnty)|d tfYnwWn1ty\}z$td tjtd |td ||tdWYd}~nd}~ww|j rdSdS)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>rJz$got EOF -- exiting thread serving %rrrKzexception in thread serving %rz ... message was %rrr)rrrqcurrent_threadr r@r?rnryrKeyErrorrpAttributeErrorrrrgetr]rr-rfallback_mappingEOFErrorrrrr)r/rr@r?rnrCr(ridentrDrEexposed gettypeidkeZfunctionresrrr,ZridentZrexposedtokenZ fallback_funcrGrrr serve_clients              zServer.serve_clientcCs|Srrr/rrr(rrrfallback_getvalue?zServer.fallback_getvaluecCt|SrrMrrrr fallback_strBzServer.fallback_strcCrr)reprrrrr fallback_reprErzServer.fallback_repr)rRr9 #GETVALUEcCsdSrrr/rBrrrrbNrz Server.dummyc Cs|j;g}t|j}||D]}|dkr1|d||j|t|j|dddfqd|WdS1sAwYdS)zO Return some info --- useful to spot problems with refcounting rfz %s: refcount=%s %srNK ) rsr&ror$sortrUrMrnjoin)r/rBrGr$rrrrr`Qs $zServer.debug_infocCs t|jS)z* Number of shared objects )lenrorrrrraas zServer.number_of_objectscCs`z)z td|dWnddl}|YW|jdSW|jdS|jw)z' Shutdown this process z!manager received shutdown messager>NrN)rrr? traceback print_excryset)r/rBrrrrr\hs  zServer.shutdownc Os|jq|j|\}}}}|dur"|st|dkrtd|d} n||i|} |dur1t| }|durLt|tsDtd|t |t |t |}dt | } t d|| | t||f|j| <| |jvrmd|j| <Wdn1swwY||| | t|fS)z> Create a new shared object and return its id Nrz4Without callable, must have one non-keyword argumentrz,Method_to_typeid {0!r}: type {1!s}, not dictz%xz&%r callable returned object with id %r)rsrirrQrZrLdictrNrOrr&r.rrrrnrorctuple) r/rBr,rDrErTrmethod_to_typeid proxytyper(rrrrr]us:        z Server.createcCst|j|jdS)zL Return the methods of the shared object indicated by token r)rrnr.)r/rBrrrrr_szServer.get_methodscCs"|t_|d||dS)z= Spawn a new thread to serve this connection rN)rqrr r?r)r/rBr rrrr^s  zServer.accept_connectionc Cs|jRz |j|d7<Wn5tyD}z)||jvr8d|j|<|j||j|<|j|\}}}td|n|WYd}~n d}~wwWddSWddS1sXwYdS)Nrz&Server re-enabled tracking & INCREF %r)rsrorrprnrr)r/rBrrr(rrrrrrcs$    "z Server.increfcCs||jvr||jvrtd|dS|j2|j|dkr,td||j||j||j|d8<|j|dkr@|j|=Wdn1sJwY||jvryd|j|<td||j |j|=WddS1srwYdSdS)NzServer DECREF skipping %rrz+Id {0!s} ({1!r}) has refcount {2:n}, not 1+r)NrNzdisposing of obj with id %r)rorprrrsAssertionErrorrOrn)r/rBrrrrrds0       "z Server.decrefN)r8r:r;r<rr0rr}rrrrrrrrbr`rar\r]r_r^rcrdrrrrr[s2  Q $ r[c@seZdZdgZdZdZdZdS)StatevaluerrN)r8r:r;r=INITIALSTARTEDSHUTDOWNrrrrrs r)pickleZ xmlrpclibc@seZdZdZiZeZ  d"ddZddZdd Z d#d d Z e d#d dZ ddZ d$ddZddZddZddZddZeddZeddZe  d%d d!ZdS)&rz! Base class for managers NrcCs\|dur tj}||_t||_t|_tj|j_ ||_ t |\|_ |_ |p*t|_dSr)rrzrk_addressrj_authkeyr_staterr _serializerrlZ _Listener_Clientr_ctx)r/r-rkrtctxrrrr0s   zBaseManager.__init__cCsb|jjtjkr&|jjtjkrtd|jjtjkrtdtd|jjt|j |j |j |j S)zX Return server object with serve_forever() method and address attribute Already started serverManager has shut downUnknown state {!r}) rrrrrr rrOr[ _registryrrrr1rrr get_servers  zBaseManager.get_servercCs8t|j\}}||j|jd}t|ddtj|j_dS)z> Connect manager object to the server process rkNrb) rlrrrrHrrrr)r/rurvrrrrconnects zBaseManager.connectrc Cs0|jjtjkr&|jjtjkrtd|jjtjkrtdtd|jj|dur2t|s2t dt j dd\}}|j j t|j|j|j|j|j|||fd|_d d d |jjD}t|jd ||j_|j|||_|tj|j_tj|t|j|j|j|j|j|jfd d|_ dS)z@ Spawn a server process for this manager object rrrNzinitializer must be a callableF)Zduplexr:css|]}t|VqdSrr)rirrr 0sz$BaseManager.start..-rrDZ exitpriority)!rrrrrr rrOrTrNr ZPiperZProcessr _run_serverrrrr_processrZ _identityr8r rrr@rFinalize_finalize_managerrr\)r/ initializerinitargsreaderwriterrrrrrs>         zBaseManager.startc Cs^ttjtj|dur|||||||}||j|td|j| dS)z@ Create a server, report its address and run it Nzmanager serving at %r) signalSIGINTSIG_IGN_Serverr?r-rrrr) clsrir-rkrtrrrserverrrrrBs  zBaseManager._run_servercOsl|jjtjks Jd|j|j|jd}zt|dd|f||\}}W|n|wt ||j||fS)zP Create a new shared object; return the token and exposed tuple zserver not yet startedrNr]) rrrrrrrrHrr)r/r,rDrErr.rrrr_createYs zBaseManager._createcCs2|jdur|j||jsd|_dSdSdS)zC Join the manager process (if it has been spawned) N)rris_aliver/timeoutrrrres    zBaseManager.joincC4|j|j|jd}z t|ddW|S|w)zS Return some info about the servers shared objects and connections rNr`rrrrHrrrrr _debug_infon zBaseManager._debug_infocCr)z5 Return the number of shared objects rNrarrrrr_number_of_objectsxrzBaseManager._number_of_objectscCsf|jjtjkr ||jjtjkr1|jjtjkrtd|jjtjkr(tdtd|jj|S)NzUnable to start serverrr) rrrrrrr rrOr1rrr __enter__s zBaseManager.__enter__cC |dSr)r\r/exc_typeZexc_valZexc_tbrrr__exit__ zBaseManager.__exit__cCs|rYtdz|||d}z t|ddW|n|wWn ty,Ynw|jdd|rYtdt|drYtd ||jdd|rYtd t j |_ zt j |=WdStynYdSw) zQ Shutdown the manager process; will be registered as a finalizer z#sending shutdown message to managerrNr\g?)rzmanager still alive terminatez'trying to `terminate()` manager processz#manager still alive after terminate)rrrrHrrrhasattrrrrrr_address_to_localr)rr-rkr5rrrrrrs2          zBaseManager._finalize_managercC|jSr)rr1rrrr-szBaseManager.addressTc sd|jvr |j|_durt|ptdd}|p tdd}|rFt|D]\}}t|tus9Jd|t|tusEJd|q)|||f|j<|rcfdd} | _ t || dSdS)z9 Register a typeid with the manager type rN _exposed__method_to_typeid_z%r is not a stringcsftd|jg|Ri|\}}||j||j|d}|j|j|jd}t|dd|jf|S)Nz)requesting creation of a shared %r objectmanagerrkrrrd) rrrrrrr-rHr.)r/rDrErZexpproxyrrr,rrrVs z"BaseManager.register..temp) __dict__rcopy AutoProxyrr&r#rrMr8setattr) rr,rTrrr create_methodkeyrrVrrrregisters&     zBaseManager.register)NNrNrgr)NNNNT)r8r:r;r<rr[rr0rrr classmethodrrrrrrr staticmethodrpropertyr-r rrrrrs6   +        rc@eZdZddZddZdS)ProcessLocalSetcCst|dddS)NcS|Sr)clearr'rrrsz*ProcessLocalSet.__init__..)rregister_after_forkr1rrrr0rzProcessLocalSet.__init__cCs t|dfSrg)rr1rrr __reduce__rzProcessLocalSet.__reduce__N)r8r:r;r0rrrrrr rc@seZdZdZiZeZ  dddZddZ d ifd d Z d d Z ddZ e ddZddZddZddZddZddZdS)rz. A base for proxies of shared objects NTFc Cstj!tj|jd}|durttf}|tj|j<Wdn1s'wY|d|_|d|_ ||_ |j j |_ ||_ ||_t|d|_||_|durYt||_n|j durd|j j|_ntj|_|rp|t|tjdS)Nrr)r_mutexrrr-rZForkAwareLocalr_tls_idset_tokenr._id_managerrrlr_owned_by_managerrrjrrzrk_increfr _after_fork) r/rrtrrkrrc manager_ownedZ tls_idsetrrrr0s.       zBaseProxy.__init__cCsdtdtj}tjdkr|dtj7}|j|jj |j d}t |dd|f||j _ dS)Nzmaking connection to managerZ MainThread|rr^)rrrrzr rqrrrr-rrHrr )r/r rrrr_connects   zBaseProxy._connectrc Csz|jj}Wnty tdtj||jj}Ynw| |j |||f| \}}|dkr7|S|dkrm|\}}|j j |jd} |jj|_| ||j|j |j|d} |j|j|jd}t|dd|jf| St||) zV Try to call a method of the referent and return a copy of the result z#thread %r does not own a connectionr>rrrNrd)rr rrrrqrr r"r?rr@rrr,rr-rrrrHr.rA) r/rCrDrErrFrGrrrrrrr _callmethod%s2       zBaseProxy._callmethodcC |dS)z9 Get a copy of the value of the referent rr$r1rrr _getvalueCs zBaseProxy._getvaluec Cs|jr td|jjdS|j|jj|jd}t|dd|j ftd|jj|j |j |j o5|j j }tj|tj|j|j||j|j |jfdd|_dS)Nz%owned_by_manager skipped INCREF of %rrrcz INCREF %r r)rrrrr.rr-rrHrraddrrrr_decrefrZ_close)r/rr5rrrrIs   zBaseProxy._increfc Cs||j|dus|jtjkrBztd|j||j|d}t|dd|jfWnt yA}z td|WYd}~n d}~wwtd|j|sbt |drdtdt j |j|`dSdSdS)Nz DECREF %rrrdz... decref failed %sz%DECREF %r -- manager already shutdownr z-thread %r has no more proxies so closing conn)discardr.rrrrrr-rHrrrqrr r r)rrkr5ZtlsZidsetrrrrrrr*]s$  zBaseProxy._decrefc CsJd|_z|WdSty$}ztd|WYd}~dSd}~ww)Nzincref failed: %s)rrrrr)r/rrrrrvszBaseProxy._after_forkcCsZi}tdur |j|d<t|ddr!|j|d<tt|j|j|ffStt||j|j|ffS)Nrk_isautoFr) r rrr RebuildProxyrrrrr/rErrrr~s    zBaseProxy.__reduce__cCrr)r')r/Zmemorrr __deepcopy__rzBaseProxy.__deepcopy__cCsdt|j|jjt|fS)Nz<%s object, typeid %r at %#x>)rr8rr,r.r1rrrr9szBaseProxy.__repr__cCs4z|dWStyt|dddYSw)zV Return representation of the referent (or a fall-back if that fails) r9Nr#z; '__str__()' failed>)r$rrr1rrrrRs   zBaseProxy.__str__NNNTF)r8r:r;r<rrZForkAwareThreadLockrr0r"r$r'rr r*rrr/r9rRrrrrrs$ )    rcCsttdd}|r*|j|jkr*td|d|d<|j|jvr*|j|j|j|j<| ddo8ttdd }|||fd|i|S) z5 Function used for unpickling proxy objects. r{Nz*Rebuild a proxy owned by manager, token=%rTr rcZ _inheritingF) rrrzr-rrr.rprnpop)rWrrtrErrcrrrr-s    r-cCsnt|}z|||fWStyYnwi}|D] }td||f|qt|tf|}||_||||f<|S)zB Return a proxy type whose methods are given by `exposed` zOdef %s(self, /, *args, **kwds): return self._callmethod(%r, args, kwds))rrexecrrr)r r_cacheZdicZmeth ProxyTyperrr MakeProxyTypes"  r5c Cst|d}|dur%||j|d}zt|dd|f}W|n|w|dur0|dur0|j}|dur9tj}td|j |} | ||||||d} d| _ | S)z* Return an auto-proxy for `token` rNrr_z AutoProxy[%s])rrkrcr T) rlr-rHrrrrzrkr5r,r,) rrtrrkrrcr rrr4rrrrrs   rc@r) NamespacecKs|j|dSr)rupdater.rrrr0r3zNamespace.__init__cCsZt|j}g}|D]\}}|ds|d||fq |d|jjd|fS)NrYz%s=%rz%s(%s)z, ) r&rr# startswithrUrr7r8r)r/r#rVr rrrrr9s  zNamespace.__repr__N)r8r:r;r0r9rrrrr6rr6c@s8eZdZd ddZddZddZdd ZeeeZd S) ValueTcC||_||_dSr) _typecode_value)r/rrlockrrrr0 zValue.__init__cCrrr<r1rrrrsz Value.getcCs ||_dSrr?r/rrrrr z Value.setcCsdt|j|j|jfS)Nz %s(%r, %r))rr8r;r<r1rrrr9szValue.__repr__NT) r8r:r;r0rrr9rrrrrrr9s  r9cCs t||Sr)r)rsequencer=rrrArrayrrDc@s8eZdZdZddZddZddZdd Zd d Zd S) IteratorProxy)__next__r?throwrcC|Srrr1rrr__iter__rzIteratorProxy.__iter__cG |d|S)NrFr&r/rDrrrrF rzIteratorProxy.__next__cGrJ)Nr?r&rKrrrr? rzIteratorProxy.sendcGrJ)NrGr&rKrrrrGrzIteratorProxy.throwcGrJ)Nrr&rKrrrrrzIteratorProxy.closeN) r8r:r;rrIrFr?rGrrrrrrEs rEc@s2eZdZdZd ddZddZdd Zd d ZdS) AcquirerProxy)acquirereleaseTNcCs"|dur|fn||f}|d|SNrMr&)r/ZblockingrrDrrrrMs zAcquirerProxy.acquirecCr%NrNr&r1rrrrNrAzAcquirerProxy.releasecCr%rOr&r1rrrrrAzAcquirerProxy.__enter__cCr%rPr&rrrrrrAzAcquirerProxy.__exit__)TN)r8r:r;rrMrNrrrrrrrLs   rLc@s6eZdZdZd ddZd ddZdd Zd d d ZdS)ConditionProxy)rMrNrnotify notify_allNcC|d|fSNrr&rrrrr#r*zConditionProxy.waitrcCrT)NrRr&)r/nrrrrR%r*zConditionProxy.notifycCr%)NrSr&r1rrrrS'rAzConditionProxy.notify_allcCsj|}|r|S|durt|}nd}d}|s3|dur)|t}|dkr) |S|||}|r|S)Nr)time monotonicr)r/Z predicaterrGZendtimeZwaittimerrrwait_for)s"  zConditionProxy.wait_forr)r)r8r:r;rrrRrSrYrrrrrQ!s   rQc@s2eZdZdZddZddZddZd d d ZdS) EventProxy)rrrrcCr%)Nrr&r1rrrr>rAzEventProxy.is_setcCr%Nrr&r1rrrr@rAzEventProxy.setcCr%)Nrr&r1rrrrBrAzEventProxy.clearNcCrTrUr&rrrrrDr*zEventProxy.waitr)r8r:r;rrrrrrrrrrZ<s rZc@sNeZdZdZdddZddZddZed d Zed d Z ed dZ dS) BarrierProxy)__getattribute__rabortresetNcCrTrUr&rrrrrJr*zBarrierProxy.waitcCr%)Nr^r&r1rrrr^LrAzBarrierProxy.abortcCr%)Nr_r&r1rrrr_NrAzBarrierProxy.resetcC |ddS)Nr])partiesr&r1rrrraP zBarrierProxy.partiescCr`)Nr]) n_waitingr&r1rrrrcSrbzBarrierProxy.n_waitingcCr`)Nr])brokenr&r1rrrrdVrbzBarrierProxy.brokenr) r8r:r;rrr^r_rrarcrdrrrrr\Hs   r\c@s(eZdZdZddZddZddZdS) NamespaceProxy)r] __setattr__ __delattr__cCs0|ddkr t||St|d}|d|fS)NrrYr$r])objectr]r/r  callmethodrrr __getattr__]    zNamespaceProxy.__getattr__cCs4|ddkr t|||St|d}|d||fS)NrrYr$rf)rhrfr])r/r rrjrrrrfbs  zNamespaceProxy.__setattr__cCs0|ddkr t||St|d}|d|fS)NrrYr$rg)rhrgr]rirrrrggrlzNamespaceProxy.__delattr__N)r8r:r;rrkrfrgrrrrre[s  rec@s4eZdZdZddZddZeeeZee j Z dS) ValueProxy)rrcCr%)Nrr&r1rrrrprAzValueProxy.getcCrTr[r&r@rrrrrr*zValueProxy.setN) r8r:r;rrrrrr types GenericAlias__class_getitem__rrrrrmns  rm BaseListProxy)__add__ __contains__ __delitem__ __getitem____len____mul__ __reversed____rmul__ __setitem__rUcountextendindexinsertr1removereverser__imul__c@r) ListProxycC|d|f|S)Nr|r&r@rrr__iadd__zListProxy.__iadd__cCr)Nrr&r@rrrrrzListProxy.__imul__N)r8r:r;rrrrrrrs r DictProxy)rsrtrurIrvrzrrrr#r$r1popitem setdefaultr7r%rIIterator ArrayProxy)rvrurz PoolProxy) Zapply apply_asyncrimapimap_unorderedrmap map_asyncstarmap starmap_asyncrZ AsyncResult)rrrrrc@r)rcCrHrrr1rrrrrzPoolProxy.__enter__cCrr)rrrrrrrzPoolProxy.__exit__N)r8r:r;rrrrrrrrc@seZdZdZdS)ra( 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)r8r:r;r<rrrrrsrQueueZ JoinableQueuerxrrRLock SemaphoreBoundedSemaphore ConditionBarrierPoolr&r)rr )r c@sLeZdZdZgfddZddZddZdd Zd d Zd d Z ddZ dS)_SharedMemoryTrackerz+Manages one or more shared memory segments.cCr:rZshared_memory_context_name segment_names)r/r rrrrr0r>z_SharedMemoryTracker.__init__cCs(td|dt|j|dS)z6Adds the supplied shared memory block name to tracker.zRegister segment  in pid N)rrrrrUr/ segment_namerrrregister_segmentsz%_SharedMemoryTracker.register_segmentcCsBtd|dt|j|t|}||dS)zCalls unlink() on the shared memory block with the supplied name and removes it from the list of blocks being tracked.zDestroy segment rN) rrrrrr SharedMemoryrunlink)r/rZsegmentrrrdestroy_segments    z$_SharedMemoryTracker.destroy_segmentcCs"|jddD]}||qdS)zs              P  w 4            %-