a
   w97                   @   s   d dl Z d dlmZ d dlZd dlZd dlZd dlZd dlZddlm	Z	m
Z
 ddlmZ dgZejdkrd dlZG dd	 d	eZn,G d
d	 d	eZdd Zdd Ze	ee G dd deZG dd deZdS )    N)defaultdict   )	reductionassert_spawning)utilBufferWrapperwin32c                   @   s0   e Zd ZdZe Zdd Zdd Zdd Z	dS )	ArenazL
        A shared memory area backed by anonymous memory (Windows).
        c                 C   sx   || _ tdD ]B}dt t| jf }tjd||d}t dkrH qZ|	  qt
d|| _|| _| j | jf| _d S )Nd   z	pym-%d-%sZtagnamer   zCannot find name for new mmap)sizerangeosgetpidnext_randmmap_winapiZGetLastErrorcloseFileExistsErrornamebuffer_state)selfr   ir   buf r   */usr/lib/python3.9/multiprocessing/heap.py__init__&   s    
Arena.__init__c                 C   s   t |  | jS N)r   r   )r   r   r   r   __getstate__5   s    zArena.__getstate__c                 C   s,   | \| _ | _| _tjd| j | jd| _d S )Nr   r   )r   r   r   r   r   )r   stater   r   r   __setstate__9   s    zArena.__setstate__N)
__name__
__module____qualname____doc__tempfileZ_RandomNameSequencer   r   r"   r$   r   r   r   r   r	      s
   r	   c                   @   s8   e Zd ZdZejdkrdgZng Zd
ddZdd Zd	S )r	   zJ
        A shared memory area backed by a temporary file (POSIX).
        Zlinuxz/dev/shmr   c                 C   sx   || _ || _|dkrbtjdt  | |d\| _}t| t	| tj
| jf t| j| t| j| j | _d S )Nr   zpym-%d-)prefixdir)r   fdr)   Zmkstempr   r   _choose_dirunlinkr   Finalizer   	ftruncater   r   )r   r   r,   r   r   r   r   r   M   s    

r    c                 C   s6   | j D ]&}t|}|j|j |kr|  S qt S r!   )_dir_candidatesr   statvfsf_bavailf_frsizer   Zget_temp_dir)r   r   dstr   r   r   r-   [   s
    


zArena._choose_dirN)r   )	r%   r&   r'   r(   sysplatformr1   r   r-   r   r   r   r   r	   C   s   

c                 C   s(   | j dkrtdt| jt| j ffS )Nr   zDArena is unpicklable because forking was enabled when it was created)r,   
ValueErrorrebuild_arenar   r   ZDupFd)ar   r   r   reduce_arenad   s    
r<   c                 C   s   t | | S r!   )r	   detach)r   Zdupfdr   r   r   r:   j   s    r:   c                   @   sz   e Zd ZdZdZdZejfddZe	dd Z
dd Zd	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )Heap   i  @ c                 C   sX   t  | _t | _|| _g | _i | _i | _	i | _
tt| _g | _g | _d| _d| _d S Nr   )r   r   _lastpid	threadingLock_lock_size_lengths_len_to_seq_start_to_block_stop_to_blockr   set_allocated_blocks_arenas_pending_free_blocks
_n_mallocs_n_frees)r   r   r   r   r   r   {   s    


zHeap.__init__c                 C   s   |d }| | | @ S )Nr   r   )nZ	alignmentmaskr   r   r   _roundup   s    zHeap._roundupc                 C   sZ   |  t| j|tj}| j| jk r0|  jd9  _td| t|}| j	
| |d|fS )N   z"allocating a new mmap of length %dr   )rR   maxrE   r   PAGESIZE_DOUBLE_ARENA_SIZE_UNTILr   infor	   rL   append)r   r   lengtharenar   r   r   
_new_arena   s    zHeap._new_arenac                 C   s   |j }|| jk rd S | j|}|r(J | j|df= | j||f= | j| | j| }||d|f |s~| j|= | j	| d S r@   )
r   _DISCARD_FREE_SPACE_LARGER_THANrK   poprH   rI   rL   removerG   rF   )r   rZ   rY   blocksseqr   r   r   _discard_arena   s    

