o
    ‡ZŽh>  ã                   @   s.   d dl Z d dlmZ d dlZG dd„ dƒZdS )é    N)ÚOptionalc                   @   sV   e Zd ZdZddd„Zdejddfdd„Zdeej fd	d
„Z	deej fdd„Z
dS )Ú_FreeEventQueuezâ
    This tracks all pending frees corresponding to inflight all-gathers. The
    queueing pattern is iterative enqueues with a single dequeue per iteration
    once the limit ``_max_num_inflight_all_gathers`` is reached.
    ÚreturnNc                 C   s   t  ¡ | _d| _d S )Né   )ÚcollectionsÚdequeÚ_queueÚ_max_num_inflight_all_gathers©Úself© r   úT/var/www/auris/lib/python3.10/site-packages/torch/distributed/fsdp/_limiter_utils.pyÚ__init__   s   

z_FreeEventQueue.__init__Ú
free_eventc                 C   s   | j  |¡ dS )zEnqueues a free event.N)r   Úappend)r   r   r   r   r   Úenqueue   s   z_FreeEventQueue.enqueuec                 C   s   t | jƒ| jkr|  ¡ S dS )z0Dequeues a single event if the limit is reached.N)Úlenr   r	   Ú_dequeuer
   r   r   r   Údequeue_if_needed   s   z!_FreeEventQueue.dequeue_if_neededc                 C   s   | j r
| j  ¡ }|S dS )z"Dequeues a free event if possible.N)r   Úpopleft)r   Úeventr   r   r   r      s   
z_FreeEventQueue._dequeue)r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚtorchÚEventr   r   r   r   r   r   r   r   r      s    
r   )r   Útypingr   r   r   r   r   r   r   Ú<module>   s    