1# Copyright (c) 2009, Giampaolo Rodola". All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5from __future__ import annotations
6
7import warnings
8from collections import namedtuple
9from typing import TYPE_CHECKING
10from typing import NamedTuple
11
12if TYPE_CHECKING:
13 import socket
14
15 from ._enums import BatteryTime
16 from ._enums import ConnectionStatus
17 from ._enums import NicDuplex
18 from ._enums import ProcessIOPriority
19
20from ._common import AIX
21from ._common import BSD
22from ._common import FREEBSD
23from ._common import LINUX
24from ._common import MACOS
25from ._common import NETBSD
26from ._common import OPENBSD
27from ._common import SUNOS
28from ._common import WINDOWS
29
30# ===================================================================
31# --- system functions
32# ===================================================================
33
34
35# psutil.swap_memory()
36class sswap(NamedTuple):
37 total: int
38 used: int
39 free: int
40 percent: float
41 sin: int
42 sout: int
43
44
45# psutil.disk_usage()
46class sdiskusage(NamedTuple):
47 total: int
48 used: int
49 free: int
50 percent: float
51
52
53# psutil.disk_io_counters()
54class sdiskio(NamedTuple):
55 read_count: int
56 write_count: int
57 read_bytes: int
58 write_bytes: int
59 if not (NETBSD or OPENBSD):
60 read_time: int
61 write_time: int
62 if LINUX:
63 read_merged_count: int
64 write_merged_count: int
65 busy_time: int
66 if FREEBSD:
67 busy_time: int
68
69
70# psutil.disk_partitions()
71class sdiskpart(NamedTuple):
72 device: str
73 mountpoint: str
74 fstype: str
75 opts: str
76
77
78# psutil.net_io_counters()
79class snetio(NamedTuple):
80 bytes_sent: int
81 bytes_recv: int
82 packets_sent: int
83 packets_recv: int
84 errin: int
85 errout: int
86 dropin: int
87 dropout: int
88
89
90# psutil.users()
91class suser(NamedTuple):
92 name: str
93 terminal: str | None
94 host: str | None
95 started: float
96 pid: int | None
97
98
99# psutil.net_connections() and psutil.Process.net_connections()
100class addr(NamedTuple):
101 ip: str
102 port: int
103
104
105# psutil.net_connections()
106class sconn(NamedTuple):
107 fd: int
108 family: socket.AddressFamily
109 type: socket.SocketKind
110 laddr: addr | tuple | str
111 raddr: addr | tuple | str
112 status: ConnectionStatus
113 pid: int | None
114
115
116# psutil.net_if_addrs()
117class snicaddr(NamedTuple):
118 family: socket.AddressFamily
119 address: str | None
120 netmask: str | None
121 broadcast: str | None
122 ptp: str | None
123
124
125# psutil.net_if_stats()
126class snicstats(NamedTuple):
127 isup: bool
128 duplex: NicDuplex
129 speed: int
130 mtu: int
131 flags: str
132
133
134# psutil.cpu_times()
135class scputimes(NamedTuple):
136 user: float
137 system: float
138 idle: float
139 if LINUX or MACOS or BSD:
140 nice: float
141 if LINUX:
142 iowait: float
143 irq: float
144 softirq: float
145 steal: float
146 guest: float
147 guest_nice: float
148 if BSD:
149 irq: float
150 if SUNOS or AIX:
151 iowait: float
152 if WINDOWS:
153 irq: float
154 dpc: float
155
156 @property
157 def interrupt(self):
158 msg = "'interrupt' field is deprecated, use 'irq' instead"
159 warnings.warn(msg, DeprecationWarning, stacklevel=2)
160 return self.irq
161
162
163# psutil.cpu_stats()
164class scpustats(NamedTuple):
165 ctx_switches: int
166 interrupts: int
167 soft_interrupts: int
168 syscalls: int
169
170
171# psutil.cpu_freq()
172class scpufreq(NamedTuple):
173 current: float
174 min: float | None
175 max: float | None
176
177
178# psutil.sensors_temperatures()
179class shwtemp(NamedTuple):
180 label: str
181 current: float | None
182 high: float | None
183 critical: float | None
184
185
186# psutil.sensors_battery()
187class sbattery(NamedTuple):
188 percent: float
189 secsleft: int | BatteryTime
190 power_plugged: bool | None
191
192
193# psutil.sensors_fans()
194class sfan(NamedTuple):
195 label: str
196 current: int
197
198
199if LINUX or WINDOWS or MACOS or BSD:
200
201 # psutil.heap_info()
202 class pheap(NamedTuple):
203 heap_used: int
204 mmap_used: int
205 if WINDOWS:
206 heap_count: int
207
208
209# psutil.virtual_memory()
210class svmem(NamedTuple):
211 total: int
212 available: int
213 percent: float
214 used: int
215 free: int
216 if LINUX:
217 active: int
218 inactive: int
219 buffers: int
220 cached: int
221 shared: int
222 slab: int
223 elif BSD:
224 active: int
225 inactive: int
226 buffers: int
227 cached: int
228 shared: int
229 wired: int
230 elif WINDOWS:
231 cached: int
232 wired: int
233 elif MACOS:
234 active: int
235 inactive: int
236 wired: int
237
238
239# ===================================================================
240# --- Process class
241# ===================================================================
242
243
244# psutil.Process.cpu_times()
245class pcputimes(NamedTuple):
246 user: float
247 system: float
248 children_user: float
249 children_system: float
250 if LINUX:
251 iowait: float
252
253
254# psutil.Process.open_files()
255class popenfile(NamedTuple):
256 path: str
257 fd: int
258 if LINUX:
259 position: int
260 mode: str
261 flags: int
262
263
264# psutil.Process.threads()
265class pthread(NamedTuple):
266 id: int
267 user_time: float
268 system_time: float
269
270
271# psutil.Process.uids()
272class puids(NamedTuple):
273 real: int
274 effective: int
275 saved: int
276
277
278# psutil.Process.gids()
279class pgids(NamedTuple):
280 real: int
281 effective: int
282 saved: int
283
284
285# psutil.Process.io_counters()
286class pio(NamedTuple):
287 read_count: int
288 write_count: int
289 read_bytes: int
290 write_bytes: int
291 if LINUX:
292 read_chars: int
293 write_chars: int
294 elif WINDOWS:
295 other_count: int
296 other_bytes: int
297
298
299# psutil.Process.ionice()
300class pionice(NamedTuple):
301 ioclass: ProcessIOPriority
302 value: int
303
304
305# psutil.Process.ctx_switches()
306class pctxsw(NamedTuple):
307 voluntary: int
308 involuntary: int
309
310
311# psutil.Process.page_faults()
312class ppagefaults(NamedTuple):
313 minor: int
314 major: int
315
316
317# psutil.Process().memory_footprint()
318if LINUX or MACOS or WINDOWS:
319
320 class pfootprint(NamedTuple):
321 uss: int
322 if LINUX:
323 pss: int
324 swap: int
325 shared: int
326
327
328# psutil.Process.net_connections()
329class pconn(NamedTuple):
330 fd: int
331 family: socket.AddressFamily
332 type: socket.SocketKind
333 laddr: addr | tuple | str
334 raddr: addr | tuple | str
335 status: ConnectionStatus
336
337
338# psutil.Process.memory_maps(grouped=True)
339class pmmap_grouped(NamedTuple):
340 path: str
341 rss: int
342 if LINUX:
343 size: int
344 pss: int
345 shared_clean: int
346 shared_dirty: int
347 private_clean: int
348 private_dirty: int
349 referenced: int
350 anonymous: int
351 swap: int
352 elif BSD:
353 private: int
354 ref_count: int
355 shadow_count: int
356 elif SUNOS:
357 anonymous: int
358 locked: int
359
360
361# psutil.Process.memory_maps(grouped=False)
362class pmmap_ext(NamedTuple):
363 addr: str
364 perms: str
365 path: str
366 rss: int
367 if LINUX:
368 size: int
369 pss: int
370 shared_clean: int
371 shared_dirty: int
372 private_clean: int
373 private_dirty: int
374 referenced: int
375 anonymous: int
376 swap: int
377 elif BSD:
378 private: int
379 ref_count: int
380 shadow_count: int
381 elif SUNOS:
382 anonymous: int
383 locked: int
384
385
386# ===================================================================
387# --- Process memory_info() / memory_extras() / memory_full_info()
388# ===================================================================
389
390if LINUX:
391
392 # psutil.Process().memory_info()
393 class pmem(NamedTuple):
394 rss: int
395 vms: int
396 shared: int
397 text: int
398 data: int
399
400 @property
401 def lib(self):
402 # It has always been 0 since Linux 2.6.
403 msg = "'lib' field is deprecated and will be removed"
404 warnings.warn(msg, DeprecationWarning, stacklevel=2)
405 return 0
406
407 @property
408 def dirty(self):
409 # It has always been 0 since Linux 2.6.
410 msg = "'dirty' field is deprecated and will be removed"
411 warnings.warn(msg, DeprecationWarning, stacklevel=2)
412 return 0
413
414 # psutil.Process().memory_extras()
415 class pmem_extras(NamedTuple):
416 peak_rss: int
417 peak_vms: int
418 rss_anon: int
419 rss_file: int
420 rss_shmem: int
421 swap_anon: int
422 locked: int
423
424 # psutil.Process().memory_full_info()
425 pfullmem = namedtuple("pfullmem", pmem._fields + ("uss", "pss", "swap"))
426
427elif WINDOWS:
428
429 # psutil.Process.memory_info()
430 class pmem( # noqa: SLOT002
431 namedtuple("pmem", ("rss", "vms", "peak_rss", "peak_vms"))
432 ):
433 def __new__(cls, rss, vms, peak_rss, peak_vms, _deprecated=None):
434 inst = super().__new__(cls, rss, vms, peak_rss, peak_vms)
435 inst.__dict__["_deprecated"] = _deprecated or {}
436 return inst
437
438 def __getattr__(self, name):
439 depr = self.__dict__["_deprecated"]
440 if name in depr:
441 msg = f"pmem.{name} is deprecated"
442 if name in {
443 "paged_pool",
444 "nonpaged_pool",
445 "peak_paged_pool",
446 "peak_nonpaged_pool",
447 }:
448 msg += "; use memory_extras() instead"
449 elif name == "num_page_faults":
450 msg += "; use page_faults() instead"
451 warnings.warn(msg, DeprecationWarning, stacklevel=2)
452 return depr[name]
453
454 msg = f"{self.__class__.__name__} object has no attribute {name!r}"
455 raise AttributeError(msg)
456
457 # psutil.Process.memory_extras()
458 class pmem_extras(NamedTuple):
459 virtual: int
460 peak_virtual: int
461 paged_pool: int
462 nonpaged_pool: int
463 peak_paged_pool: int
464 peak_nonpaged_pool: int
465
466 # psutil.Process.memory_full_info()
467 pfullmem = namedtuple("pfullmem", pmem._fields + ("uss",))
468
469elif MACOS:
470
471 # psutil.Process.memory_info()
472 class pmem(NamedTuple):
473 rss: int
474 vms: int
475
476 # psutil.Process.memory_extras()
477 class pmem_extras(NamedTuple):
478 phys_footprint: int
479 peak_footprint: int
480
481 # psutil.Process.memory_full_info()
482 pfullmem = namedtuple("pfullmem", pmem._fields + ("uss",))
483
484elif BSD:
485
486 # psutil.Process.memory_info()
487 class pmem(NamedTuple):
488 rss: int
489 vms: int
490 text: int
491 data: int
492 stack: int
493 peak_rss: int
494
495 # psutil.Process.memory_full_info()
496 pfullmem = pmem
497
498elif SUNOS or AIX:
499
500 # psutil.Process.memory_info()
501 class pmem(NamedTuple):
502 rss: int
503 vms: int
504
505 # psutil.Process.memory_full_info()
506 pfullmem = pmem