U e5dj-ã@sÒddlZddlmZddlZddlZddlZddlZddlZddlm Z m Z ddl m Z dgZ ejdkr‚ddlZGdd „d eƒZn,Gd d „d eƒZd d „Zd d„Ze  ee¡Gdd„deƒZGdd„deƒZdS)éN)Ú defaultdicté)Ú reductionÚassert_spawning)ÚutilÚ BufferWrapperZwin32c@s0eZdZdZe ¡Zdd„Zdd„Zdd„Z dS) ÚArenazL A shared memory area backed by anonymous memory (Windows). cCsx||_tdƒD]B}dt ¡t|jƒf}tjd||d�}t ¡dkrHqZ|  ¡qt dƒ‚||_ ||_ |j|j f|_ dS)Nédz pym-%d-%séÿÿÿÿ©ZtagnamerzCannot find name for new mmap)ÚsizeÚrangeÚosÚgetpidÚnextÚ_randÚmmapÚ_winapiZ GetLastErrorÚcloseÚFileExistsErrorÚnameÚbufferÚ_state)Úselfr ÚirZbuf©rú,/usr/lib64/python3.8/multiprocessing/heap.pyÚ__init__&s   úArena.__init__cCst|ƒ|jS©N)rr)rrrrÚ __getstate__5szArena.__getstate__cCs,|\|_|_|_tjd|j|jd�|_dS)Nr r )r rrrr)rÚstaterrrÚ __setstate__9szArena.__setstate__N) Ú__name__Ú __module__Ú __qualname__Ú__doc__ÚtempfileZ_RandomNameSequencerrr r"rrrrrs rc@s8eZdZdZejdkrdgZngZd dd„Zdd„Zd S) rzJ A shared memory area backed by a temporary file (POSIX). Zlinuxz/dev/shmr cCsx||_||_|dkrbtjdt ¡| |¡d�\|_}t |¡t  |tj |jf¡t  |j|¡t   |j|j¡|_ dS)Nr zpym-%d-)ÚprefixÚdir)r Úfdr'ZmkstemprrÚ _choose_dirÚunlinkrÚFinalizerÚ ftruncaterr)rr r*rrrrrMs þ  rcCs6|jD]&}t |¡}|j|j|kr|Sqt ¡Sr)Ú_dir_candidatesrÚstatvfsÚf_bavailÚf_frsizerZ get_temp_dir)rr ÚdÚstrrrr+[s    zArena._choose_dirN)r ) r#r$r%r&ÚsysÚplatformr/rr+rrrrrCs   cCs(|jdkrtdƒ‚t|jt |j¡ffS)Nr zDArena is unpicklable because forking was enabled when it was created)r*Ú ValueErrorÚ rebuild_arenar rZDupFd)ÚarrrÚ reduce_arenads r:cCst|| ¡ƒSr)rÚdetach)r Zdupfdrrrr8jsr8c@szeZdZdZdZdZejfdd„Ze dd„ƒZ dd„Z d d „Z d d „Z d d„Zdd„Zdd„Zdd„Zdd„Zdd„ZdS)ÚHeapéi@cCsXt ¡|_t ¡|_||_g|_i|_i|_ i|_ t t ƒ|_ g|_g|_d|_d|_dS©Nr)rrÚ_lastpidÚ threadingZLockÚ_lockÚ_sizeÚ_lengthsÚ _len_to_seqÚ_start_to_blockÚ_stop_to_blockrÚsetÚ_allocated_blocksÚ_arenasÚ_pending_free_blocksÚ _n_mallocsÚ_n_frees)rr rrrr{s   z Heap.__init__cCs|d}|||@S)Nrr)ÚnZ alignmentÚmaskrrrÚ_roundup˜sz Heap._roundupcCsZ| t|j|ƒtj¡}|j|jkr0|jd9_t d|¡t|ƒ}|j   |¡|d|fS)Néz"allocating a new mmap of length %dr) rOÚmaxrBrÚPAGESIZEÚ_DOUBLE_ARENA_SIZE_UNTILrÚinforrIÚappend)rr ÚlengthÚarenarrrÚ _new_arenažs   zHeap._new_arenacCsz|j}||jkrdS|j |¡}|j|df=|j||f=|j |¡|j|}| |d|f¡|sv|j|=|j  |¡dSr>) r Ú_DISCARD_FREE_SPACE_LARGER_THANrHÚpoprErFrIÚremoverDrC)rrWrVÚblocksÚseqrrrÚ_discard_arenaªs      zHeap._discard_arenac Cs|t |j|¡}|t|jƒkr&| |¡S|j|}|j|}| ¡}|sV|j|=|j|=|\}}}|j||f=|j||f=|Sr) ÚbisectZ bisect_leftrCÚlenrXrDrZrErF) rr rrVr]ÚblockrWÚstartÚstoprrrÚ_malloc¼s      z Heap._mallocc Csì|\}}}z|j||f}Wntk r0YnX| |¡\}}z|j||f}Wntk rfYnX| |¡\}}|||f}||}z|j| |¡Wn.tk rÊ|g|j|<t |j|¡YnX||j||f<||j||f<dSr) rFÚKeyErrorÚ_absorbrErDrUr_ZinsortrC) rrarWrbrcZ prev_blockÚ_Z next_blockrVrrrÚ_add_free_blockÍs(   zHeap._add_free_blockcCs^|\}}}|j||f=|j||f=||}|j|}| |¡|sV|j|=|j |¡||fSr)rErFrDr[rC)rrarWrbrcrVr]rrrrfës      z Heap._absorbcCs4|\}}}|j|}| ||f¡|s0| |¡dSr)rHr[r^)rrarWrbrcr\rrrÚ_remove_allocated_blockús   zHeap._remove_allocated_blockcCsBz|j ¡}Wntk r&Yq>YnX| |¡| |¡qdSr)rJrZÚ IndexErrorrhri©rrarrrÚ_free_pending_blockss   zHeap._free_pending_blockscCs~t ¡|jkr$td t ¡|j¡ƒ‚|j d¡s>|j |¡n s&   $! P