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
326
327# psutil.Process.net_connections()
328class pconn(NamedTuple):
329 fd: int
330 family: socket.AddressFamily
331 type: socket.SocketKind
332 laddr: addr | tuple | str
333 raddr: addr | tuple | str
334 status: ConnectionStatus
335
336
337# psutil.Process.memory_maps(grouped=True)
338class pmmap_grouped(NamedTuple):
339 path: str
340 rss: int
341 if LINUX:
342 size: int
343 pss: int
344 shared_clean: int
345 shared_dirty: int
346 private_clean: int
347 private_dirty: int
348 referenced: int
349 anonymous: int
350 swap: int
351 elif BSD:
352 private: int
353 ref_count: int
354 shadow_count: int
355 elif SUNOS:
356 anonymous: int
357 locked: int
358
359
360# psutil.Process.memory_maps(grouped=False)
361class pmmap_ext(NamedTuple):
362 addr: str
363 perms: str
364 path: str
365 rss: int
366 if LINUX:
367 size: int
368 pss: int
369 shared_clean: int
370 shared_dirty: int
371 private_clean: int
372 private_dirty: int
373 referenced: int
374 anonymous: int
375 swap: int
376 elif BSD:
377 private: int
378 ref_count: int
379 shadow_count: int
380 elif SUNOS:
381 anonymous: int
382 locked: int
383
384
385# ===================================================================
386# --- Process memory_info() / memory_info_ex() / memory_full_info()
387# ===================================================================
388
389if LINUX:
390
391 # psutil.Process().memory_info()
392 class pmem(NamedTuple):
393 rss: int
394 vms: int
395 shared: int
396 text: int
397 data: int
398
399 @property
400 def lib(self):
401 # It has always been 0 since Linux 2.6.
402 msg = "'lib' field is deprecated and will be removed"
403 warnings.warn(msg, DeprecationWarning, stacklevel=2)
404 return 0
405
406 @property
407 def dirty(self):
408 # It has always been 0 since Linux 2.6.
409 msg = "'dirty' field is deprecated and will be removed"
410 warnings.warn(msg, DeprecationWarning, stacklevel=2)
411 return 0
412
413 # psutil.Process().memory_info_ex()
414 pmem_ex = namedtuple(
415 "pmem_ex",
416 pmem._fields
417 + (
418 "peak_rss",
419 "peak_vms",
420 "rss_anon",
421 "rss_file",
422 "rss_shmem",
423 "swap",
424 "hugetlb",
425 ),
426 )
427
428 # psutil.Process().memory_full_info()
429 pfullmem = namedtuple("pfullmem", pmem._fields + ("uss", "pss", "swap"))
430
431elif WINDOWS:
432
433 # psutil.Process.memory_info()
434 class pmem( # noqa: SLOT002
435 namedtuple("pmem", ("rss", "vms", "peak_rss", "peak_vms"))
436 ):
437 def __new__(cls, rss, vms, peak_rss, peak_vms, _deprecated=None):
438 inst = super().__new__(cls, rss, vms, peak_rss, peak_vms)
439 inst.__dict__["_deprecated"] = _deprecated or {}
440 return inst
441
442 def __getattr__(self, name):
443 depr = self.__dict__["_deprecated"]
444 if name in depr:
445 msg = f"pmem.{name} is deprecated"
446 if name in {
447 "paged_pool",
448 "nonpaged_pool",
449 "peak_paged_pool",
450 "peak_nonpaged_pool",
451 }:
452 msg += "; use memory_info_ex() instead"
453 elif name == "num_page_faults":
454 msg += "; use page_faults() instead"
455 warnings.warn(msg, DeprecationWarning, stacklevel=2)
456 return depr[name]
457
458 msg = f"{self.__class__.__name__} object has no attribute {name!r}"
459 raise AttributeError(msg)
460
461 # psutil.Process.memory_info_ex()
462 pmem_ex = namedtuple(
463 "pmem_ex",
464 pmem._fields
465 + (
466 "virtual",
467 "peak_virtual",
468 "paged_pool",
469 "nonpaged_pool",
470 "peak_paged_pool",
471 "peak_nonpaged_pool",
472 ),
473 )
474
475 # psutil.Process.memory_full_info()
476 pfullmem = namedtuple("pfullmem", pmem._fields + ("uss",))
477
478elif MACOS:
479
480 # psutil.Process.memory_info()
481 class pmem(NamedTuple):
482 rss: int
483 vms: int
484
485 # psutil.Process.memory_info_ex()
486 class pmem_ex(NamedTuple):
487 rss: int
488 vms: int
489 peak_rss: int
490 rss_anon: int
491 rss_file: int
492 wired: int
493 compressed: int
494 phys_footprint: int
495
496 # psutil.Process.memory_full_info()
497 pfullmem = namedtuple("pfullmem", pmem._fields + ("uss",))
498
499elif BSD:
500
501 # psutil.Process.memory_info()
502 class pmem(NamedTuple):
503 rss: int
504 vms: int
505 text: int
506 data: int
507 stack: int
508 peak_rss: int
509
510 # psutil.Process.memory_info_ex()
511 pmem_ex = pmem
512
513 # psutil.Process.memory_full_info()
514 pfullmem = pmem
515
516elif SUNOS or AIX:
517
518 # psutil.Process.memory_info()
519 class pmem(NamedTuple):
520 rss: int
521 vms: int
522
523 # psutil.Process.memory_info_ex()
524 pmem_ex = pmem
525
526 # psutil.Process.memory_full_info()
527 pfullmem = pmem