U
    g$                  	   @  s  d dl mZ d dlZd dlZddlmZmZmZ zd dlZW n e	e
fk
rX   dZY nX zd dlZW n e	k
r~   dZY nX ddddZG d	d
 d
ZG dd dZG dd dZG dd dZG dd dZG dd dZG dd dZG dd dZG dd dZG dd dZdS )    )annotationsN   )ExceptionMappingPoolTimeoutmap_exceptionsstrreturnc                  C  sr   zdd l } W n tk
r$   d}Y n
X |  }|dkr>td|dkrVtd krVtd|dkrntd krntd|S )Nr   asyncio)r
   trioz/Running under an unsupported async environment.zBRunning with asyncio requires installation of 'httpcore[asyncio]'.r   z<Running with trio requires installation of 'httpcore[trio]'.)sniffioImportErrorcurrent_async_libraryRuntimeErroranyior   )r   environment r   =/tmp/pip-unpacked-wheel-hgeblu65/httpcore/_synchronization.pyr      s     
r   c                   @  sP   e Zd ZdZddddZddddZd ddd	ZddddddddZd
S )	AsyncLock
    This is a standard lock.

    In the sync case `Lock` provides thread locking.
    In the async case `AsyncLock` provides async locking.
    Noner   c                 C  s
   d| _ d S N _backendselfr   r   r   __init__8   s    zAsyncLock.__init__c                 C  s6   t  | _| jdkrt | _n| jdkr2t | _dS z~
        Detect if we're running under 'asyncio' or 'trio' and create
        a lock with the correct implementation.
        r   r
   N)r   r   r   Lock
_trio_lockr   _anyio_lockr   r   r   r   setup;   s
    

zAsyncLock.setupc                   sH   | j s|   | j dkr*| j I d H  n| j dkrD| j I d H  | S Nr   r
   )r   r"   r    acquirer!   r   r   r   r   
__aenter__F   s    

zAsyncLock.__aenter__Ntype[BaseException] | NoneBaseException | Nonetypes.TracebackType | Noneexc_type	exc_value	tracebackr	   c                   s.   | j dkr| j  n| j dkr*| j  d S r#   )r   r    releaser!   r   r*   r+   r,   r   r   r   	__aexit__Q   s    

zAsyncLock.__aexit__)NNN)__name__
__module____qualname____doc__r   r"   r%   r/   r   r   r   r   r   0   s      r   c                   @  s4   e Zd ZdZd dddZddddd	d
ddZdS )AsyncThreadLock
    This is a threading-only lock for no-I/O contexts.

    In the sync case `ThreadLock` provides thread locking.
    In the async case `AsyncThreadLock` is a no-op.
    r   c                 C  s   | S Nr   r   r   r   r   	__enter__e   s    zAsyncThreadLock.__enter__Nr&   r'   r(   r   r)   c                 C  s   d S r6   r   r.   r   r   r   __exit__h   s    zAsyncThreadLock.__exit__)NNN)r0   r1   r2   r3   r7   r8   r   r   r   r   r4   ]   s      r4   c                   @  sH   e Zd ZddddZddddZddddZdd
ddddZd	S )
AsyncEventr   r   c                 C  s
   d| _ d S r   r   r   r   r   r   r   r   s    zAsyncEvent.__init__c                 C  s6   t  | _| jdkrt | _n| jdkr2t | _dS r   )r   r   r   Event_trio_eventr   _anyio_eventr   r   r   r   r"   u   s
    

zAsyncEvent.setupc                 C  s<   | j s|   | j dkr$| j  n| j dkr8| j  d S r#   )r   r"   r;   setr<   r   r   r   r   r=      s    

zAsyncEvent.setNfloat | Nonetimeoutr	   c              
     s   | j s|   | j dkrrtjti}|d kr2tdn|}t|, t| | j	 I d H  W 5 Q R X W 5 Q R X nL| j dkrt
ti}t|, t| | j	 I d H  W 5 Q R X W 5 Q R X d S )Nr   infr
   )r   r"   r   ZTooSlowErrorr   floatr   Z
fail_afterr;   waitTimeoutErrorr   r<   )r   r@   Ztrio_exc_mapZtimeout_or_infZanyio_exc_mapr   r   r   rC      s    


&

zAsyncEvent.wait)N)r0   r1   r2   r   r"   r=   rC   r   r   r   r   r9   q   s   	r9   c                   @  sF   e Zd ZdddddZddddZddd	d
ZddddZdS )AsyncSemaphoreintr   boundr	   c                 C  s   || _ d| _d S r   )_boundr   r   rH   r   r   r   r      s    zAsyncSemaphore.__init__r   c                 C  sJ   t  | _| jdkr(tj| j| jd| _n| jdkrFtj| j| jd| _dS )z
        Detect if we're running under 'asyncio' or 'trio' and create
        a semaphore with the correct implementation.
        r   )initial_valueZ	max_valuer
   N)r   r   r   	SemaphorerI   _trio_semaphorer   _anyio_semaphorer   r   r   r   r"      s    
 

 zAsyncSemaphore.setupc                   sH   | j s|   | j dkr*| j I d H  n| j dkrD| j I d H  d S r#   )r   r"   rM   r$   rN   r   r   r   r   r$      s    

