Coverage for tests / osinfo.py: 100.000%
34 statements
« prev ^ index » next coverage.py v7.12.1a0.dev1, created at 2025-11-30 17:57 +0000
« prev ^ index » next coverage.py v7.12.1a0.dev1, created at 2025-11-30 17:57 +0000
1# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
2# For details: https://github.com/coveragepy/coveragepy/blob/main/NOTICE.txt
4"""OS information for testing."""
6from __future__ import annotations 1HQjsa3IRktb4JSluc5KTmvd6LUnwe7MVWoxyf89NXYpzAg!#OZ0qBCh$%P12rDEi'(FG)
8import sys 1HQjsa3IRktb4JSluc5KTmvd6LUnwe7MVWoxyf89NXYpzAg!#OZ0qBCh$%P12rDEi'(FG)
11if sys.platform == "win32": 1HQjsa3IRktb4JSluc5KTmvd6LUnwe7MVWoxyf89NXYpzAg!#OZ0qBCh$%P12rDEi'(FG)
12 # Windows implementation
13 def process_ram() -> int: 1a3b4c5d6e7f89g!#h$%i'()
14 """How much RAM is this process using? (Windows)"""
15 import ctypes 1abcdefghi
16 from ctypes import wintypes 1abcdefghi
18 # From: http://lists.ubuntu.com/archives/bazaar-commits/2009-February/011990.html
19 # Updated from: https://stackoverflow.com/a/16204942/14343
20 class PROCESS_MEMORY_COUNTERS_EX(ctypes.Structure): 1abcdefghi
21 """Used by GetProcessMemoryInfo"""
23 _fields_ = [ 1abcdefghi
24 ("cb", wintypes.DWORD),
25 ("PageFaultCount", wintypes.DWORD),
26 ("PeakWorkingSetSize", ctypes.c_size_t),
27 ("WorkingSetSize", ctypes.c_size_t),
28 ("QuotaPeakPagedPoolUsage", ctypes.c_size_t),
29 ("QuotaPagedPoolUsage", ctypes.c_size_t),
30 ("QuotaPeakNonPagedPoolUsage", ctypes.c_size_t),
31 ("QuotaNonPagedPoolUsage", ctypes.c_size_t),
32 ("PagefileUsage", ctypes.c_size_t),
33 ("PeakPagefileUsage", ctypes.c_size_t),
34 ("PrivateUsage", ctypes.c_size_t),
35 ]
37 GetProcessMemoryInfo = ctypes.windll.psapi.GetProcessMemoryInfo 1abcdefghi
38 GetProcessMemoryInfo.argtypes = [ 1abcdefghi
39 wintypes.HANDLE,
40 ctypes.POINTER(PROCESS_MEMORY_COUNTERS_EX),
41 wintypes.DWORD,
42 ]
43 GetProcessMemoryInfo.restype = wintypes.BOOL 1abcdefghi
45 GetCurrentProcess = ctypes.windll.kernel32.GetCurrentProcess 1abcdefghi
46 GetCurrentProcess.argtypes = [] 1abcdefghi
47 GetCurrentProcess.restype = wintypes.HANDLE 1abcdefghi
49 counters = PROCESS_MEMORY_COUNTERS_EX() 1abcdefghi
50 ret = GetProcessMemoryInfo( 1abcdefghi
51 GetCurrentProcess(),
52 ctypes.byref(counters),
53 ctypes.sizeof(counters),
54 )
55 if not ret: # pragma: part covered 1abcdefghi
56 return 0 # pragma: cant happen
57 return counters.PrivateUsage 1abcdefghi
59elif sys.platform.startswith("linux"): 1HQjsIRktJSluKTmvLUnwMVWoxyNXYpzAOZ0qBCP12rDEFG
60 # Linux implementation
61 import os 1jsktlumvnwoxypzAqBCrDEFG
63 _scale = {"kb": 1024, "mb": 1024 * 1024} 1jsktlumvnwoxypzAqBCrDEFG
65 def _VmB(key: str) -> int: 1jsktlumvnwoxypzAqBCrDEFG
66 """Read the /proc/PID/status file to find memory use."""
67 try: 1jklmnopqr
68 # Get pseudo file /proc/<pid>/status
69 with open(f"/proc/{os.getpid()}/status", encoding="utf-8") as t: 1jklmnopqr
70 v = t.read() 1jklmnopqr
71 except OSError: # pragma: cant happen
72 return 0 # non-Linux?
73 # Get VmKey line e.g. 'VmRSS: 9999 kB\n ...'
74 i = v.index(key) 1jklmnopqr
75 vp = v[i:].split(None, 3) 1jklmnopqr
76 if len(vp) < 3: # pragma: part covered 1jklmnopqr
77 return 0 # pragma: cant happen
78 # Convert Vm value to bytes.
79 return int(float(vp[1]) * _scale[vp[2].lower()]) 1jklmnopqr
81 def process_ram() -> int: 1jsktlumvnwoxypzAqBCrDEFG
82 """How much RAM is this process using? (Linux implementation)"""
83 return _VmB("VmRSS") 1jklmnopqr
85else:
86 # Generic implementation.
87 def process_ram() -> int: 1HQIRJSKTLUMVWNXYOZ0P12
88 """How much RAM is this process using? (stdlib implementation)"""
89 import resource 1HIJKLMNOP
91 return resource.getrusage(resource.RUSAGE_SELF).ru_maxrss 1HIJKLMNOP