o w[e@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//usr/lib/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-backlog0Nr)rLbytesrNrOrregistryrAuthenticationStringauthkeylistener_clientlistenerr- id_to_objid_to_refcountid_to_local_proxy_obj threadingLockmutex)r/rjr-rl 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)rrEvent 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)NTrxrD)rnacceptOSErrorrrr}handle_requestrr)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 deliver_challengerlanswer_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)rrrrcurrent_threadr r@r?rorzrKeyErrorrqAttributeErrorrrrgetr]rr-rfallback_mappingEOFErrorrrrr)r/rr@r?rorCr(ridentrDrEexposed gettypeidkefunctionresrrr,ridentrexposedtoken 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 rgz %s: refcount=%s %srNK ) rtr&rpr$sortrUrMrojoin)r/rBrGr$rrrrr`Qs $zServer.debug_infocCs t|jS)z* Number of shared objects )lenrprrrrraas 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_excrzset)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)rtrjrrQrZrLdictrNrOrr&r.rrrrorprctuple) 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)rror.)r/rBrrrrr_szServer.get_methodscCs"|t_|d||dS)z= Spawn a new thread to serve this connection rN)rrrr 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)rtrprrqrorr)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)rprqrrrtAssertionErrorrOro)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)pickle 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)rr{rl_addressrk_authkeyr_staterr _serializerrm _Listener_Clientr_ctx)r/r-rlructxrrrr0s   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 rlNrb) rmrrrrHrrrr)r/rvrwrrrrconnects 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)duplexr:css|]}t|VqdSrr)rirrr 0sz$BaseManager.start..-rrD exitpriority)!rrrrrr rrOrTrNr PiperProcessr _run_serverrrrr_processr _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) clsrjr-rlrurrrserverrrrrBs  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_typeexc_valexc_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)rrrrHrrrhasattrr rrrr_address_to_localr)rr-rlr5rrrrrrs2          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 objectmanagerrlrrrd) rrrrrrr-rHr.)r/rDrErexpproxyrrr,rrrVs z"BaseManager.register..temp) __dict__rcopy AutoProxyrr&r#rrMr8setattr) rr,rTrrr create_methodkeyrrVrrrregisters&     zBaseManager.register)NNrNrhr)NNNNT)r8r:r;r<rr[rr0rrr classmethodrrrrrrr  staticmethodrpropertyr-rrrrrrs6   +        rc@eZdZddZddZdS)ProcessLocalSetcCst|dddS)NcS|Sr)clearr'rrrsz*ProcessLocalSet.__init__..)rregister_after_forkr1rrrr0rzProcessLocalSet.__init__cCs t|dfSrh)rr1rrr __reduce__r zProcessLocalSet.__reduce__N)r8r:r;r0r'rrrrr" r"c@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-rForkAwareLocalr"_tls_idset_tokenr._id_managerrrmr_owned_by_managerrrkrr{rl_increfr& _after_fork) r/rrurrlrrc manager_owned tls_idsetrrrr0s.       zBaseProxy.__init__cCsdtdtj}tjdkr|dtj7}|j|jj |j d}t |dd|f||j _ dS)Nzmaking connection to manager MainThread|rr^)rrrr{r rrrrr-r-rrHr+r )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)r+r rrrrrrr r7r?r.r@r/rr,r-r-rrrrHr.rA) r/rCrDrErrFrGrrrrrrr _callmethod%s2       zBaseProxy._callmethodcC |dS)z9 Get a copy of the value of the referent rr9r1rrr _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)r0rrr-r.rr-rrHr.r,addr/rrr_decrefr+_close)r/rr5rrrr1Is   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-rHrr rrrr r r)rrlr5tlsidsetrrrrrrr?]s$  zBaseProxy._decrefc CsJd|_z|WdSty$}ztd|WYd}~dSd}~ww)Nzincref failed: %s)r/r1rrr)r/rrrrr2vszBaseProxy._after_forkcCsZi}tdur |j|d<t|ddr!|j|d<tt|j|j|ffStt||j|j|ffS)Nrl_isautoFr) r rrr RebuildProxyrr-rrr/rErrrr'~s    zBaseProxy.__reduce__cCr#r)r<)r/memorrr __deepcopy__rzBaseProxy.__deepcopy__cCsdt|j|jjt|fS)Nz<%s object, typeid %r at %#x>)rr8r-r,r.r1rrrr9szBaseProxy.__repr__cCs4z|dWStyt|dddYSw)zV Return representation of the referent (or a fall-back if that fails) r9Nr8z; '__str__()' failed>)r9rrr1rrrrRs   zBaseProxy.__str__NNNTF)r8r:r;r<rrForkAwareThreadLockr)r0r7r9r<r1rr?r2r'rHr9rRrrrrrs$ )    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=%rTr3rc _inheritingF) rrr{r-rrr.rqropop)rWrrurErrcrrrrEs    rEcCsnt|}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_cachedicmeth ProxyTyperrr MakeProxyTypes"  rRc 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])rrlrcr3T) rmr-rHrrrr{rlrRr,rD) rrurrlrrcr3rrrQrrrrrs   rc@r!) NamespacecKs|j|dSr)rupdaterFrrrr0r3zNamespace.__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;r0r9rrrrrSr(rSc@s8eZdZd ddZddZddZdd ZeeeZd S) ValueTcC||_||_dSr) _typecode_value)r/rrlockrrrr0 zValue.__init__cCrrrYr1rrrrsz Value.getcCs ||_dSrr\r/rrrrr z Value.setcCsdt|j|j|jfS)Nz %s(%r, %r))rr8rXrYr1rrrr9szValue.__repr__NT) r8r:r;r0rrr9r rrrrrrVs  rVcCs t||Sr)r)rsequencerZrrrArrayr rac@s8eZdZdZddZddZddZdd Zd d Zd S) IteratorProxy)__next__r?throwrcC|Srrr1rrr__iter__rzIteratorProxy.__iter__cG |d|S)Nrcr;r/rDrrrrc r zIteratorProxy.__next__cGrg)Nr?r;rhrrrr? r zIteratorProxy.sendcGrg)Nrdr;rhrrrrdr zIteratorProxy.throwcGrg)Nrr;rhrrrrr zIteratorProxy.closeN) r8r:r;rrfrcr?rdrrrrrrbs rbc@s2eZdZdZd ddZddZdd Zd d ZdS) AcquirerProxy)acquirereleaseTNcCs"|dur|fn||f}|d|SNrjr;)r/blockingrrDrrrrjs zAcquirerProxy.acquirecCr:Nrkr;r1rrrrkr^zAcquirerProxy.releasecCr:rlr;r1rrrrr^zAcquirerProxy.__enter__cCr:rnr;rrrrr r^zAcquirerProxy.__exit__)TN)r8r:r;rrjrkrr rrrrris   ric@s6eZdZdZd ddZd ddZdd Zd d d ZdS)ConditionProxy)rjrkrnotify notify_allNcC|d|fSNrr;rrrrr#r*zConditionProxy.waitrcCrr)Nrpr;)r/nrrrrp%r*zConditionProxy.notifycCr:)Nrqr;r1rrrrq'r^zConditionProxy.notify_allcCsj|}|r|S|durt|}nd}d}|s3|dur)|t}|dkr) |S|||}|r|S)Nr)time monotonicr)r/ predicaterrGendtimewaittimerrrwait_for)s"  zConditionProxy.wait_forr)r)r8r:r;rrrprqrzrrrrro!s   roc@s2eZdZdZddZddZddZd d d ZdS) EventProxy)rrr$rcCr:)Nrr;r1rrrr>r^zEventProxy.is_setcCr:Nrr;r1rrrr@r^zEventProxy.setcCr:)Nr$r;r1rrrr$Br^zEventProxy.clearNcCrrrsr;rrrrrDr*zEventProxy.waitr)r8r:r;rrrr$rrrrrr{<s r{c@sNeZdZdZdddZddZddZed d Zed d Z ed dZ dS) BarrierProxy)__getattribute__rabortresetNcCrrrsr;rrrrrJr*zBarrierProxy.waitcCr:)Nrr;r1rrrrLr^zBarrierProxy.abortcCr:)Nrr;r1rrrrNr^zBarrierProxy.resetcC |ddS)Nr~)partiesr;r1rrrrP zBarrierProxy.partiescCr)Nr~) n_waitingr;r1rrrrSrzBarrierProxy.n_waitingcCr)Nr~)brokenr;r1rrrrVrzBarrierProxy.brokenr) r8r:r;rrrrr rrrrrrrr}Hs   r}c@s(eZdZdZddZddZddZdS) NamespaceProxy)r~ __setattr__ __delattr__cCs0|ddkr t||St|d}|d|fS)NrrYr9r~)objectr~r/r callmethodrrr __getattr__]    zNamespaceProxy.__getattr__cCs4|ddkr t|||St|d}|d||fS)NrrYr9r)rrr~)r/rrrrrrrbs  zNamespaceProxy.__setattr__cCs0|ddkr t||St|d}|d|fS)NrrYr9r)rrr~rrrrrgrzNamespaceProxy.__delattr__N)r8r:r;rrrrrrrrr[s  rc@s4eZdZdZddZddZeeeZee j Z dS) ValueProxy)rrcCr:)Nrr;r1rrrrpr^zValueProxy.getcCrrr|r;r]rrrrrr*zValueProxy.setN) r8r:r;rrrr rrtypes GenericAlias__class_getitem__rrrrrns  r BaseListProxy)__add__ __contains__ __delitem__ __getitem____len____mul__ __reversed____rmul__ __setitem__rUcountextendindexinsertrLremovereverser__imul__c@r!) ListProxycC|d|f|S)Nrr;r]rrr__iadd__zListProxy.__iadd__cCr)Nrr;r]rrrrrzListProxy.__imul__N)r8r:r;rrrrrrrs r DictProxy)rrrrfrrr$rrr#r$rLpopitem setdefaultrTr%rfIterator ArrayProxy)rrr PoolProxy) apply apply_asyncrimapimap_unorderedrmap map_asyncstarmap starmap_asyncr  AsyncResult)rrrrrc@r!)rcCrerrr1rrrrrzPoolProxy.__enter__cCrr)r rrrrr r zPoolProxy.__exit__N)r8r:r;rr rrrrrr(c@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<rrrrrsrQueue JoinableQueueryrsRLock SemaphoreBoundedSemaphore ConditionBarrierPoolr&r)rr)rc@sLeZdZdZgfddZddZddZdd Zd d Zd d Z ddZ dS)_SharedMemoryTrackerz+Manages one or more shared memory segments.cCrWrshared_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/rsegmentrrrdestroy_segments    z$_SharedMemoryTracker.destroy_segmentcCs"|jddD]}||qdS)zs              P  w 4            %-