zAsyncSemaphore.acquirec                   s.   | j dkr| j  n| j dkr*| j  d S r#   )r   rM   r-   rN   r   r   r   r   r-      s    

zAsyncSemaphore.releaseN)r0   r1   r2   r   r"   r$   r-   r   r   r   r   rE      s   	rE   c                   @  s>   e Zd ZddddZd dddZddd	d
ddddZdS )AsyncShieldCancellationr   r   c                 C  s>   t  | _| jdkr"tjdd| _n| jdkr:tjdd| _dS )z
        Detect if we're running under 'asyncio' or 'trio' and create
        a shielded scope with the correct implementation.
        r   T)Zshieldr
   N)r   r   r   ZCancelScope_trio_shieldr   _anyio_shieldr   r   r   r   r      s
    

z AsyncShieldCancellation.__init__c                 C  s.   | j dkr| j  n| j dkr*| j  | S r#   )r   rP   r7   rQ   r   r   r   r   r7      s
    


z!AsyncShieldCancellation.__enter__Nr&   r'   r(   r)   c                 C  s:   | j dkr| j||| n| j dkr6| j||| d S r#   )r   rP   r8   rQ   r.   r   r   r   r8      s    

z AsyncShieldCancellation.__exit__)NNN)r0   r1   r2   r   r7   r8   r   r   r   r   rO      s   	   rO   c                   @  sB   e Zd ZdZddddZd dddZdd	d
dddddZdS )r   r   r   r   c                 C  s   t  | _d S r6   	threadingr   _lockr   r   r   r   r      s    zLock.__init__c                 C  s   | j   | S r6   rT   r$   r   r   r   r   r7      s    
zLock.__enter__Nr&   r'   r(   r)   c                 C  s   | j   d S r6   rT   r-   r.   r   r   r   r8      s    zLock.__exit__)NNNr0   r1   r2   r3   r   r7   r8   r   r   r   r   r      s      r   c                   @  sB   e Zd ZdZddddZd dddZdd	d
dddddZdS )
ThreadLockr5   r   r   c                 C  s   t  | _d S r6   rR   r   r   r   r   r     s    zThreadLock.__init__c                 C  s   | j   | S r6   rU   r   r   r   r   r7     s    
zThreadLock.__enter__Nr&   r'   r(   r)   c                 C  s   | j   d S r6   rV   r.   r   r   r   r8     s    zThreadLock.__exit__)NNNrW   r   r   r   r   rX      s      rX   c                   @  s:   e Zd ZddddZddddZdddd	d
dZdS )r:   r   r   c                 C  s   t  | _d S r6   )rS   r:   _eventr   r   r   r   r     s    zEvent.__init__c                 C  s   | j   d S r6   )rY   r=   r   r   r   r   r=     s    z	Event.setNr>   r?   c                 C  s(   |t dkrd }| jj|ds$t d S )NrA   )r@   )rB   rY   rC   r   )r   r@   r   r   r   rC     s    z
Event.wait)N)r0   r1   r2   r   r=   rC   r   r   r   r   r:     s   r:   c                   @  s8   e Zd ZdddddZddddZddd	d
ZdS )rL   rF   r   rG   c                 C  s   t j|d| _d S )N)value)rS   rL   
_semaphorerJ   r   r   r   r   '  s    zSemaphore.__init__r   c                 C  s   | j   d S r6   )r[   r$   r   r   r   r   r$   *  s    zSemaphore.acquirec                 C  s   | j   d S r6   )r[   r-   r   r   r   r   r-   -  s    zSemaphore.releaseN)r0   r1   r2   r   r$   r-   r   r   r   r   rL   &  s   rL   c                   @  s0   e Zd Zd dddZdddddd	d
dZdS )ShieldCancellationr   c                 C  s   | S r6   r   r   r   r   r   r7   5  s    zShieldCancellation.__enter__Nr&   r'   r(   r   r)   c                 C  s   d S r6   r   r.   r   r   r   r8   8  s    zShieldCancellation.__exit__)NNN)r0   r1   r2   r7   r8   r   r   r   r   r\   1  s
      r\   )
__future__r   rS   types_exceptionsr   r   r   r   r   NotImplementedErrorr   r   r   r4   r9   rE   rO   r   rX   r:   rL   r\   r   r   r   r   <module>   s,   

-)$*