U
    Íø.e>$  ã                   @   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-39f38r4u/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   sJ  || _ || _|dkr4t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 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   r4   r   ÚfÚbsÚzerosÚ_r!   r!   r"   r#   G   s@    
þ
þ  ÿ
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_arenai   s    
rJ   c                 C   s   t | | ¡ ƒS r%   )r
   Údetach)r   Zdupfdr!   r!   r"   rH   o   s    rH   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_leftrS   Úlenr_   ÚmaxrR   r   ÚPAGESIZEr   Úinfor
   rY   ÚappendrT   ÚpoprU   rV   )	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%   )	rV   ÚKeyErrorÚ_absorbrU   rT   rg   ra   ÚinsortrS   )	r   rl   rj   rm   rn   Z
prev_blockrF   Z
next_blockri   r!   r!   r"   Ú_free¦   s(    

z
Heap._freec                 C   s^   |\}}}| j ||f= | j||f= || }| j| }| |¡ |sV| j|= | j |¡ ||fS r%   )rU   rV   rT   ÚremoverS   )r   rl   rj   rm   rn   ri   rk   r!   r!   r"   rq   Ä   s    


zHeap._absorbc                 C   sD   z| j  ¡ }W n tk
r&   Y q@Y nX | j |¡ |  |¡ q d S r%   )rZ   rh   Ú
IndexErrorrX   rt   rs   ©r   rl   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   rN   r=   rQ   ÚacquirerZ   rg   Úreleaserw   rX   rt   rs   rv   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   rN   r#   rQ   rw   r_   rd   Ú
_alignmentro   rs   rX   Úadd)r   r   rj   rm   rn   Znew_stoprl   r!   r!   r"   Úmallocö   s    
zHeap.mallocN)r*   r+   r,   r}   r   re   r#   Ústaticmethodr_   ro   rs   rq   rw   rz   r   r!   r!   r!   r"   rL   y   s   

rL   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   r8   rz   )r   r   rl   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   rj   rm   rn   r   Úaddressri   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   rj   rm   rn   r   r!   r!   r"   Úcreate_memoryview  s    zBufferWrapper.create_memoryviewN)	r*   r+   r,   rL   r‚   r#   r„   r…   r‡   r!   r!   r!   r"   r     s
   )ra   r   r9   r   r   r{   rO   r-   Ú r   r   r   Z_extr   r   Ú__all__Úversion_infor5   Úplatformr
   rJ   rH   ÚregisterrL   r   r!   r!   r!   r"   Ú<module>
   s,   
"$ 