U
    d$                     @   s   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Zd dlZd dl	Z	ddl
mZ ddl
mZ ddl
mZ ddlmZmZ dgZejd  d	kZejd
krG 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 )    )absolute_importN   )context)	reduction)util)	_billiardwin32BufferWrapper   r   c                   @   s,   e Zd Ze Zdd Zdd Zdd ZdS )Arenac                 C   s   || _ tdD ]B}dt t| jf }tjd||d}t dkrH qf|	  qt
d}tj|_||| _|| _| j | jf| _d S )Nd   z	pym-%d-%stagnamer   zCannot find name for new mmap)sizerangeosgetpidnext_randmmapr   ZGetLastErrorcloseIOErrorerrnoEEXISTnamebuffer_state)selfr   ir   bufexc r"   1/tmp/pip-unpacked-wheel-lulkwrw3/billiard/heap.py__init__(   s    
Arena.__init__c                 C   s   t |  | jS N)r   Zassert_spawningr   r   r"   r"   r#   __getstate__9   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__=   s    zArena.__setstate__N)	__name__
__module____qualname__tempfile_RandomNameSequencer   r$   r(   r*   r"   r"   r"   r#   r   $   s   r   c                   @   s   e Zd ZdddZdS )r   r   c              	   C   sJ  || _ || _|dkr4trtjdt f t d\| _}t	| t
| tj| jf tj| jdddZ}d}||krd| }t|| D ]}|| q~|d||   | |kstW 5 Q R X nftjdt f t d}t|tjtjB tjB d	| _t
| tj| jf t	| t| j| t| j| j | _d S )
Nr   zpym-%d-)prefixdirwbF)closefdi       i  )r   fdPY3r.   mkstempr   r   r   Zget_temp_dirunlinkFinalizer   ioopenr   writetellAssertionErrormktempO_RDWRO_CREATO_EXCL	ftruncater   r   )r   r   r5   r   fbszeros_r"   r"   r#   r$   H   s@    

  
r%   N)r   )r+   r,   r-   r$   r"   r"   r"   r#   r   F   s   c                 C   s(   | j dkrtdt| jt| j ffS )Nr   zCArena is unpicklable becauseforking was enabled when it was created)r5   
ValueErrorrebuild_arenar   r   ZDupFd)ar"   r"   r#   reduce_arenaj   s    
rK   c                 C   s   t | | S r&   )r   detach)r   Zdupfdr"   r"   r#   rI   p   s    rI   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 r&   )r   r   _lastpid	threading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$   ~   s    

zHeap.__init__c                 C   s   |d }| | | @ S Nr   r"   )n	alignmentmaskr"   r"   r#   _roundup   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   )bisectbisect_leftrT   lenr`   maxrS   r   PAGESIZEr   infor   rZ   appendrU   poprV   rW   )	r   r   r   lengtharenaseqblock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&   )	rW   KeyError_absorbrV   rU   rh   rb   insortrT   )	r   rm   rk   rn   ro   Z
prev_blockrG   Z
next_blockrj   r"   r"   r#   _free   s(    

z
Heap._freec                 C   s^   |\}}}| j ||f= | j||f= || }| j| }|| |sV| j|= | j| ||fS r&   )rV   rW   rU   removerT   )r   rm   rk   rn   ro   rj   rl   r"   r"   r#   rr      s    


zHeap._absorbc                 C   sD   z| j  }W n tk
r&   Y q@Y nX | j| | | q d S r&   )r[   ri   
IndexErrorrY   ru   rt   r   rm   r"   r"   r#   _free_pending_blocks   s    
zHeap._free_pending_blocksc                 C   s`   t  | jkst| jds,| j| n0z"| 	  | j
| | | W 5 | j  X d S )NF)r   r   rO   r>   rR   acquirer[   rh   releaserx   rY   ru   rt   rw   r"   r"   r#   free   s    z	Heap.freec              
   C   s   d|  krt jk sn tt | jkr2|   | jt |   | 	t
|d| j}| |\}}}|| }||k r| |||f |||f}| j| |W  5 Q R  S Q R X d S )Nr   r   )sysmaxsizer>   r   r   rO   r$   rR   rx   r`   re   
_alignmentrp   rt   rY   add)r   r   rk   rn   ro   Znew_stoprm   r"   r"   r#   malloc   s    
zHeap.mallocN)r+   r,   r-   r~   r   rf   r$   staticmethodr`   rp   rt   rr   rx   r{   r   r"   r"   r"   r#   rM   z   s   

rM   c                   @   s2   e Zd Ze Zdd Zdd Zdd Zdd Zd	S )
r	   c                 C   sL   d|  krt jk sn ttj|}||f| _tj| tjj	|fd d S )Nr   )args)
r|   r}   r>   r	   _heapr   r   r   r9   r{   )r   r   rm   r"   r"   r#   r$     s    
zBufferWrapper.__init__c                 C   s4   | j \\}}}}t|j\}}||ks,t|| S r&   )r   r   Zaddress_of_bufferr   r>   )r   rk   rn   ro   r   addressrj   r"   r"   r#   get_address  s    zBufferWrapper.get_addressc                 C   s
   | j d S r\   )r   r'   r"   r"   r#   get_size  s    zBufferWrapper.get_sizec                 C   s&   | j \\}}}}t|j|||  S r&   )r   
memoryviewr   )r   rk   rn   ro   r   r"   r"   r#   create_memoryview  s    zBufferWrapper.create_memoryviewN)	r+   r,   r-   rM   r   r$   r   r   r   r"   r"   r"   r#   r	     s
   )
__future__r   rb   r   r:   r   r   r|   rP   r.    r   r   r   Z_extr   r   __all__version_infor6   platformobjectr   rK   rI   registerrM   r	   r"   r"   r"   r#   <module>	   s.   
"$ 