o
    ˜»áfË  ã                   @   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© )ÚwinregÚQueryInfoKeyÚHKEY_PERFORMANCE_DATAÚ_valuesÚ_loadÚ_overlappedÚCreateEventÚ_runningÚ_stoppedÚ_threadÚstart_new_threadÚ_update_load©Úselfr   r   ú1/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é   Ú4xLLÚLL28xLé,   g      ð?)r   ÚLOAD_FACTOR_1Úlenr
   ÚNVALUEÚappendÚsum)r   Ú_queryÚ_hkeyÚ_unpackÚdataÚ_Ú	obj_startÚ
data_startÚ
defn_startÚ	data_baseÚ	defn_baseÚsizeÚidxÚoffsetÚcounter_offsetÚ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   r5   l   s   



øzWindowsLoadTracker.__del__c                 C   s   | j S r4   )r   r   r   r   r   Ú
getloadavg{   s   zWindowsLoadTracker.getloadavgN)T)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú_winapiÚWaitForSingleObjectr   ÚSetEventr   r   ÚQueryValueExr	   ÚstructÚunpack_fromr   r7   ÚCloseHandler5   r:   r   r   r   r   r      s     
ý
ü
8
ür   )r   r   r?   ÚmathrC   r   ÚSAMPLING_INTERVALÚexpr    r"   r   r   r   r   r   Ú<module>   s    