a XC?hj-�@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@s,eZdZe��Zdd�Zdd�Zdd�ZdS)�ArenacCsx||_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�9/opt/alt/python39/lib64/python3.9/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__�tempfileZ_RandomNameSequencerrr r"rrrrrsrc@s4eZdZejdkrdgZngZd dd�Zdd�ZdS) rZlinuxz/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%�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 r9cCst||���Sr)r�detach)r Zdupfdrrrr7jsr7c@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) rN�maxrAr�PAGESIZE�_DOUBLE_ARENA_SIZE_UNTILr�inforrH�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_THANrG�poprDrErH�removerCrB)rrVrU�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_leftrB�lenrWrCrYrDrE) rr rrUr\�blockrV�start�stoprrr�_malloc�s      z Heap._mallocc Cs�|\}}}z|j||f}Wnty.Yn0|�|�\}}z|j||f}WntybYn0|�|�\}}|||f}||}z|j|�|�Wn,ty�|g|j|<t�|j|�Yn0||j||f<||j||f<dSr) rE�KeyError�_absorbrDrCrTr^ZinsortrB) rr`rVrarbZ prev_block�_Z next_blockrUrrr�_add_free_block�s(      zHeap._add_free_blockcCs^|\}}}|j||f=|j||f=||}|j|}|�|�|sV|j|=|j�|�||fSr)rDrErCrZrB)rr`rVrarbrUr\rrrre�s      z Heap._absorbcCs4|\}}}|j|}|�||f�|s0|�|�dSr)rGrZr])rr`rVrarbr[rrr�_remove_allocated_block�s   zHeap._remove_allocated_blockcCs@z|j��}Wnty$Yq|j�|�nFz8|j d7_ |� �|� |�|� |�W|j� �n |j� �0dS)Nz$My pid ({0:n}) is not last pid {1:n}Fr)rrr>r6�formatr@�acquirerIrTrKrkrgrh�releaserjrrr�free s  ��   z Heap.freecCs�|dkrtd�|���tj|kr.td�|���t��|jkrD|��|j ��|j d7_ |� �|� t |d�|j�}|�|�\}}}||}||kr�|�|||f�|j|�||f�|||fWd�S1s�0YdS)Nr�Size {0:n} out of range�Size {0:n} too larger)r6rlr4�maxsize� OverflowErrorrrr>rr@rJrkrNrP� _alignmentrcrgrG�add)rr rVrarbZ real_stoprrr�malloc(s  z Heap.mallocN)r#r$r%rtrXrRrrQr� staticmethodrNrWr]rcrgrerhrkrorvrrrrr;ss   r;c@s"eZdZe�Zdd�Zdd�ZdS)rcCs^|dkrtd�|���tj|kr.td�|���tj�|�}||f|_t j |tjj |fd�dS)Nrrprq)�args) r6rlr4rrrsr�_heaprvrrr,ro)rr r`rrrrFs   zBufferWrapper.__init__cCs&|j\\}}}}t|j�|||�Sr)r� memoryviewr)rrVrarbr rrr�create_memoryviewOszBufferWrapper.create_memoryviewN)r#r$r%r;ryrr{rrrrrBs )r^� collectionsrrrr4r&r?�contextrr�r�__all__r5r�objectrr9r7�registerr;rrrrr� s&   $! P