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

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 

3 

4"""OS information for testing.""" 

5 

6from __future__ import annotations 1HQjsa3IRktb4JSluc5KTmvd6LUnwe7MVWoxyf89NXYpzAg!#OZ0qBCh$%P12rDEi'(FG)

7 

8import sys 1HQjsa3IRktb4JSluc5KTmvd6LUnwe7MVWoxyf89NXYpzAg!#OZ0qBCh$%P12rDEi'(FG)

9 

10 

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

17 

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""" 

22 

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 ] 

36 

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

44 

45 GetCurrentProcess = ctypes.windll.kernel32.GetCurrentProcess 1abcdefghi

46 GetCurrentProcess.argtypes = [] 1abcdefghi

47 GetCurrentProcess.restype = wintypes.HANDLE 1abcdefghi

48 

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

58 

59elif sys.platform.startswith("linux"): 1HQjsIRktJSluKTmvLUnwMVWoxyNXYpzAOZ0qBCP12rDEFG

60 # Linux implementation 

61 import os 1jsktlumvnwoxypzAqBCrDEFG

62 

63 _scale = {"kb": 1024, "mb": 1024 * 1024} 1jsktlumvnwoxypzAqBCrDEFG

64 

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

80 

81 def process_ram() -> int: 1jsktlumvnwoxypzAqBCrDEFG

82 """How much RAM is this process using? (Linux implementation)""" 

83 return _VmB("VmRSS") 1jklmnopqr

84 

85else: 

86 # Generic implementation. 

87 def process_ram() -> int: 1HQIRJSKTLUMVWNXYOZ0P12

88 """How much RAM is this process using? (stdlib implementation)""" 

89 import resource 1HIJKLMNOP

90 

91 return resource.getrusage(resource.RUSAGE_SELF).ru_maxrss 1HIJKLMNOP