Ë
    üÇ:j*  ã                  óŒ   — d Z ddlmZ ddlZddlZddlZddlmZmZ 	 ddl	Z	dZ
e
Zdd„Zdd„Z G d	„ d
«      Zy# e$ r dZ
Y Œw xY w)a  
Memory monitoring utilities for measuring memory usage.

Example usage:
    tracker = MemoryTracker("my_function")
    with tracker.monitor():
        my_function()
    # Access data: tracker.rss_delta, tracker.duration, etc.
    # Get formatted string: tracker.get_summary()
é    )ÚannotationsN)ÚDictÚOptionalTFc                 óp   — t         r!	 t        j                  «       } | j                  S y# t        $ r Y yw xY w)zÐ
    Get current available system memory in bytes.

    Used for memory threshold checking in parallel test execution.

    Returns:
        int or None: Available memory in bytes, or None if unavailable
    N)Ú_HAS_PSUTILÚpsutilÚvirtual_memoryÚ	availableÚ	Exception)Úsys_mems    úk/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/numba/misc/memoryutils.pyÚget_available_memoryr      sB   € õ ð	Ü×+Ñ+Ó-ˆGØ×$Ñ$Ð$ð øô ò 	Øàð	ús   ˆ) ©	5´5c                 ó`  — i } t         rj	 t        j                  t        j                  «       «      }|j                  «       }|j                  | d<   t        j                  «       }|j                  | d<   d| vrd| d<   d| vrd| d<   | S # t        j                  t        j                  f$ r Y Œ9w xY w)a^  
    Get memory usage information needed for monitoring.

    Returns only RSS and available memory which are the fields
    actually used by the MemoryTracker.

    Returns:
        dict: Memory usage information including:
            - rss: Current process RSS (physical memory currently used)
            - available: Available system memory
    Úrssr
   N)r   r   ÚProcessÚosÚgetpidÚmemory_infor   r	   r
   ÚNoSuchProcessÚAccessDenied)r   ÚprocessÚmem_infor   s       r   Úget_memory_usager   /   s²   € ð €Kåð	ä—n‘n¤R§Y¡Y£[Ó1ˆGØ×*Ñ*Ó,ˆHØ!)§¡ˆK˜Ñô ×+Ñ+Ó-ˆGØ'.×'8Ñ'8ˆK˜Ñ$ð �KÑØ!ˆ�EÑØ˜+Ñ%Ø#'ˆ�KÑ àÐøô ×$Ñ$¤f×&9Ñ&9Ð:ò 	Ùð	ús   ŠA)B Â#B-Â,B-c                  ó–   — e Zd ZU dZded<   ded<   ded<   ded<   d	ed
<   d	ed<   ded<   ded<   dd„Zej                  d„ «       Zdd„Z	y)ÚMemoryTrackerzÏ
    A simple memory monitor that tracks RSS delta and timing.

    Stores monitoring data in instance attributes for later access.
    Each instance is typically used for monitoring a single operation.
    ÚintÚpidÚstrÚnamezfloat | NoneÚ
start_timeÚend_timezDict[str, int | None] | NoneÚstart_memoryÚ
end_memoryÚdurationz
int | NoneÚ	rss_deltac                ó˜   — t        j                  «       | _        || _        d| _        d| _        d| _        d| _        d| _        d| _	        y)z6Initialize a MemoryTracker with empty monitoring data.N)
r   r   r   r   r    r!   r"   r#   r$   r%   )Úselfr   s     r   Ú__init__zMemoryTracker.__init__d   sA   € ä—9‘9“;ˆŒØˆŒ	ØˆŒØˆŒØ ˆÔØˆŒØˆŒØˆ�ó    c              #  óÀ  K  — t        j                   «       | _        t        «       | _        	 | –— t        j                   «       | _        t        «       | _        | j                  | j                  z
  | _        | j                  j                  dd«      }| j
                  j                  dd«      }|r|r||z
  | _        yd| _        y# t        j                   «       | _        t        «       | _        | j                  | j                  z
  | _        | j                  j                  dd«      }| j
                  j                  dd«      }|r|r||z
  | _        w d| _        w xY w­w)a§  
        Context manager to monitor memory usage during function execution.

        Records start/end memory usage and timing, calculates RSS delta,
        and stores all data in instance attributes.

        Args:
            name (str): Name/identifier for the function or operation being
                        monitored

        Yields:
            self: The MemoryTracker instance for accessing stored data
        r   r   N)	Útimer    r   r"   r!   r#   r$   Úgetr%   )r'   Ú	start_rssÚend_rsss      r   ÚmonitorzMemoryTracker.monitoro   s  è ø€ ô  Ÿ)™)›+ˆŒÜ,Ó.ˆÔð	?ØŠJô !ŸI™I›KˆDŒMÜ.Ó0ˆDŒOØ ŸM™M¨D¯O©OÑ;ˆDŒMð ×)Ñ)×-Ñ-¨e°QÓ7ˆIØ—o‘o×)Ñ)¨%°Ó3ˆGá!*©wð  '¨Ñ2ˆD�NØ<=ð �Nøô !ŸI™I›KˆDŒMÜ.Ó0ˆDŒOØ ŸM™M¨D¯O©OÑ;ˆDŒMð ×)Ñ)×-Ñ-¨e°QÓ7ˆIØ—o‘o×)Ñ)¨%°Ó3ˆGá!*©wð  '¨Ñ2ˆD�NØ<=ð �Nüs   ‚)E¬C °BEÃBEÅEc                óJ  — | j                   �| j                  €t        d«      ‚| j                  j                  d«      }dd„}t	        j
                  dt	        j                  | j                  «      «      }| j                   j                  dd«      }| j                  j                  dd«      }d| j                  › �d| j                  › �d	|› �d
| j                  d›d�d ||«      › �d ||«      › �d || j                  d¬«      › �d ||«      › �g}dj                  |«      S )aÄ  
        Return a formatted summary of the memory monitoring data.

        Formats the stored monitoring data into a human-readable string
        containing name, PID, RSS delta, available memory, duration,
        and start time.

        Returns:
            str: Formatted summary string with monitoring results

        Note:
            Should be called after monitor() context has completed
            to ensure all data is available.
        z$Memory monitoring data not availabler
   c                óŽ   — | €y| dk(  ryd}|r	| dk  rdnd}t        | «      } dD ]  }| dk  r|› | d	›d
|› �c S | dz  } Œ |› | d	›d�S )z&Convert bytes to human readable formatzN/Ar   z0 BÚ ú-ú+)ÚBÚKBÚMBÚGBg      �@z.2fú z TB)Úabs)Ú	bytes_valÚ	show_signÚsignÚunits       r   Úformat_bytesz/MemoryTracker.get_summary.<locals>.format_bytes¤   s€   € àÐ ØØ˜AŠ~ØàˆDÙØ'¨!šm‘s°�Ü˜I›ˆIà/ò $�Ø˜vÒ%Ø"˜V I¨c ?°!°D°6Ð:Ò:Ø˜VÑ#‘	ð$ð �V˜I c˜?¨#Ð.Ð.r)   z%H:%M:%Sr   r   zName: zPID: zStart: z
Duration: z.3fÚszStart RSS: z	End RSS: zRSS delta: T)r<   zAvail memory: z | )F)r"   r#   Ú
ValueErrorr,   r+   ÚstrftimeÚ	localtimer    r   r   r$   r%   Újoin)r'   Úcurrent_availabler?   Ústart_tsr-   r.   Úbufs          r   Úget_summaryzMemoryTracker.get_summary�   s%  € ð ×ÑÐ$¨¯©Ð(?ÜÐCÓDÐDà ŸO™O×/Ñ/°Ó<Ðó	/ô$ —=‘= ¬T¯^©^¸D¿O¹OÓ-LÓMˆØ×%Ñ%×)Ñ)¨%°Ó3ˆ	Ø—/‘/×%Ñ% e¨QÓ/ˆð �T—Y‘Y�KÐ Ø�D—H‘H�:ÐØ�h�ZÐ Ø˜Ÿ™ sÐ+¨1Ð-Ø™, yÓ1Ð2Ð3Ø™ WÓ-Ð.Ð/Ø™, t§~¡~ÀÔFÐGÐHØ™\Ð*;Ó<Ð=Ð>ð	
ˆð �z‰z˜#‹Ðr)   N)r   r   )Úreturnr   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r(   Ú
contextlibÚcontextmanagerr/   rH   © r)   r   r   r   T   s\   … ñð 
ƒHØ
ƒIØÓØÓØ.Ó.Ø,Ó,ØÓØÓó	ð ×Ññ?ó ð?ô@4r)   r   )rI   zOptional[int])rI   zDict[str, Optional[int]])rM   Ú
__future__r   r   rO   r+   Útypingr   r   r   r   ÚImportErrorÚIS_SUPPORTEDr   r   r   rQ   r)   r   ú<module>rV      s]   ðñ	õ #Û 	Û Û ß !ðÛØ€Kð
 €óó&"÷Jpò pøð ò Ø‚Kðús   ž9 ¹AÁA