U
    ;rcj-                     @   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BufferWrapperZ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   Zbuf r   */usr/lib/python3.8/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platformr/   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   r8   j   s    r8   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	threadingZ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   )rO   maxrB   r   PAGESIZE_DOUBLE_ARENA_SIZE_UNTILr   infor   rI   append)r   r   lengtharenar   r   r   
_new_arena   s    zHeap._new_arenac                 C   s   |j }|| jk rd S | j|}|r(t| j|df= | j||f= | j| | j	| }||d|f |s~| j	|= | j
| d S r>   )r   _DISCARD_FREE_SPACE_LARGER_THANrH   popAssertionErrorrE   rF   rI   removerD   rC   )r   rW   rV   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_leftrC   lenrX   rD   rZ   rE   rF   )	r   r   r   rV   r^   blockrW   startstopr   r   r   _malloc   s    



zHeap._mallocc           	      C   s   |\}}}z| j ||f }W n tk
r0   Y nX | |\}}z| j||f }W n tk
rf   Y nX | |\}}|||f}|| }z| j| | W n. tk
r   |g| j|< t| j| Y nX || j||f< || j ||f< d S r   )	rF   KeyError_absorbrE   rD   rU   r`   ZinsortrC   )	r   rb   rW   rc   rd   Z
prev_block_Z
next_blockrV   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   )rE   rF   rD   r\   rC   )r   rb   rW   rc   rd   rV   r^   r   r   r   rg      s    


zHeap._absorbc                 C   s4   |\}}}| j | }|||f |s0| | d S r   )rH   r\   r_   )r   rb   rW   rc   rd   r]   r   r   r   _remove_allocated_block   s
    

zHeap._remove_allocated_blockc                 C   sB   z| j  }W n tk
r&   Y q>Y nX | | | | q d S r   )rJ   rZ   
IndexErrorri   rj   r   rb   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| n<z.|  j
d7  _
|   | | | | W 5 | j	  X d S )Nz$My pid ({0:n}) is not last pid {1:n}Fr   )r   r   r?   r7   formatrA   acquirerJ   rU   releaserL   rm   ri   rj   rl   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  5 Q R  S Q R X d S )Nr   Size {0:n} out of rangeSize {0:n} too larger   )r7   rn   r5   maxsizeOverflowErrorr   r   r?   r   rA   rK   rm   rO   rQ   
_alignmentre   ri   rH   add)r   r   rW   rc   rd   Z	real_stopr   r   r   malloc(  s     
zHeap.mallocN)r#   r$   r%   rv   rY   rS   r   rR   r   staticmethodrO   rX   r_   re   ri   rg   rj   rm   rq   rx   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   rr   rs   )args)r7   rn   r5   rt   ru   r   _heaprx   r   r   r-   rq   )r   r   rb   r   r   r   r   F  s    

zBufferWrapper.__init__c                 C   s&   | j \\}}}}t|j|||  S r   )r   
memoryviewr   )r   rW   rc   rd   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   	)r`   collectionsr   r   r   r5   r'   r@   contextr   r    r   __all__r6   r   objectr   r:   r8   registerr<   r   r   r   r   r   <module>
   s&   
$! P