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mZmZ ej	dkrvzd dl
Z
W qz ek
rr   d dlmZ
 Y qzX ndZ
zd dlZW n ek
r   dZY nX zd dlmZ eeefZW n ek
r   eefZY nX ejdkred	 ZZn
ed
 ZZeedr$ejZerdd Zndd Zndd ZzejZejZW n* ek
rf   dd Ze \ZZ[Y nX ejd  dkr~e Z ne Z!G dd de!Z dd Z"d8ddZ#dd Z$z
ej%Z%W n( ek
r   dd Z%d9ddZ&Y nX d:ddZ&d d! Z'zd dl(Z(W n ek
r   d"d# Z)Y n
X d$d# Z)ej	dkrDd%d& Z*d'd( Z+n0d d)lm,Z, d d*l-m-Z-m.Z.m/Z/ d+d( Z+d,d& Z*d-Z0d.Z1ej	dkrzd dl2Z2W n ek
r   dZ2Y nX d/d0 Z3nfzd d1lm4Z4m5Z5 W n ek
r   d Z4Z5Y nX d2ej	ksej	d3krd4d5 Z6nd6d5 Z6d7d0 Z3dS );    )absolute_importN   )rangezip_longestwin32)r   )UnsupportedOperation)         TFwritec                 C   s   t | ||d  S N)	__write__fdbufoffset r   3/tmp/pip-unpacked-wheel-lulkwrw3/billiard/compat.pysend_offset)   s    r   c                 C   s   t | t||S r   )r   buf_tr   r   r   r   r   .   s    c                 C   s   t dd S )Nr   NotImplementedErrorr   r   r   r   r   3   s    c                     s>   t    dkrdnd fdd}  fdd}| |fS )Nmbcsstrictsurrogateescapec                    s:   t | tr| S t | tr$|  S tdt| j dS )a  
            Encode filename to the filesystem encoding with 'surrogateescape'
            error handler, return bytes unchanged. On Windows, use 'strict'
            error handler if the file system encoding is 'mbcs' (which is the
            default encoding).
            expect bytes or str, not %sN)
isinstancebytesstrencode	TypeErrortype__name__filenameencodingerrorsr   r   fsencodeB   s    

z_fscodec.<locals>.fsencodec                    s:   t | tr| S t | tr$|  S tdt| j dS )a  
            Decode filename from the filesystem encoding with 'surrogateescape'
            error handler, return str unchanged. On Windows, use 'strict' error
            handler if the file system encoding is 'mbcs' (which is the default
            encoding).
            r   N)r   r   r   decoder    r!   r"   r#   r%   r   r   fsdecodeQ   s    

z_fscodec.<locals>.fsdecode)sysgetfilesystemencoding)r(   r*   r   r%   r   _fscodec;   s    r-      c                   @   s   e Zd Zdd ZdS )r   c                 G   s.   t |dkr&t|d j|dd   S t| S )Nr   r   )len_bytesr   )clsargsr   r   r   __new__o   s    zbytes.__new__N)r"   
__module____qualname__r3   r   r   r   r   r   m   s   r   c                 C   s4   t | tjr| S z
|  W S  tk
r.   Y nX dS )z3Get object fileno, or :const:`None` if not defined.N)r   numbersIntegralfilenoFILENO_ERRORS)fr   r   r   maybe_filenou   s    
r;   c                 C   sH   zt dW S    Y nX tdkr&| S ttjd }|tjkrD| S |S )zReturn the maximum number of open file descriptors
    on this system.

    :keyword default: Value returned if there's no file
                      descriptor limit.

    SC_OPEN_MAXNr   )ossysconfresourceZ	getrlimitZRLIMIT_NOFILEZRLIM_INFINITY)defaultZfdmaxr   r   r   	get_fdmax   s    
