U
    Ób‡hÂ#  ã                   @   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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r¢G d
d„ dƒZn*G dd„ dƒZdd„ Zdd„ Ze
 ee¡ G dd„ dƒZG dd„ dƒZdS )é    Né   )Ú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 )Néd   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-5abm461f/billiard/heap.pyÚ__init__'   s    
úArena.__init__c                 C   s   t  | ¡ | jS ©N)r   Zassert_spawningr   ©r   r!   r!   r"   Ú__getstate__8   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   s2  || _ || _|dkrtrÎtjdt ¡ f t ¡ d\| _}t 	|¡ t 
| tj| jf¡ tj| jdddZ}d}||kr d| }t|| ƒD ]}| |¡ qŽ~| d||  ¡ | ¡ |ksÂt‚W 5 Q R X nNtjdt ¡ f t ¡ d\| _}t 	|¡ t 
| tj| jf¡ t | j|¡ t | j| j ¡| _d S )	Nr   zpym-%d-)ÚprefixÚdirÚwbF)Úclosefdi   ó    )r   ÚfdÚPY3r-   Úmkstempr   r   r   Zget_temp_dirÚunlinkÚFinalizer   ÚioÚopenr   ÚwriteÚtellÚAssertionErrorÚ	ftruncater   r   )r   r   r4   r   ÚfÚbsÚzerosÚ_r!   r!   r"   r#   G   s6    
þ
þ
r$   N)r   )r*   r+   r,   r#   r!   r!   r!   r"   r
   E   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)r4   Ú
ValueErrorÚrebuild_arenar   r   ZDupFd)Úar!   r!   r"   Úreduce_arenaf   s    
rF   c                 C   s   t | | ¡ ƒS r%   )r
   Údetach)r   Zdupfdr!   r!   r"   rD   l   s    rD   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#   z   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_leftrO   Úlenr[   ÚmaxrN   r   ÚPAGESIZEr   Úinfor
   rU   ÚappendrP   ÚpoprQ   rR   )	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%   )	rR   ÚKeyErrorÚ_absorbrQ   rP   rc   r]   ÚinsortrO   )	r   rh   rf   ri   rj   Z
prev_blockrB   Z
next_blockre   r!   r!   r"   Ú_free£   s(    

z
Heap._freec                 C   s^   |\}}}| j ||f= | j||f= || }| j| }| |¡ |sV| j|= | j |¡ ||fS r%   )rQ   rR   rP   ÚremoverO   )r   rh   rf   ri   rj   re   rg   r!   r!   r"   rm   Á   s    


zHeap._absorbc                 C   sD   z| j  ¡ }W n tk
r&   Y q@Y nX | j |¡ |  |¡ q d S r%   )rV   rd   Ú
IndexErrorrT   rp   ro   ©r   rh   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   rJ   r=   rM   ÚacquirerV   rc   Úreleasers   rT   rp   ro   rr   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   rJ   r#   rM   rs   r[   r`   Ú
_alignmentrk   ro   rT   Úadd)r   r   rf   ri   rj   Znew_stoprh   r!   r!   r"   Úmallocó   s    
zHeap.mallocN)r*   r+   r,   ry   r   ra   r#   Ústaticmethodr[   rk   ro   rm   rs   rv   r{   r!   r!   r!   r"   rH   v   s   

rH   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)
rw   rx   r=   r   Ú_heapr{   r   r   r8   rv   )r   r   rh   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   rf   ri   rj   r   Úaddressre   r!   r!   r"   Úget_address  s    zBufferWrapper.get_addressc                 C   s
   | j d S rW   )r   r&   r!   r!   r"   Úget_size  s    zBufferWrapper.get_sizec                 C   s&   | j \\}}}}t|jƒ||| … S r%   )r   Ú
memoryviewr   )r   rf   ri   rj   r   r!   r!   r"   Úcreate_memoryview  s    zBufferWrapper.create_memoryviewN)	r*   r+   r,   rH   r~   r#   r€   r   rƒ   r!   r!   r!   r"   r     s
   )r]   r   r9   r   r   rw   rK   r-   Ú r   r   r   Z_extr   r   Ú__all__Úversion_infor5   Úplatformr
   rF   rD   ÚregisterrH   r   r!   r!   r!   r"   Ú<module>
   s,   
"! 