a DOgǸ@sLgdZddlZddlZddlZddlZddlZddlZddlZddlZddlm Z ddl m Z ddl m Z ddlmZmZmZddl mZdd l mZdd l mZdd l mZzdd l mZWneyd ZYn0dZedddZeejedddDZedeur8ddZeD]Zeeeq$Gddde 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/d0Z3ifd1d2Z4dmd3d4Z5Gd5d6d6e 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 dgerHGdhdidiZRGdjdkdke(ZSGdldde/ZTdS)o) BaseManager SyncManager BaseProxyTokenN)getpid) format_exc) connection) reductionget_spawning_popen ProcessError)pool)process)util) get_context) shared_memoryFTSharedMemoryManagercCstj|j|ffSN)arraytypecodetobytes)ar0/usr/lib64/python3.9/multiprocessing/managers.py reduce_array/srcCsg|]}tti|qSr)typegetattr.0namerrr 3r )itemskeysvaluescCstt|ffSr)listobjrrrrebuild_as_list5sr(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__GszToken.__getstate__cCs|\|_|_|_dSrr)r-staterrr __setstate__JszToken.__setstate__cCsd|jj|j|j|jfS)Nz %s(typeid=%r, address=%r, id=%r)) __class____name__r*r+r,r/rrr__repr__MszToken.__repr__N) r5 __module__ __qualname____doc__ __slots__r.r0r3r6rrrrr>s rrcCs8|||||f|\}}|dkr*|St||dS)zL Send a message to manager using connection `c` and return response #RETURNN)sendrecvconvert_to_error)cr, methodnameargskwdskindresultrrrdispatchUs  rEcCsd|dkr |S|dvrRt|ts4td||t||dkrHtd|St|Sntd|SdS)N#ERROR) #TRACEBACK#UNSERIALIZABLEz.Result {0!r} (kind '{1}') type is {2}, not strrHzUnserializable message: %s zUnrecognized message type {!r}) isinstancestr TypeErrorformatr RemoteError ValueError)rCrDrrrr>_s    r>c@seZdZddZdS)rMcCsdt|jddS)NzM --------------------------------------------------------------------------- rzK---------------------------------------------------------------------------)rJrAr/rrr__str__oszRemoteError.__str__N)r5r7r8rOrrrrrMnsrMcCs2g}t|D] }t||}t|r ||q |S)z4 Return a list of names of methods of `obj` )dirrcallableappend)r'temprfuncrrr all_methodsvs    rUcCsddt|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..)rUr&rrrpublic_methodssrWc@seZdZdZgdZddZddZddZd d Zd d Z d dZ ddZ ddZ e e e dZ ddZddZddZddZddZddZd 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)rIbytesrKrLrregistryrAuthenticationStringauthkeylistener_clientlistenerr+ id_to_objid_to_refcountid_to_local_proxy_obj threadingLockmutex)r-rgr+ri serializerListenerClientrrrr.s     zServer.__init__c Cst|_|t_ztj|jd}d|_| z|j sL|j dq4Wnt t fydYn0Wtjtjkrtdtjt_tjt_tdn2tjtjkrtdtjt_tjt_td0dS)z( Run the server forever )targetTrzresetting stdout, stderrrN)roEvent stop_eventrcurrent_process_manager_serverThreadaccepterdaemonstartis_setwaitKeyboardInterrupt SystemExitsysstdout __stdout__rdebug __stderr__stderrexit)r-r{rrr serve_forevers*       zServer.serve_forevercCsLz|j}Wnty$YqYn0tj|j|fd}d|_|qdS)NrurAT)rkacceptOSErrorrorzhandle_requestr|r})r-r?trrrr{s  zServer.accepterc CsNd}}}zTt||jt||j|}|\}}}}||jvsTJd|t||}Wnty|dtf} YnB0z||g|Ri|}Wntydtf} Yn 0d|f} z| | Wntty@} zZz| dtfWntyYn0t d| t d|t d| WYd} ~ n d} ~ 00| dS)z) Handle a new connection Nz%r unrecognizedrGr;zFailure to send message: %rz ... request was %r ... exception was %r) r deliver_challengerianswer_challenger=publicr Exceptionrr<rinfoclose) r-r?funcnamerDrequestignorerArBrTmsgerrrrs4      "zServer.handle_requestc Cstdtj|j}|j}|j}|j sΐz:d}}|}|\}}} } z||\}} } WnPt y} z8z|j |\}} } Wnt y| Yn0WYd} ~ n d} ~ 00|| vrt d|t || ft||}z|| i| }Wn.ty}zd|f}WYd}~nXd}~00| o,| |d}|rb||||\}}t||j|}d||ff}nd|f}Wnt y|durdtf}nRz2|j|}|||||g| Ri| }d|f}Wntydtf}Yn0YnLtytdtjtd Ynty2dtf}Yn0z4z ||Wn"tyd|d tfYn0Wq$ty}zHtd tjtd |td ||tdWYd}~q$d}~00q$dS)zQ Handle requests from the proxies in a particular process/thread z$starting server thread to service %rNz+method %r of %r object is not in exposed=%rrF#PROXYr;rGz$got EOF -- exiting thread serving %rrrHzexception in thread serving %rz ... message was %rrr)rrrocurrent_threadrr=r<rlrwr~KeyErrorrnAttributeErrorrrrgetrZrr+rfallback_mappingEOFErrorrrrr)r-connr=r<rlr@r'ridentrArBexposed gettypeidkefunctionresrrr*ZridentZrexposedtokenZ fallback_funcrDrrr serve_clients               zServer.serve_clientcCs|Srrr-rrr'rrrfallback_getvalue7szServer.fallback_getvaluecCst|SrrJrrrr fallback_str:szServer.fallback_strcCst|Sr)reprrrrr fallback_repr=szServer.fallback_repr)rOr6 #GETVALUEcCsdSrrr-r?rrrr_Fsz Server.dummyc Cs|jvg}t|j}||D]<}|dkr&|d||j|t|j|dddfq&d|WdS1s0YdS)zO Return some info --- useful to spot problems with refcounting rdz %s: refcount=%s %srNK ) rqr%rmr#sortrRrJrljoin)r-r?rDr#rrrrr]Is zServer.debug_infocCs t|jS)z* Number of shared objects )lenrmrrrrr^YszServer.number_of_objectscCsVzDztd|dWnddl}|Yn0W|jn |j0dS)z' Shutdown this process z!manager received shutdown messager;NrN)rrr< traceback print_excrwset)r-r?rrrrrY`s zServer.shutdownc Os|j|j|\}}}}|durD|s2t|dkr:td|d} n||i|} |durbt| }|durt|tstd|t |t |t |}dt | } t d|| | t||f|j| <| |jvrd|j| <Wdn1s0Y||| | 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)rqrgrrNrWrIdictrKrLrr%r,rrrrlrmr`tuple) r-r?r*rArBrQrmethod_to_typeid proxytyper'rrrrrZms6     ( z Server.createcCst|j|jdS)zL Return the methods of the shared object indicated by token r)rrlr,)r-r?rrrrr\szServer.get_methodscCs"|t_|d||dS)z= Spawn a new thread to serve this connection rN)rorrr<r)r-r?rrrrr[s  zServer.accept_connectionc Cs|jz|j|d7<Wnjty}zR||jvrpd|j|<|j||j|<|j|\}}}td|n|WYd}~n d}~00Wdn1s0YdS)Nrz&Server re-enabled tracking & INCREF %r)rqrmrrnrlrr)r-r?rrr'rrrrrr`s  z Server.increfcCs||jvr$||jvr$td|dS|jd|j|dkrXtd||j||j||j|d8<|j|dkr|j|=Wdn1s0Y||jvrd|j|<td||j|j|=Wdn1s0YdS)NzServer DECREF skipping %rrz+Id {0!s} ({1!r}) has refcount {2:n}, not 1+r)NrNzdisposing of obj with id %r)rmrnrrrqAssertionErrorrLrl)r-r?rrrrras*   &   z Server.decrefN)r5r7r8r9rr.rr{rrrrrrr_r]r^rYrZr\r[r`rarrrrrXs. "Q $rXc@seZdZdgZdZdZdZdS)StatevaluerrN)r5r7r8r:INITIALSTARTEDSHUTDOWNrrrrrsr)pickle xmlrpclibc@seZdZdZiZeZd"ddZddZdd Z d#d d Z e d$d dZ ddZ d%ddZddZddZddZddZeddZeddZe d&d d!ZdS)'rz! Base class for managers NrcCs\|durtj}||_t||_t|_tj|j_ ||_ t |\|_ |_ |pTt|_dSr)rrxri_addressrh_authkeyr_staterr _serializerrjZ _Listener_Clientr_ctx)r-r+rirrctxrrrr.s   zBaseManager.__init__cCsf|jjtjkrP|jjtjkr&tdn*|jjtjkr>tdntd|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 rrLrX _registryrrrr/rrr get_servers    zBaseManager.get_servercCs8t|j\}}||j|jd}t|ddtj|j_dS)z> Connect manager object to the server process riNr_) rjrrrrErrrr)r-rsrtrrrrconnects zBaseManager.connectrc Cs4|jjtjkrP|jjtjkr&tdn*|jjtjkr>tdntd|jj|durht|sht 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 (r!z$BaseManager.start..-rrA exitpriority)!rrrrrr rrLrQrKr PiperProcessr _run_serverrrrr_processr _identityr5rr}rr=rFinalize_finalize_managerrrY)r- initializerinitargsreaderwriterrrrrr}s>          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) clsrgr+rirrrrrserverrrrr:s zBaseManager._run_servercOsl|jjtjksJd|j|j|jd}z&t|dd|f||\}}W|n |0t ||j||fS)zP Create a new shared object; return the token and exposed tuple zserver not yet startedrNrZ) rrrrrrrrErr)r-r*rArBrr,rrrr_createQs zBaseManager._createcCs*|jdur&|j||js&d|_dS)zC Join the manager process (if it has been spawned) N)rris_aliver-timeoutrrrr]s   zBaseManager.joincCs8|j|j|jd}zt|ddW|S|0dS)zS Return some info about the servers shared objects and connections rNr]rrrrErr-rrrr _debug_infofs  zBaseManager._debug_infocCs8|j|j|jd}zt|ddW|S|0dS)z5 Return the number of shared objects rNr^rrrrr_number_of_objectsps  zBaseManager._number_of_objectscCsj|jjtjkr||jjtjkrf|jjtjkr.temp) __dict__rcopy AutoProxyrr%r"rrJr5setattr) rr*rQrrr create_methodkeyrrSrrrregisters$     zBaseManager.register)NNrN)Nr)Nr)N)NNNNT)r5r7r8r9rrXrr.rrr} classmethodrrrrrrr staticmethodrpropertyr+r rrrrrs4  +       rc@seZdZddZddZdS)ProcessLocalSetcCst|dddS)NcSs|Sr)clearr&rrrr!z*ProcessLocalSet.__init__..)rregister_after_forkr/rrrr.szProcessLocalSet.__init__cCs t|dfSre)rr/rrr __reduce__szProcessLocalSet.__reduce__N)r5r7r8r.rrrrrrsrc@seZdZdZiZeZdddZddZ d ifd d Z d d Z ddZ e ddZddZddZddZddZddZdS)rz. A base for proxies of shared objects NTFc CstjBtj|jd}|dur:ttf}|tj|j<Wdn1sN0Y|d|_|d|_ ||_ |j j |_ ||_ ||_t|d|_||_|durt||_n"|j dur|j j|_n tj|_|r|t|tjdS)Nrr)r_mutexrrr+rForkAwareLocalr_tls_idset_tokenr,_id_managerrrjr_owned_by_managerrrhrrxri_increfr _after_fork) r-rrrrrirr` manager_ownedZ tls_idsetrrrr.s**      zBaseProxy.__init__cCsdtdtj}tjdkr4|dtj7}|j|jj |j d}t |dd|f||j _ dS)Nzmaking connection to manager MainThread|rr[)rrrrxrrorrrr+rrErr )r-rrrrr_connects  zBaseProxy._connectrc Csz |jj}Wn4ty@tdtj||jj}Yn0| |j |||f| \}}|dkrn|S|dkr|\}}|j j |jd} |jj|_| ||j|j |j|d} |j|j|jd}t|dd|jf| St||dS) zV Try to call a method of the referent and return a copy of the result z#thread %r does not own a connectionr;rrrNra)rr rrrrorrr#r<rr=rrr*rr+rrrrEr,r>) r-r@rArBrrCrDrrrrrrr _callmethods0     zBaseProxy._callmethodcCs |dS)z9 Get a copy of the value of the referent rr%r/rrr _getvalue;szBaseProxy._getvaluec Cs|jrtd|jjdS|j|jj|jd}t|dd|j ftd|jj|j |j |j oj|j j }tj|tj|j|j||j|j |jfdd|_dS)Nz%owned_by_manager skipped INCREF of %rrr`z INCREF %r r)rrrrr,rr+rrErraddrrrr_decrefr_close)r-rr2rrrrAs  zBaseProxy._increfc Cs||j|dus |jtjkrz2td|j||j|d}t|dd|jfWqt y}ztd|WYd}~qd}~00ntd|j|st |drtdt j |j|`dS)Nz DECREF %rrraz... decref failed %sz%DECREF %r -- manager already shutdownr z-thread %r has no more proxies so closing conn)discardr,rrrrrr+rErrrorrr r)rrir2ZtlsZidsetrrrrrrr*Us $ zBaseProxy._decrefc CsJd|_z |Wn2tyD}ztd|WYd}~n d}~00dS)Nzincref failed: %s)rrrrr)r-rrrrrns  zBaseProxy._after_forkcCs^i}tdur|j|d<t|ddrB|j|d<tt|j|j|ffStt||j|j|ffSdS)Nri_isautoFr) r rrr RebuildProxyr rrrr-rBrrrrvs    zBaseProxy.__reduce__cCs|Sr)r')r-memorrr __deepcopy__szBaseProxy.__deepcopy__cCsdt|j|jjt|fS)Nz<%s object, typeid %r at %#x>)rr5rr*r,r/rrrr6szBaseProxy.__repr__cCs8z |dWSty2t|dddYS0dS)zV Return representation of the referent (or a fall-back if that fails) r6Nr$z; '__str__()' failed>)r%rrr/rrrrOs  zBaseProxy.__str__)NNNTF)r5r7r8r9rrForkAwareThreadLockrr.r#r%r'rrr*rrr1r6rOrrrrrs" )   rcCsttdd}|rT|j|jkrTtd|d|d<|j|jvrT|j|j|j|j<| ddopttdd }|||fd|i|S) z5 Function used for unpickling proxy objects. ryNz*Rebuild a proxy owned by manager, token=%rTr r`Z _inheritingF) rrrxr+rrr,rnrlpop)rTrrrrBrr`rrrr.s    r.cCsnt|}z|||fWSty(Yn0i}|D]}td||f|q2t|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)rr_cacheZdicmeth ProxyTyperrr MakeProxyTypes   r8c Cst|d}|durJ||j|d}zt|dd|f}W|n |0|dur`|dur`|j}|durrtj}td|j |} | ||||||d} d| _ | S)z* Return an auto-proxy for `token` rNrr\z AutoProxy[%s])rrir`r T) rjr+rErrrrxrir8r*r-) rrrrrirr`r rrr7rrrrr s    r c@seZdZddZddZdS) NamespacecKs|j|dSr)rupdater/rrrr.szNamespace.__init__cCsZt|j}g}|D]$\}}|ds|d||fq|d|jjd|fS)NrVz%s=%rz%s(%s)z, ) r%rr" startswithrRrr4r5r)r-r"rSrrrrrr6s  zNamespace.__repr__N)r5r7r8r.r6rrrrr9sr9c@s8eZdZd ddZddZddZdd ZeeeZd S) ValueTcCs||_||_dSr) _typecode_value)r-rrlockrrrr.szValue.__init__cCs|jSrr>r/rrrrsz Value.getcCs ||_dSrr@r-rrrrrsz Value.setcCsdt|j|j|jfS)Nz %s(%r, %r))rr5r=r>r/rrrr6szValue.__repr__N)T) r5r7r8r.rrr6rrrrrrr<s  r<cCs t||Sr)r)rsequencer?rrrArraysrCc@s8eZdZdZddZddZddZdd Zd d Zd S) IteratorProxy)__next__r<throwrcCs|Srrr/rrr__iter__szIteratorProxy.__iter__cGs |d|S)NrEr&r-rArrrrEszIteratorProxy.__next__cGs |d|S)Nr<r&rHrrrr<szIteratorProxy.sendcGs |d|S)NrFr&rHrrrrFszIteratorProxy.throwcGs |d|S)Nrr&rHrrrrszIteratorProxy.closeN) r5r7r8rrGrEr<rFrrrrrrDs rDc@s2eZdZdZd ddZddZdd Zd d ZdS) AcquirerProxy)acquirereleaseTNcCs"|dur|fn||f}|d|SNrJr&)r-blockingrrArrrrJszAcquirerProxy.acquirecCs |dSNrKr&r/rrrrKszAcquirerProxy.releasecCs |dSrLr&r/rrrrszAcquirerProxy.__enter__cCs |dSrNr&rrrrrszAcquirerProxy.__exit__)TN)r5r7r8rrJrKrrrrrrrI s  rIc@s6eZdZdZd ddZd ddZdd Zdd d ZdS)ConditionProxy)rJrKrnotify notify_allNcCs|d|fSNrr&rrrrrszConditionProxy.waitrcCs|d|fS)NrPr&)r-nrrrrPszConditionProxy.notifycCs |dS)NrQr&r/rrrrQszConditionProxy.notify_allcCsd|}|r|S|dur$t|}nd}d}|s`|durN|t}|dkrNq`|||}q,|S)Nr)time monotonicr)r- predicaterrDendtimewaittimerrrwait_for!s  zConditionProxy.wait_for)N)r)N)r5r7r8rrrPrQrYrrrrrOs   rOc@s2eZdZdZddZddZddZd d d ZdS) EventProxy)r~rrrcCs |dS)Nr~r&r/rrrr~6szEventProxy.is_setcCs |dSNrr&r/rrrr8szEventProxy.setcCs |dS)Nrr&r/rrrr:szEventProxy.clearNcCs|d|fSrRr&rrrrr<szEventProxy.wait)N)r5r7r8rr~rrrrrrrrZ4s rZc@sNeZdZdZdddZddZddZed d Zed d Z ed dZ dS) BarrierProxy)__getattribute__rabortresetNcCs|d|fSrRr&rrrrrBszBarrierProxy.waitcCs |dS)Nr^r&r/rrrr^DszBarrierProxy.abortcCs |dS)Nr_r&r/rrrr_FszBarrierProxy.resetcCs |ddS)Nr])partiesr&r/rrrr`HszBarrierProxy.partiescCs |ddS)Nr]) n_waitingr&r/rrrraKszBarrierProxy.n_waitingcCs |ddS)Nr])brokenr&r/rrrrbNszBarrierProxy.broken)N) r5r7r8rrr^r_rr`rarbrrrrr\@s   r\c@s(eZdZdZddZddZddZdS) NamespaceProxy)r] __setattr__ __delattr__cCs0|ddkrt||St|d}|d|fS)NrrVr%r])objectr]r-r  callmethodrrr __getattr__Us   zNamespaceProxy.__getattr__cCs4|ddkrt|||St|d}|d||fS)NrrVr%rd)rfrdr])r-r rrhrrrrdZs  zNamespaceProxy.__setattr__cCs0|ddkrt||St|d}|d|fS)NrrVr%re)rfrer]rgrrrre_s   zNamespaceProxy.__delattr__N)r5r7r8rrirdrerrrrrcSsrcc@s4eZdZdZddZddZeeeZee j Z dS) ValueProxy)rrcCs |dS)Nrr&r/rrrrhszValueProxy.getcCs|d|fSr[r&rArrrrjszValueProxy.setN) r5r7r8rrrrrrtypes GenericAlias__class_getitem__rrrrrjfs  rj BaseListProxy)__add__ __contains__ __delitem__ __getitem____len____mul__ __reversed____rmul__ __setitem__rRcountextendindexinsertr3removereverser__imul__c@seZdZddZddZdS) ListProxycCs|d|f|S)Nryr&rArrr__iadd__xszListProxy.__iadd__cCs|d|f|S)Nr~r&rArrrr~{szListProxy.__imul__N)r5r7r8rr~rrrrrwsr DictProxy)rprqrrrGrsrwrrrr"r#r3popitem setdefaultr:r$rGIterator ArrayProxy)rsrrrw PoolProxy) Zapply apply_asyncrimapimap_unorderedrmap map_asyncstarmap starmap_asyncrZ AsyncResult)rrrrrc@seZdZddZddZdS)rcCs|Srrr/rrrrszPoolProxy.__enter__cCs |dSr)rrrrrrszPoolProxy.__exit__N)r5r7r8rrrrrrrsc@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)r5r7r8r9rrrrrsrQueue JoinableQueuervrpRLock SemaphoreBoundedSemaphore ConditionBarrierPoolr%r)rr )r c@sLeZdZdZgfddZddZddZdd Zd d Zd d Z ddZ dS)_SharedMemoryTrackerz+Manages one or more shared memory segments.cCs||_||_dSrZshared_memory_context_name segment_names)r-rrrrrr.sz_SharedMemoryTracker.__init__cCs(td|dt|j|dS)z6Adds the supplied shared memory block name to tracker.zRegister segment  in pid N)rrrrrRr- 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) rrrrr|r SharedMemoryrunlink)r-rZsegmentrrrdestroy_segments   z$_SharedMemoryTracker.destroy_segmentcCs"|jddD]}||qdS)ztdntd|jj||j |j |j |j S)z@Better than monkeypatching for now; merge into Server ultimatelyz"Already started SharedMemoryServerz!SharedMemoryManager has shut downr) rrrrrr rrLrrrrrr/rrrr7s    zSharedMemoryManager.get_serverc Cs|j|j|jdh}tjdd|d}zt|dd|jfWn0tyj}z||WYd}~n d}~00Wdn1s0Y|S)zoReturns a new SharedMemory instance with the specified size in bytes, to be tracked by the manager.rNT)rZsizer) rrrrrrEr BaseExceptionr)r-rrZsmsrrrrrDs8z SharedMemoryManager.SharedMemoryc Cs|j|j|jdf}t|}zt|dd|jjfWn2tyh}z|j |WYd}~n d}~00Wdn1s~0Y|S)zReturns a new ShareableList instance populated with the values from the input sequence, to be tracked by the manager.rNr) rrrr ShareableListrEZshmrrr)r-rBrslrrrrrPs  8z!SharedMemoryManager.ShareableListN) r5r7r8r9rrr.rrrrrrrrrs    )NNNTF)T)U__all__rrorrqueuerTrkrrrrrr contextr r r r rrrr ImportErrorZ HAS_SHMEMrRrr Z view_typesr%r(Z view_typerfrrEr>rrMrUrWrXrrsrt XmlListener XmlClientrjrrrrr.r8r r9r<rCrDrIrOrZr\rcrjrnrrrrZ BasePoolProxyrrrrvrprrrrrrrrrrrrrr s             H   w 4             %-