rA   c                    s   t    fdd| D S )z7Return all unique elements in ``it``, preserving order.c                 3   s$   | ]}| kr  |p|V  qd S r   )add).0objseenr   r   	<genexpr>   s      zuniq.<locals>.<genexpr>)set)itr   rE   r   uniq   s    rJ   c                 C   sX   t t| |D ]D}zt| W q tk
rP } z|jtjkr@ W 5 d }~X Y qX qd S r   )reversedr   r=   closeOSErrorerrnoEBADF)Zfd_lowZfd_highr   excr   r   r   
closerange   s    rQ   c                 C   s~   t ttdd tt| pg D } tdd}tdg|  t| |g  }}t||D ]"\}}|d |krVt|d | qVd S )Nc                 s   s   | ]}|d k	r|V  qd S r   r   rC   r:   r   r   r   rG      s     z!close_open_fds.<locals>.<genexpr>   r@   r   )	listrJ   sortedmapr;   rA   iterr   rQ   )keepZmaxfdZkLZkHlowhighr   r   r   close_open_fds   s    
r]   c                 C   sv   dd | pg D } t ttddD ]L}|| kr$zt| W q$ tk
rn } z|jtjkr^ W 5 d }~X Y q$X q$d S )Nc                 S   s    g | ]}t |d k	rt |qS r   )r;   rR   r   r   r   
<listcomp>   s    z"close_open_fds.<locals>.<listcomp>rS   rT   )rK   r   rA   r=   rL   rM   rN   rO   )rZ   r   rP   r   r   r   r]      s    c                 C   sf   z| j W S  tk
r`   z.t| jtrDt| jdkrD| jd W  Y S W n tk
rZ   Y nX Y nX dS )zV:exc:`socket.error` and :exc:`IOError` first got
    the ``.errno`` attribute in Py2.7r   r   )rN   AttributeErrorr   r2   tupler/   )rP   r   r   r   	get_errno   s    ra   c                 C   sZ   t jdkr"|tt jtt jg }t }|sVttdd |D d t	t
| | |S )Nr   c                 s   s   | ]}|r|V  qd S r   r   rR   r   r   r   rG      s      z!spawnv_passfds.<locals>.<genexpr>)rZ   )r+   platformr;   stdoutstderrr=   forkr]   rW   execvr(   )pathr2   passfdspidr   r   r   spawnv_passfds   s    
rj   c                 C   s   t |}t \}}zZ|t| gdt|d d dddddd||ddg}tjdkrX|d |	d  t
j| W S t| t| X d S )NTrU   F)r.   	   )NNNrU   )rW   r=   piperL   r(   r`   r+   version_infoextendappend_posixsubprocess	fork_exec)rg   r2   rh   errpipe_readerrpipe_writer   r   r   rj      s4                 



c                 C   s   t dd S )Nz$setblocking not implemented on win32r   )handleblockingr   r   r   setblocking   s    rv   c                 C   s   t dd S )Nz#isblocking not implemented on win32r   rt   r   r   r   
isblocking   s    rx   )
O_NONBLOCK)fcntlF_GETFLF_SETFLc                 C   s   t | tt@  S r   )rz   r{   ry   rw   r   r   r   rx      s    c                 C   s.   t | td}t | t|r |t @ n|tB  d S )Nr   )rz   r{   r|   ry   )rt   ru   flagsr   r   r   rv      s     z
On Windows, the ability to inspect memory usage requires the psutil library.

You can install it using pip:

    $ pip install psutil
z
Your platform ({0}) does not seem to have the `resource.getrusage' function.

Please open an issue so that we can add support for this platform.
c                   C   s2   t d krtt tt t  d d S )Nr         @)	psutilImportErrorE_PSUTIL_MISSINGstripintProcessr=   getpidZmemory_infor   r   r   r   mem_rss  s    r   )	getrusageRUSAGE_SELFZbsddarwinc                 C   s   t | d S )Nr~   r   vr   r   r   maxrss_to_kb)  s    r   c                 C   s   t | S r   r   r   r   r   r   r   0  s    c                   C   s*   t d krtt tjttt	j
S r   )r?   r   E_RESOURCE_MISSINGr   formatr+   rb   r   r   r   Z	ru_maxrssr   r   r   r   r   4  s    )N)N)N)7
__future__r   rN   r6   r=   r+   Zfiver   r   rb   Z_winapir   _multiprocessingr   r?   ior   r_   
ValueErrorr9   rm   
memoryviewr   Zis_new_bufferbufferhasattrr   r   r   r(   r*   r-   r   r0   r;   rA   rJ   rQ   r]   ra   rp   rj   rv   rx   ry   rz   r{   r|   r   r   r   r   r   r   r   r   r   r   r   <module>   s   






'





	


