@@ -33,96 +33,27 @@ def __init__(self):
3333 winreg .QueryInfoKey (winreg .HKEY_PERFORMANCE_DATA )
3434
3535 self ._values = []
36- self ._load = None
37- self ._running = _overlapped .CreateEvent (None , True , False , None )
38- self ._stopped = _overlapped .CreateEvent (None , True , False , None )
3936
4037 _thread .start_new_thread (self ._update_load , (), {})
4138
4239 def _update_load (self ,
4340 # localize module access to prevent shutdown errors
44- _wait = _winapi .WaitForSingleObject ,
45- _signal = _overlapped .SetEvent ):
46- # run until signaled to stop
47- while _wait (self ._running , 1000 ):
48- self ._calculate_load ()
49- # notify stopped
50- _signal (self ._stopped )
41+ _wait , _signal ):
42+ pass
5143
5244 def _calculate_load (self ,
5345 # localize module access to prevent shutdown errors
5446 _query = winreg .QueryValueEx ,
5547 _hkey = winreg .HKEY_PERFORMANCE_DATA ,
5648 _unpack = struct .unpack_from ):
57- # get the 'System' object
58- data , _ = _query (_hkey , '2' )
59- # PERF_DATA_BLOCK {
60- # WCHAR Signature[4] 8 +
61- # DWOWD LittleEndian 4 +
62- # DWORD Version 4 +
63- # DWORD Revision 4 +
64- # DWORD TotalByteLength 4 +
65- # DWORD HeaderLength = 24 byte offset
66- # ...
67- # }
68- obj_start , = _unpack ('L' , data , 24 )
69- # PERF_OBJECT_TYPE {
70- # DWORD TotalByteLength
71- # DWORD DefinitionLength
72- # DWORD HeaderLength
73- # ...
74- # }
75- data_start , defn_start = _unpack ('4xLL' , data , obj_start )
76- data_base = obj_start + data_start
77- defn_base = obj_start + defn_start
78- # find the 'Processor Queue Length' counter (index=44)
79- while defn_base < data_base :
80- # PERF_COUNTER_DEFINITION {
81- # DWORD ByteLength
82- # DWORD CounterNameTitleIndex
83- # ... [7 DWORDs/28 bytes]
84- # DWORD CounterOffset
85- # }
86- size , idx , offset = _unpack ('LL28xL' , data , defn_base )
87- defn_base += size
88- if idx == 44 :
89- counter_offset = data_base + offset
90- # the counter is known to be PERF_COUNTER_RAWCOUNT (DWORD)
91- processor_queue_length , = _unpack ('L' , data , counter_offset )
92- break
93- else :
94- return
95-
96- # We use an exponentially weighted moving average, imitating the
97- # load calculation on Unix systems.
98- # https://en.wikipedia.org/wiki/Load_(computing)#Unix-style_load_calculation
99- # https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average
100- if self ._load is not None :
101- self ._load = (self ._load * LOAD_FACTOR_1
102- + processor_queue_length * (1.0 - LOAD_FACTOR_1 ))
103- elif len (self ._values ) < NVALUE :
104- self ._values .append (processor_queue_length )
105- else :
106- self ._load = sum (self ._values ) / len (self ._values )
49+ pass
10750
10851 def close (self , kill = True ):
10952 self .__del__ ()
11053 return
11154
112- def __del__ (self ,
113- # localize module access to prevent shutdown errors
114- _wait = _winapi .WaitForSingleObject ,
115- _close = _winapi .CloseHandle ,
116- _signal = _overlapped .SetEvent ):
117- if self ._running is not None :
118- # tell the update thread to quit
119- _signal (self ._running )
120- # wait for the update thread to signal done
121- _wait (self ._stopped , - 1 )
122- # cleanup events
123- _close (self ._running )
124- _close (self ._stopped )
125- self ._running = self ._stopped = None
55+ def __del__ (self , _wait , _close , _signal ):
56+ pass
12657
12758 def getloadavg (self ):
128- return self . _load
59+ return None
0 commit comments