o
    éT•jj-  ã                   @   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 )Néd   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