
    /j                         S SK r S SKrS SKJrJr  S SKrSSKJr   " S S\5      rS\	S-  4S jr
 " S	 S
\5      r " S S\5      r " S S\5      rS\4S jrS\4S jrS\4S jrg)    N)ABCabstractmethod   )loggerc                   L    \ rS rSr\S\4S j5       r\SS\S\4S jj5       rSrg)	
CPUMonitor
   returnc                     g)z_Number of logical CPUs.

Returns a float to allow for fractional CPUs (in the case of cgroups).N selfs    L/app/agent/.venv/lib/python3.13/site-packages/livekit/agents/utils/hw/cpu.py	cpu_countCPUMonitor.cpu_count   s    
 	    intervalc                     g)z$CPU usage percentage between 0 and 1Nr   r   r   s     r   cpu_percentCPUMonitor.cpu_percent   s     	r   r   Ng      ?)	__name__
__module____qualname____firstlineno__r   floatr   r   __static_attributes__r   r   r   r   r   
   s=    5   E E  r   r   r
   c                       S[         R                  ;   a  [        [         R                  S   5      $  g ! [         a    [        R
                  " SSS9   g f = f)NNUM_CPUSz)Failed to parse NUM_CPUS from environmentT)exc_info)osenvironr   
ValueErrorr   warningr   r   r   _cpu_count_from_envr&      sW    S#J/00 $   SBTRSs   /4 AAc                   8    \ rS rSrS\4S jrSS\S\4S jjrSrg)	DefaultCPUMonitor!   r
   c                 `    [        5       =(       d    [        R                  " 5       =(       d    S$ )N      ?)r&   psutilr   r   s    r   r   DefaultCPUMonitor.cpu_count"   s    "$A(8(8(:AcAr   r   c                 4    [         R                  " U5      S-  $ )Ng      Y@)r,   r   r   s     r   r   DefaultCPUMonitor.cpu_percent%   s    !!(+e33r   r   Nr   )r   r   r   r   r   r   r   r   r   r   r   r(   r(   !   s(    B5 B4E 4E 4 4r   r(   c                   ^    \ rS rSrS\4S jrS
S\S\4S jjrS\\\	4   4S jr
S\	4S jrSrg	)CGroupV2CPUMonitor)   r
   c                     [        5       nUb  U$ U R                  5       u  p#US:X  a  [        R                  " 5       =(       d    S$ S[	        U5      -  U-  $ )Nmaxr+   )r&   _read_cpu_maxr,   r   intr   env_cpusquotaperiods       r   r   CGroupV2CPUMonitor.cpu_count*   sV    
 '(O**,E>##%,,SZ&((r   r   c                     U R                  5       n[        R                  " U5        U R                  5       nX2-
  nUS-  nU R                  5       nXQU-  -  n[	        US5      $ )Ni@B    )_read_cpu_usagetimesleepr   min)r   r   cpu_usage_startcpu_usage_endcpu_usage_diffcpu_usage_secondsnum_cpuscpu_usage_percents           r   r   CGroupV2CPUMonitor.cpu_percent7   sg    ..0

8,,.&8 +Y6>>#-H1DE$a((r   c                 6    [        S5       nUR                  5       R                  5       R                  5       nS S S 5        WS   n[	        U5      S:  a  [        US   5      OSnX44$ ! , (       d  f       N5= f! [        [        [        4 a	    SnSn X44$ f = f)Nz/sys/fs/cgroup/cpu.maxr   r=   i r4   )	openreadstripsplitlenr6   FileNotFoundError
IndexErrorr$   )r   fdatar9   r:   s        r   r5    CGroupV2CPUMonitor._read_cpu_maxE   s    	./1vvx~~'--/ 0GE%(Y]Sa\F } 0/ ":z: 	EF}	s'   A: -A),A: )
A73A: :BBc                     [        S5       nU H@  nUR                  S5      (       d  M  [        UR                  5       S   5      s  sS S S 5        $    S S S 5        [	        S5      e! , (       d  f       N= f)N/sys/fs/cgroup/cpu.stat
usage_usecr=   zFailed to read CPU usage)rJ   
startswithr6   rM   RuntimeError)r   rQ   lines      r   r>   "CGroupV2CPUMonitor._read_cpu_usageP   s]    +,??<00tzz|A// -, - 566	 -,s   A&A&A&&
A4r   Nr   )r   r   r   r   r   r   r   tuplestrr6   r5   r>   r   r   r   r   r1   r1   )   sA    )5 ))E )E )	uS#X 	7 7r   r1   c                       \ rS rSrS\4S jrSS\S\4S jjrS\\S-  \S-  4   4S jr	S\4S jr
S	\\   S\S-  4S
 jrSrg)CGroupV1CPUMonitorX   r
   c                     [        5       nUb  U$ U R                  5       u  p#Ub  US:  d	  Ub  US::  a  g[        SU-  U-  S5      $ )Nr   g       @r+   )r&   _read_cfs_quota_and_periodr4   r7   s       r   r   CGroupV1CPUMonitor.cpu_countY   sW     '(O779=EAI6Q; 3;'--r   r   c                     U R                  5       n[        R                  " U5        U R                  5       nX2-
  nUS-  nU R                  5       nXQU-  -  n[	        [        US5      S5      $ )Ni ʚ;r+   g        )_read_cpuacct_usager?   r@   r   r4   rA   )r   r   usage_start	usage_endusage_diff_nsusage_secondsrF   percents           r   r   CGroupV1CPUMonitor.cpu_percentf   si    ..0

8,,.	!/%5>>#h#673w$c**r   Nc                 X    S/nS/nU R                  U5      nU R                  U5      nX44$ )N#/sys/fs/cgroup/cpu/cpu.cfs_quota_us$/sys/fs/cgroup/cpu/cpu.cfs_period_us)_read_first_int)r   quota_path_candidatesperiod_path_candidatesr9   r:   s        r   ra   -CGroupV1CPUMonitor._read_cfs_quota_and_periodq   sF    1!
 3"
 $$%:;%%&<=}r   c                 J    S/nU R                  U5      nUc  [        S5      eU$ )N$/sys/fs/cgroup/cpuacct/cpuacct.usagez*Failed to read cpuacct.usage for cgroup v1)rn   rX   )r   
candidatesvalues      r   rd   &CGroupV1CPUMonitor._read_cpuacct_usage|   s4    2

 $$Z0=KLLr   pathsc                     U H@  n [        U5       n[        UR                  5       R                  5       5      sS S S 5        s  $    g ! , (       d  f       MT  = f! [         a     Md  [
         a     Mp  f = fN)rJ   r6   rK   rL   rO   r$   )r   rw   prQ   s       r   rn   "CGroupV1CPUMonitor._read_first_int   s_    A!Wqvvx~~/0 W   W$  s3   A'A	A
A	AA
A4'	A43A4r   r   )r   r   r   r   r   r   r   r[   r6   ra   rd   listr\   rn   r   r   r   r   r^   r^   X   sf    .5 .	+E 	+E 	+	E#*cDj2H,I 	S 	T#Y 	3: 	r   r^   c                  z    [        5       (       a
  [        5       $ [        5       (       a
  [        5       $ [	        5       $ ry   )_is_cgroup_v2r1   _is_cgroup_v1r^   r(   r   r   r   get_cpu_monitorr      s+    !##!##r   c                  @    [         R                  R                  S5      $ )NrU   r"   pathexistsr   r   r   r~   r~      s    77>>344r   c                  .    / SQn [        S U  5       5      $ )N)rl   rm   rs   c              3   `   #    U  H$  n[         R                  R                  U5      v   M&     g 7fry   r   ).0rz   s     r   	<genexpr> _is_cgroup_v1.<locals>.<genexpr>   s      5*Qrww~~a  *s   ,.)any)rt   s    r   r   r      s    J
 5*555r   )r"   r?   abcr   r   r,   logr   r   r   r&   r(   r1   r^   r   boolr~   r   r   r   r   <module>r      sz    	  #   UT\ 4
 4,7 ,7^6 6r 5t 56t 6r   