
    sg9                     8    d dl Z d dlmZmZ d dlZ G d d      Zy)    N)DequeOptionalc                       e Zd ZdZd	dZdej                  ddfdZdeej                     fdZ	deej                     fdZ
y)
_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                 D    t        j                         | _        d| _        y )N   )collectionsdeque_queue_max_num_inflight_all_gathersselfs    X/var/www/html/venv/lib/python3.12/site-packages/torch/distributed/fsdp/_limiter_utils.py__init__z_FreeEventQueue.__init__   s    *5*;*;*=-.*    
free_eventc                 :    | j                   j                  |       y)zEnqueues a free event.N)r   append)r   r   s     r   enqueuez_FreeEventQueue.enqueue   s    :&r   c                 h    t        | j                        | j                  k\  r| j                         S y)z0Dequeues a single event if the limit is reached.N)lenr   r   _dequeuer   s    r   dequeue_if_neededz!_FreeEventQueue.dequeue_if_needed   s(    t{{tAAA==?"r   c                 T    | j                   r| j                   j                         }|S y)z"Dequeues a free event if possible.N)r   popleft)r   events     r   r   z_FreeEventQueue._dequeue   s#    ;;KK'')ELr   )r   N)__name__
__module____qualname____doc__r   torchEventr   r   r   r    r   r   r   r      sM    /'%++ '$ '8EKK#8 (5;;/ r   r   )r
   typingr   r   r"   r   r$   r   r   <module>r&      s     "  r   