B
    2*\#                 @   s   d dl 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rvd 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   )	reductionassert_spawning)utilBufferWrapperwin32c               @   s,   e Zd Ze Zdd Zdd Zdd ZdS )Arenac             C   sz   || _ xTtdD ]@}dt t| jf }tjd||d}t dkrHP |	  qW 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_winapiZGetLastErrorcloseFileExistsErrornamebuffer_state)selfr   ir   buf r   ?C:\ALexclude\prg\programme\Python37\Lib\multiprocessing\heap.py__init__"   s    zArena.__init__c             C   s   t |  | jS )N)r   r   )r   r   r   r   __getstate__1   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__5   s    zArena.__setstate__N)	__name__
__module____qualname__tempfileZ_RandomNameSequencer   r   r   r!   r   r   r   r   r      s   r   c               @   s4   e Zd ZejdkrdgZng Zd	ddZdd ZdS )
r   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   D   s    

zArena.__init__c             C   s6   x,| j D ]"}t|}|j|j |kr|S qW t S )N)_dir_candidatesr   Zstatvfsf_bavailf_frsizer   Zget_temp_dir)r   r   dstr   r   r   r)   P   s
    
zArena._choose_dirN)r
   )r"   r#   r$   sysplatformr-   r   r)   r   r   r   r   r   >   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_arenaY   s    
r7   c             C   s   t | | S )N)r   detach)r   Zdupfdr   r   r   r5   _   s    r5   c               @   sZ   e 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S )Heap   c             C   sJ   t  | _t | _|| _g | _i | _i | _	i | _
t | _g | _g | _d S )N)r   r   _lastpid	threadingZLock_lock_size_lengths_len_to_seq_start_to_block_stop_to_blockset_allocated_blocks_arenas_pending_free_blocks)r   r   r   r   r   r   l   s    

zHeap.__init__c             C   s   |d }| | | @ S )Nr   r   )nZ	alignmentmaskr   r   r   _roundupy   s    zHeap._roundupc       	      C   s   t | j|}|t| jkrj| t| j|tj}|  jd9  _t	
d| t|}| j| |d|fS | j| }| j| }| }|s| j|= | j|= |\}}}| j||f= | j||f= |S )N   z"allocating a new mmap of length %dr   )bisectZbisect_leftr?   lenrI   maxr>   r   PAGESIZEr   infor   rE   appendr@   poprA   rB   )	r   r   r   lengtharenaseqblockstartstopr   r   r   _malloc   s"    



zHeap._mallocc       	      C   s   |\}}}y| j ||f }W n tk
r0   Y nX | |\}}y| j||f }W n tk
rf   Y nX | |\}}|||f}|| }y| j| | W n. tk
r   |g| j|< t| j| Y nX || j||f< || j ||f< d S )N)	rB   KeyError_absorbrA   r@   rP   rK   Zinsortr?   )	r   rU   rS   rV   rW   Z
prev_block_Z
next_blockrR   r   r   r   _free   s(    

z
Heap._freec             C   s^   |\}}}| j ||f= | j||f= || }| j| }|| |sV| j|= | j| ||fS )N)rA   rB   r@   remover?   )r   rU   rS   rV   rW   rR   rT   r   r   r   rZ      s    


zHeap._absorbc             C   sF   x@y| j  }W n tk
r&   P Y nX | j| | | qW d S )N)rF   rQ   
IndexErrorrD   r]   r\   )r   rU   r   r   r   _free_pending_blocks   s    zHeap._free_pending_blocksc             C   sr   t  | jkr$tdt  | j| jds>| j| n0z"| 	  | j
| | | W d | j  X d S )Nz$My pid ({0:n}) is not last pid {1:n}F)r   r   r;   r4   formatr=   acquirerF   rP   r_   rD   r]   r\   release)r   rU   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	h | 
  | t|d| j}| |\}}}|| }||k r| |||f |||f}| j| |S Q R X d S )Nr   zSize {0:n} out of rangezSize {0:n} too larger   )r4   r`   r2   maxsizeOverflowErrorr   r   r;   r   r=   r_   rI   rM   
_alignmentrX   r\   rD   add)r   r   rS   rV   rW   Znew_stoprU   r   r   r   malloc   s     

zHeap.mallocN)r"   r#   r$   rf   r   rN   r   staticmethodrI   rX   r\   rZ   r_   rc   rh   r   r   r   r   r9   h   s   
r9   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   zSize {0:n} out of rangezSize {0:n} too large)args)r4   r`   r2   rd   re   r   _heaprh   r   r   r+   rc   )r   r   rU   r   r   r   r     s    

zBufferWrapper.__init__c             C   s&   | j \\}}}}t|j|||  S )N)r   
memoryviewr   )r   rS   rV   rW   r   r   r   r   create_memoryview  s    zBufferWrapper.create_memoryviewN)r"   r#   r$   r9   rk   r   rm   r   r   r   r   r      s   	)rK   r   r   r2   r%   r<   contextr   r    r   __all__r3   r   objectr   r7   r5   registerr9   r   r   r   r   r   <module>
   s$   
  