o
    i                     @   s   d dl Z d dlZd dlmZmZ d dlZddlmZ G dd deZde	dB fdd	Z
G d
d deZG dd deZG dd deZdefddZdefddZdefddZdS )    N)ABCabstractmethod   )loggerc                   @   s6   e Zd ZedefddZed	dedefddZdS )

CPUMonitorreturnc                 C      dS )zgNumber of logical CPUs.

        Returns a float to allow for fractional CPUs (in the case of cgroups).N selfr	   r	   ]/var/www/html/livekit_bhavya/venv/lib/python3.10/site-packages/livekit/agents/utils/hw/cpu.py	cpu_count   s   zCPUMonitor.cpu_count      ?intervalc                 C   r   )z$CPU usage percentage between 0 and 1Nr	   r   r   r	   r	   r   cpu_percent   s   zCPUMonitor.cpu_percentNr   )__name__
__module____qualname__r   floatr   r   r	   r	   r	   r   r   
   s
    r   r   c                   C   sD   zdt jv rtt jd W S W d S  ty!   tjddd Y d S w )NNUM_CPUSz)Failed to parse NUM_CPUS from environmentT)exc_info)osenvironr   
ValueErrorr   warningr	   r	   r	   r   _cpu_count_from_env   s   
r   c                   @   s.   e Zd ZdefddZd	dedefddZdS )
DefaultCPUMonitorr   c                 C   s   t  pt pdS )N      ?)r   psutilr   r
   r	   r	   r   r   "   s   zDefaultCPUMonitor.cpu_countr   r   c                 C   s   t |d S )Ng      Y@)r    r   r   r	   r	   r   r   %   s   zDefaultCPUMonitor.cpu_percentNr   )r   r   r   r   r   r   r	   r	   r	   r   r   !   s    r   c                   @   sR   e Zd ZdefddZddedefddZdeeef fdd	Z	defd
dZ
dS )CGroupV2CPUMonitorr   c                 C   sB   t  }|d ur	|S |  \}}|dkrt pdS dt| | S )Nmaxr   )r   _read_cpu_maxr    r   intr   env_cpusquotaperiodr	   r	   r   r   *   s   zCGroupV2CPUMonitor.cpu_countr   r   c                 C   sH   |   }t| |   }|| }|d }|  }|||  }t|dS )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_percentr	   r	   r   r   7   s   

zCGroupV2CPUMonitor.cpu_percentc              
   C   s   z3t d}|   }W d    n1 sw   Y  |d }t|dkr-t|d nd}W ||fS  tttfyF   d}d}Y ||fS w )Nz/sys/fs/cgroup/cpu.maxr   r)   i r"   )	openreadstripsplitlenr$   FileNotFoundError
IndexErrorr   )r   fdatar'   r(   r	   r	   r   r#   E   s   
z CGroupV2CPUMonitor._read_cpu_maxc                 C   sl   t d&}|D ]}|drt| d   W  d    S qW d    td1 s-w   Y  td)N/sys/fs/cgroup/cpu.stat
usage_usecr)   zFailed to read CPU usage)r4   
startswithr$   r7   RuntimeError)r   r;   liner	   r	   r   r*   P   s   


z"CGroupV2CPUMonitor._read_cpu_usageNr   )r   r   r   r   r   r   tuplestrr$   r#   r*   r	   r	   r	   r   r!   )   s
    r!   c                   @   st   e Zd ZdefddZddedefddZdeedB edB f fd	d
ZdefddZ	de
e dedB fddZdS )CGroupV1CPUMonitorr   c                 C   sT   t  }|d ur	|S |  \}}|d u s|dk s|d u s|dkr!dS td| | dS )Nr   g       @r   )r   _read_cfs_quota_and_periodr"   r%   r	   r	   r   r   Y   s    zCGroupV1CPUMonitor.cpu_countr   r   c                 C   sN   |   }t| |   }|| }|d }|  }|||  }tt|ddS )Ni ʚ;r   g        )_read_cpuacct_usager+   r,   r   r"   r-   )r   r   usage_start	usage_endusage_diff_nsusage_secondsr2   percentr	   r	   r   r   f   s   
zCGroupV1CPUMonitor.cpu_percentNc                 C   s(   dg}dg}|  |}|  |}||fS )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_candidatesr'   r(   r	   r	   r   rE   q   s   

z-CGroupV1CPUMonitor._read_cfs_quota_and_periodc                 C   s$   dg}|  |}|d u rtd|S )N$/sys/fs/cgroup/cpuacct/cpuacct.usagez*Failed to read cpuacct.usage for cgroup v1)rN   r@   )r   
candidatesvaluer	   r	   r   rF   |   s   
z&CGroupV1CPUMonitor._read_cpuacct_usagepathsc              	   C   sr   |D ]4}z!t |}t|  W  d    W   S 1 sw   Y  W q ty.   Y q ty6   Y qw d S N)r4   r$   r5   r6   r9   r   )r   rT   pr;   r	   r	   r   rN      s   
*z"CGroupV1CPUMonitor._read_first_intr   )r   r   r   r   r   r   rB   r$   rE   rF   listrC   rN   r	   r	   r	   r   rD   X   s    	rD   c                   C   s   t  rt S t rt S t S rU   )_is_cgroup_v2r!   _is_cgroup_v1rD   r   r	   r	   r	   r   get_cpu_monitor   s
   rZ   c                   C   s   t jdS )Nr=   r   pathexistsr	   r	   r	   r   rX      s   rX   c                  C   s   g d} t dd | D S )N)rL   rM   rQ   c                 s   s    | ]	}t j|V  qd S rU   r[   ).0rV   r	   r	   r   	<genexpr>   s    z _is_cgroup_v1.<locals>.<genexpr>)any)rR   r	   r	   r   rY      s   rY   )r   r+   abcr   r   r    logr   r   r   r   r   r!   rD   rZ   boolrX   rY   r	   r	   r	   r   <module>   s    	/9