o
    JXîhË  ã                   @   s\   d dl Z d dlZd dlZd dlZd dlZd dlZdZde ed ¡ ZdZ	G dd„ dƒZ
dS )é    Né   é<   é   c                   @   sh   e Zd ZdZdd„ Zejejfdd„Z	e
je
jejfdd„Zdd	d
„Zejejejfdd„Zdd„ ZdS )ÚWindowsLoadTrackerzÞ
    This class asynchronously reads the performance counters to calculate
    the system load on Windows.  A "raw" thread is used here to prevent
    interference with the test suite's cases for the threading module.
    c                 C   sP   t  t j¡ g | _d | _t d ddd ¡| _t d ddd ¡| _t	 
| jdi ¡ d S )NTF© )ÚwinregZQueryInfoKeyÚHKEY_PERFORMANCE_DATAÚ_valuesÚ_loadÚ_overlappedZCreateEventÚ_runningÚ_stoppedÚ_threadÚstart_new_threadÚ_update_load©Úselfr   r   úD/opt/python-3.10.19/usr/lib/python3.10/test/libregrtest/win_utils.pyÚ__init__   s   zWindowsLoadTracker.__init__c                 C   s.   || j dƒr|  ¡  || j dƒs|| jƒ d S )Niè  )r   Ú_calculate_loadr   )r   Ú_waitÚ_signalr   r   r   r   &   s   ÿzWindowsLoadTracker._update_loadc                 C   sè   ||dƒ\}}|d|dƒ\}|d||ƒ\}}|| }	|| }
|
|	k rC|d||
ƒ\}}}|
|7 }
|dkr?|	| }|d||ƒ\}n|
|	k s"d S | j d urX| j t |dt   | _ d S t| jƒtk rg| j |¡ d S t| jƒt| jƒ | _ d S )NÚ2ÚLé   Z4xLLZLL28xLé,   g      ð?)r
   ÚLOAD_FACTOR_1Úlenr	   ÚNVALUEÚappendÚsum)r   Z_queryZ_hkeyZ_unpackÚdataÚ_Z	obj_startZ
data_startZ
defn_startZ	data_baseZ	defn_baseÚsizeÚidxÚoffsetZcounter_offsetZprocessor_queue_lengthr   r   r   r   0   s*   
ó


ÿz"WindowsLoadTracker._calculate_loadTc                 C   s   |   ¡  d S ©N)Ú__del__)r   Úkillr   r   r   Úcloseh   s   zWindowsLoadTracker.closec                 C   sH   | j d ur"|| j ƒ || jdƒ || j ƒ || jƒ d  | _ | _d S d S )Néÿÿÿÿ)r   r   )r   r   Ú_closer   r   r   r   r'   l   s   



øzWindowsLoadTracker.__del__c                 C   s   | j S r&   )r
   r   r   r   r   Ú
getloadavg{   s   zWindowsLoadTracker.getloadavgN)T)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú_winapiZWaitForSingleObjectr   ZSetEventr   r   ZQueryValueExr   ÚstructÚunpack_fromr   r)   ZCloseHandler'   r,   r   r   r   r   r      s     
ý
ü
8
ür   )r   r   r1   Úmathr2   r   ZSAMPLING_INTERVALÚexpr   r   r   r   r   r   r   Ú<module>   s    