o
    fj-                     @   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rAd 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 ]!}dt t| jf }tjd||d}t dkr$ n	|	  qt
d|| _|| _| j | jf| _d S )Nd   z	pym-%d-%stagnamer   zCannot find name for new mmap)sizerangeosgetpidnext_randmmap_winapiGetLastErrorcloseFileExistsErrornamebuffer_state)selfr   ir   buf r   +/usr/lib/python3.10/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__tempfile_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).
        linuxz/dev/shmr   c                 C   sx   || _ || _|dkr1t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+   mkstempr   r   _choose_dirunlinkr   Finalizer   	ftruncater   r   )r   r   r0   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   get_temp_dir)r   r   dstr   r   r    r2   [   s   

zArena._choose_dirN)r   )	r'   r(   r)   r*   sysplatformr6   r!   r2   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)r0   
ValueErrorrebuild_arenar   r   DupFd)ar   r   r    reduce_arenad   s   
rC   c                 C   s   t | | S r#   )r	   detach)r   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   )n	alignmentmaskr   r   r    _roundup   s   zHeap._roundupc                 C   sZ   |  t| j|tj}| j| jk r|  jd9  _td| t|}| j	
| |d|fS )N   z"allocating a new mmap of length %dr   )r[   maxrM   r   PAGESIZE_DOUBLE_ARENA_SIZE_UNTILr   infor	   rT   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 |sA| j|= | j	| d S d S rH   )
r   _DISCARD_FREE_SPACE_LARGER_THANrS   poprP   rQ   rT   removerO   rN   )r   rc   rb   blocksseqr   r   r    _discard_arena   s   

zHeap._discard_arenac           	      C   s|   t | j|}|t| jkr| |S | j| }| j| }| }|s+| j|= | j|= |\}}}| j||f= | j||f= |S r#   )	bisectbisect_leftrN   lenrd   rO   rf   rP   rQ   )	r   r   r   rb   ri   blockrc   startstopr   r   r    _malloc   s   



zHeap._mallocc           	      C   s   |\}}}z	| j ||f }W n	 ty   Y nw | |\}}z	| j||f }W n	 ty1   Y nw | |\}}|||f}|| }z
| j| | W n tyb   |g| j|< t| j| Y nw || j||f< || j ||f< d S r#   )	rQ   KeyError_absorbrP   rO   ra   rk   insortrN   )	r   rn   rc   ro   rp   
prev_block_
next_blockrb   r   r   r    _add_free_block   s.   

zHeap._add_free_blockc                 C   s^   |\}}}| j ||f= | j||f= || }| j| }|| |s+| j|= | j| ||fS r#   )rP   rQ   rO   rg   rN   )r   rn   rc   ro   rp   rb   ri   r   r   r    rs      s   


zHeap._absorbc                 C   s8   |\}}}| j | }|||f |s| | d S d S r#   )rS   rg   rj   )r   rn   rc   ro   rp   rh   r   r   r    _remove_allocated_block   s   

zHeap._remove_allocated_blockc                 C   s<   	 z| j  }W n
 ty   Y d S w | | | | qr#   )rU   rf   
IndexErrorrx   ry   r   rn   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| d S z|  j	d7  _	| 
  | | | | W | j  d S | j  w )Nz$My pid ({0:n}) is not last pid {1:n}Fr   )r   r   rI   r?   formatrL   acquirerU   ra   rW   r|   rx   ry   releaser{   r   r   r    free  s   


z	Heap.freec                 C   s   |dk rt d|tj|krtd|t | jkr"|   | j	D |  j
d7  _
|   | t|d| j}| |\}}}|| }||k rS| |||f | j| ||f |||fW  d    S 1 slw   Y  d S )Nr   Size {0:n} out of rangeSize {0:n} too larger   )r?   r}   r=   maxsizeOverflowErrorr   r   rI   r!   rL   rV   r|   r[   r]   
_alignmentrq   rx   rS   add)r   r   rc   ro   rp   	real_stopr   r   r    malloc(  s"   
$zHeap.mallocN)r'   r(   r)   r   re   r_   r   r^   r!   staticmethodr[   rd   rj   rq   rx   rs   ry   r|   r   r   r   r   r   r    rF   s   s     

rF   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   r   r   )args)r?   r}   r=   r   r   r   _heapr   r   r   r4   r   )r   r   rn   r   r   r    r!   F  s   

zBufferWrapper.__init__c                 C   s&   | j \\}}}}t|j|||  S r#   )r   
memoryviewr   )r   rc   ro   rp   r   r   r   r    create_memoryviewO  s   zBufferWrapper.create_memoryviewN)r'   r(   r)   rF   r   r!   r   r   r   r   r    r   B  s    	)rk   collectionsr   r   r   r=   r+   rJ   contextr   r    r   __all__r>   r   objectr	   rC   r@   registerrF   r   r   r   r   r    <module>   s(   	
$! P