zHeap._discard_arenac           	      C   s|   t | j|}|t| jkr&| |S | j| }| j| }| }|sV| j|= | j|= |\}}}| j||f= | j||f= |S r!   )	bisectZbisect_leftrF   lenr[   rG   r]   rH   rI   )	r   r   r   rY   r`   blockrZ   startstopr   r   r   _malloc   s    



zHeap._mallocc           	      C   s   |\}}}z| j ||f }W n ty.   Y n0 | |\}}z| j||f }W n tyb   Y n0 | |\}}|||f}|| }z| j| | W n, ty   |g| j|< t| j| Y n0 || j||f< || j ||f< d S r!   )	rI   KeyError_absorbrH   rG   rX   rb   ZinsortrF   )	r   rd   rZ   re   rf   Z
prev_block_Z
next_blockrY   r   r   r   _add_free_block   s(    

zHeap._add_free_blockc                 C   s^   |\}}}| j ||f= | j||f= || }| j| }|| |sV| j|= | j| ||fS r!   )rH   rI   rG   r^   rF   )r   rd   rZ   re   rf   rY   r`   r   r   r   ri      s    


zHeap._absorbc                 C   s4   |\}}}| j | }|||f |s0| | d S r!   )rK   r^   ra   )r   rd   rZ   re   rf   r_   r   r   r   _remove_allocated_block   s
    

zHeap._remove_allocated_blockc                 C   s@   z| j  }W n ty$   Y q<Y n0 | | | | q d S r!   )rM   r]   
IndexErrorrk   rl   r   rd   r   r   r   _free_pending_blocks  s    

zHeap._free_pending_blocksc                 C   s   t  | jkr$tdt  | j| jds>| j| nFz8|  j	d7  _	| 
  | | | | W | j  n| j  0 d S )Nz$My pid ({0:n}) is not last pid {1:n}Fr   )r   r   rA   r9   formatrD   acquirerM   rX   rO   ro   rk   rl   releasern   r   r   r   free  s    


z	Heap.freec                 C   s   |dk rt d|tj|kr.td|t | jkrD|   | j	 |  j
d7  _
|   | t|d| j}| |\}}}|| }||k r| |||f | j| ||f |||fW  d    S 1 s0    Y  d S )Nr   Size {0:n} out of rangeSize {0:n} too larger   )r9   rp   r7   maxsizeOverflowErrorr   r   rA   r   rD   rN   ro   rR   rT   
_alignmentrg   rk   rK   add)r   r   rZ   re   rf   Z	real_stopr   r   r   malloc(  s     
zHeap.mallocN)r%   r&   r'   rx   r\   rV   r   rU   r   staticmethodrR   r[   ra   rg   rk   ri   rl   ro   rs   rz   r   r   r   r   r>   s   s   

r>   c                   @   s"   e Zd Ze Zdd Zdd ZdS )r   c                 C   s^   |dk rt d|tj|kr.td|tj|}||f| _t	j
| tjj|fd d S )Nr   rt   ru   )args)r9   rp   r7   rv   rw   r   _heaprz   r   r   r/   rs   )r   r   rd   r   r   r   r   F  s    

zBufferWrapper.__init__c                 C   s&   | j \\}}}}t|j|||  S r!   )r   
memoryviewr   )r   rZ   re   rf   r   r   r   r   create_memoryviewO  s    zBufferWrapper.create_memoryviewN)r%   r&   r'   r>   r}   r   r   r   r   r   r   r   B  s   	)rb   collectionsr   r   r   r7   r)   rB   contextr   r    r   __all__r8   r   objectr	   r<   r:   registerr>   r   r   r   r   r   <module>
   s&   
$! P