o [dj-@sddlZddlmZddlZddlZddlZddlZddlZddlm Z m Z ddl m Z dgZ ejdkrAddlZGdd d eZnGd d d eZd d Zd dZe eeGdddeZGdddeZdS)N) defaultdict) reductionassert_spawning)util BufferWrapperwin32c@s0eZdZdZeZddZddZddZ dS) ArenazL A shared memory area backed by anonymous memory (Windows). cCsx||_tdD]!}dtt|jf}tjd||d}tdkr$n | qt d||_ ||_ |j|j f|_ dS)Ndz pym-%d-%stagnamerzCannot find name for new mmap)sizerangeosgetpidnext_randmmap_winapi GetLastErrorcloseFileExistsErrornamebuffer_state)selfrirbufr+/usr/lib/python3.10/multiprocessing/heap.py__init__&s   Arena.__init__cCst||jSN)rr)rrrr __getstate__5szArena.__getstate__cCs,|\|_|_|_tjd|j|jd|_dS)Nr r )rrrrr)rstaterrr __setstate__9szArena.__setstate__N) __name__ __module__ __qualname____doc__tempfile_RandomNameSequencerr!r$r&rrrr r s  r c@s8eZdZdZejdkrdgZngZd ddZddZd S) r zJ A shared memory area backed by a temporary file (POSIX). linuxz/dev/shmr cCsx||_||_|dkr1tjdt||d\|_}t|t |tj |jft |j|t |j|j|_ dS)Nr zpym-%d-)prefixdir)rfdr+mkstemprr _choose_dirunlinkrFinalizer ftruncaterr)rrr0rrrr r!Ms  r"cCs6|jD]}t|}|j|j|kr|SqtSr#)_dir_candidatesrstatvfsf_bavailf_frsizer get_temp_dir)rrdstrrr r2[s  zArena._choose_dirN)r ) r'r(r)r*sysplatformr6r!r2rrrr r Cs   cCs(|jdkr tdt|jt|jffS)Nr zDArena is unpicklable because forking was enabled when it was created)r0 ValueError rebuild_arenarrDupFd)arrr reduce_arenads rCcCst||Sr#)r detach)rdupfdrrr r@jsr@c@szeZdZdZdZdZejfddZe ddZ ddZ d d Z d d Z d dZddZddZddZddZddZdS)Heapi@cCsXt|_t|_||_g|_i|_i|_ i|_ t t |_ g|_g|_d|_d|_dSNr)rr_lastpid threadingLock_lock_size_lengths _len_to_seq_start_to_block_stop_to_blockrset_allocated_blocks_arenas_pending_free_blocks _n_mallocs_n_frees)rrrrr r!{s    z Heap.__init__cCs|d}|||@S)Nrr)n alignmentmaskrrr _roundupsz Heap._roundupcCsZ|t|j|tj}|j|jkr|jd9_td|t|}|j ||d|fS)Nz"allocating a new mmap of length %dr) r[maxrMrPAGESIZE_DOUBLE_ARENA_SIZE_UNTILrinfor rTappend)rrlengtharenarrr _new_arenas    zHeap._new_arenacCs|j}||jkr dS|j|}|rJ|j|df=|j||f=|j||j|}||d|f|sA|j|=|j |dSdSrH) r_DISCARD_FREE_SPACE_LARGER_THANrSpoprPrQrTremoverOrN)rrcrbblocksseqrrr _discard_arenas      zHeap._discard_arenac Cs|t|j|}|t|jkr||S|j|}|j|}|}|s+|j|=|j|=|\}}}|j||f=|j||f=|Sr#) bisect bisect_leftrNlenrdrOrfrPrQ) rrrrbriblockrcstartstoprrr _mallocs      z Heap._mallocc Cs|\}}}z |j||f}Wn tyYnw||\}}z |j||f}Wn ty1Ynw||\}}|||f}||}z |j||Wntyb|g|j|<t|j|Ynw||j||f<||j||f<dSr#) rQKeyError_absorbrPrOrarkinsortrN) rrnrcrorp prev_block_ next_blockrbrrr _add_free_blocks.      zHeap._add_free_blockcCs^|\}}}|j||f=|j||f=||}|j|}|||s+|j|=|j|||fSr#)rPrQrOrgrN)rrnrcrorprbrirrr rss      z Heap._absorbcCs8|\}}}|j|}|||f|s||dSdSr#)rSrgrj)rrnrcrorprhrrr _remove_allocated_blocks  zHeap._remove_allocated_blockcCs< z|j}Wn tyYdSw||||qr#)rUrf IndexErrorrxryrrnrrr _free_pending_blockss   zHeap._free_pending_blockscCst|jkrtdt|j|jds |j|dSz|j d7_ | | || |W|j dS|j w)Nz$My pid ({0:n}) is not last pid {1:n}Fr)rrrIr?formatrLacquirerUrarWr|rxryreleaser{rrr free s     z Heap.freecCs|dkr td|tj|krtd|t|jkr"||j D|j d7_ | | t |d|j}||\}}}||}||krS||||f|j|||f|||fWdS1slwYdS)NrSize {0:n} out of rangeSize {0:n} too larger)r?r}r=maxsize OverflowErrorrrrIr!rLrVr|r[r] _alignmentrqrxrSadd)rrrcrorp real_stoprrr malloc(s" $z Heap.mallocN)r'r(r)rrer_rr^r! staticmethodr[rdrjrqrxrsryr|rrrrrr rFss    rFc@s"eZdZeZddZddZdS)rcCs^|dkr td|tj|krtd|tj|}||f|_t j |tjj |fddS)Nrrr)args) r?r}r=rrr_heaprrrr4r)rrrnrrr r!Fs   zBufferWrapper.__init__cCs&|j\\}}}}t|j|||Sr#)r memoryviewr)rrcrorprrrr create_memoryviewOszBufferWrapper.create_memoryviewN)r'r(r)rFrr!rrrrr rBs )rk collectionsrrrr=r+rJcontextrrr__all__r>robjectr rCr@registerrFrrrrr s(   $! P