U
    yhM                     @   s2   d dl Z d dlmZmZ d dlZG dd dZdS )    N)DequeOptionalc                   @   s^   e Zd ZdZddddZejjddddZe	ejj dd	d
Z
e	ejj d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.
    N)returnc                 C   s   t  | _d| _d S )N   )collectionsdeque_queue_max_num_inflight_all_gathersself r   W/var/www/html/venv/lib/python3.8/site-packages/torch/distributed/fsdp/_limiter_utils.py__init__   s    
z_FreeEventQueue.__init__)
free_eventr   c                 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)__name__
__module____qualname____doc__r   torchcudaEventr   r   r   r   r   r   r   r   r      s
   r   )r   typingr   r   r   r   r   r   r   r   <module>   s   