From f5621b6eb353d675e25b3aeb6194a6ff18a4268a Mon Sep 17 00:00:00 2001 From: Giampaolo Rodola Date: Sun, 27 Dec 2020 12:04:28 +0100 Subject: update doc Signed-off-by: Giampaolo Rodola --- README.rst | 5 ++--- docs/DEVNOTES | 6 ------ docs/index.rst | 6 ++++-- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/README.rst b/README.rst index 83e79aab..62b2a7d1 100644 --- a/README.rst +++ b/README.rst @@ -23,7 +23,7 @@ :alt: Code quality .. |github-actions| image:: https://img.shields.io/github/workflow/status/giampaolo/psutil/CI?label=Linux%2C%20macOS%2C%20FreeBSD - :target: https://github.com/giampaolo/psutil/actions?query=workflow%3ACI + :target: https://github.com/giampaolo/psutil/actions?query=workflow%3Abuild :alt: Linux, macOS, Windows tests .. |appveyor| image:: https://img.shields.io/appveyor/ci/giampaolo/psutil/master.svg?maxAge=3600&label=Windows @@ -35,7 +35,7 @@ :alt: Test coverage (coverall.io) .. |doc| image:: https://readthedocs.org/projects/psutil/badge/?version=latest - :target: http://psutil.readthedocs.io/en/latest/?badge=latest + :target: https://psutil.readthedocs.io/en/latest/ :alt: Documentation Status .. |version| image:: https://img.shields.io/pypi/v/psutil.svg?label=pypi @@ -43,7 +43,6 @@ :alt: Latest version .. |py-versions| image:: https://img.shields.io/pypi/pyversions/psutil.svg - :target: https://pypi.org/project/psutil :alt: Supported Python versions .. |packages| image:: https://repology.org/badge/tiny-repos/python:psutil.svg diff --git a/docs/DEVNOTES b/docs/DEVNOTES index 7fe14f7d..915754d6 100644 --- a/docs/DEVNOTES +++ b/docs/DEVNOTES @@ -34,18 +34,12 @@ FEATURES - #772: extended net_io_counters() metrics. -- #900: wheels for macOS and Linux. - - #922: extended net_io_stats() info. - #914: extended platform specific process info. - #898: wifi stats -- #893: (BSD) process environ - -- #809: (BSD) per-process resource limits (rlimit()). - - (UNIX) process root (different from cwd) - #782: (UNIX) process num of signals received. diff --git a/docs/index.rst b/docs/index.rst index d452c51c..5aae7201 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -73,10 +73,12 @@ Sponsors Supporters ---------- -None yet. - .. raw:: html +
+ +
+
add your avatar Install -- cgit v1.2.1 From cb666693389ca50e86406c03f36c736702ee1dcf Mon Sep 17 00:00:00 2001 From: Giampaolo Rodola Date: Sun, 27 Dec 2020 13:40:23 +0100 Subject: remove win dead code Signed-off-by: Giampaolo Rodola --- psutil/_psutil_windows.c | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/psutil/_psutil_windows.c b/psutil/_psutil_windows.c index 7a3ab329..13cf58c4 100644 --- a/psutil/_psutil_windows.c +++ b/psutil/_psutil_windows.c @@ -43,35 +43,6 @@ static PyObject *TimeoutExpired; static PyObject *TimeoutAbandoned; -/* - * Return the number of logical, active CPUs. Return 0 if undetermined. - * See discussion at: https://bugs.python.org/issue33166#msg314631 - */ -unsigned int -psutil_get_num_cpus(int fail_on_err) { - unsigned int ncpus = 0; - - // Minimum requirement: Windows 7 - if (GetActiveProcessorCount != NULL) { - ncpus = GetActiveProcessorCount(ALL_PROCESSOR_GROUPS); - if ((ncpus == 0) && (fail_on_err == 1)) { - PyErr_SetFromWindowsErr(0); - } - } - else { - psutil_debug("GetActiveProcessorCount() not available; " - "using GetSystemInfo()"); - ncpus = (unsigned int)PSUTIL_SYSTEM_INFO.dwNumberOfProcessors; - if ((ncpus <= 0) && (fail_on_err == 1)) { - PyErr_SetString( - PyExc_RuntimeError, - "GetSystemInfo() failed to retrieve CPU count"); - } - } - return ncpus; -} - - /* * Return a Python float representing the system uptime expressed in seconds * since the epoch. -- cgit v1.2.1 From 8687a11697865febb033edcac7d130c87425464e Mon Sep 17 00:00:00 2001 From: Giampaolo Rodola Date: Mon, 28 Dec 2020 14:44:55 +0100 Subject: give CREDITS to @aristocratos for new sponsorship (thank you ;)) Signed-off-by: Giampaolo Rodola --- CREDITS | 3 +++ README.rst | 4 +++- docs/index.rst | 3 ++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CREDITS b/CREDITS index 7e7ce954..e1d5d782 100644 --- a/CREDITS +++ b/CREDITS @@ -95,6 +95,9 @@ I: 557 Donations ------------------------------------------------------------------------------- +N: aristocratos +W: https://github.com/aristocratos + N: Daniel Widdis C: Washington, USA W: https://github.com/dbwiddis diff --git a/README.rst b/README.rst index 62b2a7d1..2631e059 100644 --- a/README.rst +++ b/README.rst @@ -132,10 +132,12 @@ Supporters .. raw:: html
- + +
add your avatar + Contributing ============ diff --git a/docs/index.rst b/docs/index.rst index 5aae7201..9a516e0d 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -76,7 +76,8 @@ Supporters .. raw:: html
- + +

add your avatar -- cgit v1.2.1 From d8a8a85997bd59b720dd7456ebc1835d0e9dcd9b Mon Sep 17 00:00:00 2001 From: Giampaolo Rodola Date: Tue, 29 Dec 2020 02:08:48 +0100 Subject: Fix #1512 proc connections() fails with EOPNOTSUPP ...on macOS. Just occurs sometimes for 1 socket only. Ignore the error and continue. Signed-off-by: Giampaolo Rodola --- HISTORY.rst | 2 ++ psutil/_psutil_osx.c | 16 ++++++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 9f5281f9..a33f5eb3 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -9,6 +9,8 @@ XXXX-XX-XX - 1456_: [macOS] psutil.cpu_freq()'s min and max are set to 0 if can't be determined (instead of crashing). +- 1512_: [macOS] sometimes Process.connections() will crash with EOPNOTSUPP + for one connection; this is now ignored. - 1892_: [macOS] psutil.cpu_freq() broken on Apple M1. 5.8.0 diff --git a/psutil/_psutil_osx.c b/psutil/_psutil_osx.c index 62a95774..5a77de14 100644 --- a/psutil/_psutil_osx.c +++ b/psutil/_psutil_osx.c @@ -1027,9 +1027,18 @@ psutil_proc_connections(PyObject *self, PyObject *args) { PROC_PIDFDSOCKETINFO, &si, sizeof(si)); // --- errors checking - if ((nb <= 0) || (nb < sizeof(si))) { + if ((nb <= 0) || (nb < sizeof(si)) || (errno != 0)) { if (errno == EBADF) { // let's assume socket has been closed + psutil_debug("proc_pidfdinfo(PROC_PIDFDSOCKETINFO) -> " + "EBADF (ignored)"); + continue; + } + else if (errno == EOPNOTSUPP) { + // may happen sometimes, see: + // https://github.com/giampaolo/psutil/issues/1512 + psutil_debug("proc_pidfdinfo(PROC_PIDFDSOCKETINFO) -> " + "EOPNOTSUPP (ignored)"); continue; } else { @@ -1063,11 +1072,6 @@ psutil_proc_connections(PyObject *self, PyObject *args) { if (inseq == 0) continue; - if (errno != 0) { - PyErr_SetFromErrno(PyExc_OSError); - goto error; - } - if ((family == AF_INET) || (family == AF_INET6)) { if (family == AF_INET) { inet_ntop(AF_INET, -- cgit v1.2.1 From e9e419727aa7470d5f97d146a50702fb211d6467 Mon Sep 17 00:00:00 2001 From: Andre F de Miranda Date: Tue, 29 Dec 2020 13:22:28 +1100 Subject: Fix typo in index.rst (#1899) --- docs/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.rst b/docs/index.rst index 9a516e0d..45ca33a0 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -2416,7 +2416,7 @@ Kill process tree timeout=None, on_terminate=None): """Kill a process tree (including grandchildren) with signal "sig" and return a (gone, still_alive) tuple. - "on_terminate", if specified, is a callabck function which is + "on_terminate", if specified, is a callback function which is called as soon as a child terminates. """ assert pid != os.getpid(), "won't kill myself" -- cgit v1.2.1 From b875a45e5caa147604fb499a52f9c09551f17729 Mon Sep 17 00:00:00 2001 From: Giampaolo Rodola Date: Tue, 29 Dec 2020 13:53:01 +0100 Subject: update doc Signed-off-by: Giampaolo Rodola --- docs/index.rst | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 9a516e0d..6d38c3b0 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -85,19 +85,9 @@ Supporters Install ======= -Linux Ubuntu / Debian:: +On Linux, Windows, macOS:: - sudo apt-get install gcc python3-dev - sudo pip3 install psutil - -Linux Redhat:: - - sudo yum install gcc python3-devel - sudo pip3 install psutil - -Windows:: - - pip3 install psutil + pip install psutil For other platforms see more detailed `install `_ -- cgit v1.2.1 From f18438d135c12f7eb186f49622e0f6683c37f7f5 Mon Sep 17 00:00:00 2001 From: Giampaolo Rodola Date: Wed, 30 Dec 2020 00:37:39 +0100 Subject: Linux, cpu_freq(): diminish os.stat() calls a bit Micro optimization in reference to #1852 and #1851. Use glob.glob(), which internally relies on os.scandir() in order to list /sys/devices/system/cpu/cpufreq files. In doing so, we avoid os.path.exists() for each CPU, which internally uses os.stat(). Signed-off-by: Giampaolo Rodola --- psutil/_pslinux.py | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/psutil/_pslinux.py b/psutil/_pslinux.py index 39155745..ff8d9247 100644 --- a/psutil/_pslinux.py +++ b/psutil/_pslinux.py @@ -726,19 +726,12 @@ if os.path.exists("/sys/devices/system/cpu/cpufreq/policy0") or \ Contrarily to other OSes, Linux updates these values in real-time. """ - def get_path(num): - for p in ("/sys/devices/system/cpu/cpufreq/policy%s" % num, - "/sys/devices/system/cpu/cpu%s/cpufreq" % num): - if os.path.exists(p): - return p - + paths = sorted( + glob.glob("/sys/devices/system/cpu/cpufreq/policy[0-9]*") or + glob.glob("/sys/devices/system/cpu/cpu[0-9]*/cpufreq")) ret = [] - for n in range(cpu_count_logical()): - path = get_path(n) - if not path: - continue - - pjoin = os.path.join + pjoin = os.path.join + for path in paths: curr = cat(pjoin(path, "scaling_cur_freq"), fallback=None) if curr is None: # Likely an old RedHat, see: -- cgit v1.2.1 From 51eb1dae7bf96dcc7dae51641d5770fd0d99d0ac Mon Sep 17 00:00:00 2001 From: Giampaolo Rodola Date: Wed, 30 Dec 2020 10:57:35 +0100 Subject: provide debug info in case of error for getloadavg() on Windows. See: https://github.com/nicolargo/glances/issues/1780 Signed-off-by: Giampaolo Rodola --- psutil/arch/windows/wmi.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/psutil/arch/windows/wmi.c b/psutil/arch/windows/wmi.c index f9a847d3..5fad4053 100644 --- a/psutil/arch/windows/wmi.c +++ b/psutil/arch/windows/wmi.c @@ -64,22 +64,28 @@ psutil_init_loadavg_counter(PyObject *self, PyObject *args) { HANDLE event; HANDLE waitHandle; - if ((PdhOpenQueryW(NULL, 0, &hQuery)) != ERROR_SUCCESS) - goto error; + if ((PdhOpenQueryW(NULL, 0, &hQuery)) != ERROR_SUCCESS) { + PyErr_Format(PyExc_RuntimeError, "PdhOpenQueryW failed"); + return NULL; + } s = PdhAddEnglishCounterW(hQuery, szCounterPath, 0, &hCounter); - if (s != ERROR_SUCCESS) - goto error; + if (s != ERROR_SUCCESS) { + PyErr_Format(PyExc_RuntimeError, "PdhAddEnglishCounterW failed"); + return NULL; + } event = CreateEventW(NULL, FALSE, FALSE, L"LoadUpdateEvent"); if (event == NULL) { - PyErr_SetFromWindowsErr(0); + PyErr_SetFromOSErrnoWithSyscall("CreateEventW"); return NULL; } s = PdhCollectQueryDataEx(hQuery, SAMPLING_INTERVAL, event); - if (s != ERROR_SUCCESS) - goto error; + if (s != ERROR_SUCCESS) { + PyErr_Format(PyExc_RuntimeError, "PdhCollectQueryDataEx failed"); + return NULL; + } ret = RegisterWaitForSingleObject( &waitHandle, @@ -91,15 +97,11 @@ psutil_init_loadavg_counter(PyObject *self, PyObject *args) { WT_EXECUTEDEFAULT); if (ret == 0) { - PyErr_SetFromWindowsErr(0); + PyErr_SetFromOSErrnoWithSyscall("RegisterWaitForSingleObject"); return NULL; } Py_RETURN_NONE; - -error: - PyErr_SetFromWindowsErr(0); - return NULL; } -- cgit v1.2.1 From fd77b0cd0e79c8f0f61969a4c2eb46d6d5c18f4c Mon Sep 17 00:00:00 2001 From: Giampaolo Rodola Date: Wed, 6 Jan 2021 15:10:55 +0100 Subject: fix issue labeler issue Signed-off-by: Giampaolo Rodola --- .github/workflows/issues.py | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/.github/workflows/issues.py b/.github/workflows/issues.py index 91e12202..964e5192 100644 --- a/.github/workflows/issues.py +++ b/.github/workflows/issues.py @@ -180,14 +180,6 @@ def is_event_new_pr(): return False -def is_event_new_comment(): - data = _get_event_data() - try: - return data['action'] == 'created' and 'comment' in data - except KeyError: - return False - - def get_issue(): data = _get_event_data() try: @@ -317,10 +309,6 @@ def on_new_pr(issue): # issue.create_comment(REPLY_UPDATE_CHANGELOG) -def on_new_comment(issue): - pass - - def main(): issue = get_issue() stype = "PR" if is_pr(issue) else "issue" @@ -336,11 +324,8 @@ def main(): add_labels_from_text(issue, issue.title) add_labels_from_new_body(issue, issue.body) on_new_pr(issue) - elif is_event_new_comment(): - log("created new comment for %s" % issue) - on_new_comment(issue) else: - raise ValueError("unhandled event") + log("unhandled event") if __name__ == '__main__': -- cgit v1.2.1 From f95276d744dee12a237d1a3f2836f36340c6abc0 Mon Sep 17 00:00:00 2001 From: Giampaolo Rodola Date: Wed, 6 Jan 2021 16:01:05 +0100 Subject: #1901 / macOS: better err msg on proc_pidinfo() Signed-off-by: Giampaolo Rodola --- psutil/arch/osx/process_info.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/psutil/arch/osx/process_info.c b/psutil/arch/osx/process_info.c index fb9f24ff..15ad3b89 100644 --- a/psutil/arch/osx/process_info.c +++ b/psutil/arch/osx/process_info.c @@ -370,14 +370,21 @@ psutil_get_kinfo_proc(pid_t pid, struct kinfo_proc *kp) { /* * A wrapper around proc_pidinfo(). + * https://opensource.apple.com/source/xnu/xnu-2050.7.9/bsd/kern/proc_info.c. * Returns 0 on failure (and Python exception gets already set). */ int psutil_proc_pidinfo(pid_t pid, int flavor, uint64_t arg, void *pti, int size) { errno = 0; - int ret = proc_pidinfo(pid, flavor, arg, pti, size); - if ((ret <= 0) || ((unsigned long)ret < sizeof(pti))) { - psutil_raise_for_pid(pid, "proc_pidinfo()"); + int ret; + + ret = proc_pidinfo(pid, flavor, arg, pti, size); + if (ret <= 0) { + psutil_raise_for_pid(pid, "proc_pidinfo() failed"); + return 0; + } + else if ((unsigned long )ret < sizeof(pti)) { + psutil_raise_for_pid(pid, "proc_pidinfo() len mismatch"); return 0; } return ret; -- cgit v1.2.1 From 6e494bd4024c3d25769688b53e95942e529392d6 Mon Sep 17 00:00:00 2001 From: marxin Date: Thu, 7 Jan 2021 12:04:51 +0100 Subject: Speed up cpu_frequncy() on Linux systems (#1851) (#1852) The change is about using /proc/cpuinfo when available. It provides cached values for frequencies and one can fill up minimum and maximum frequency from /sys/devices/system/cpu/cpufreq/policy/* sub-system (which is fast). Fixes #1851. --- psutil/_pslinux.py | 37 +++++++++++++++++++++---------------- psutil/tests/test_linux.py | 4 ---- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/psutil/_pslinux.py b/psutil/_pslinux.py index ff8d9247..640a0f3d 100644 --- a/psutil/_pslinux.py +++ b/psutil/_pslinux.py @@ -719,6 +719,17 @@ def cpu_stats(): ctx_switches, interrupts, soft_interrupts, syscalls) +def _cpu_get_cpuinfo_freq(): + """Return current CPU frequency from cpuinfo if available. + """ + ret = [] + with open_binary('%s/cpuinfo' % get_procfs_path()) as f: + for line in f: + if line.lower().startswith(b'cpu mhz'): + ret.append(float(line.split(b':', 1)[1])) + return ret + + if os.path.exists("/sys/devices/system/cpu/cpufreq/policy0") or \ os.path.exists("/sys/devices/system/cpu/cpu0/cpufreq"): def cpu_freq(): @@ -726,13 +737,19 @@ if os.path.exists("/sys/devices/system/cpu/cpufreq/policy0") or \ Contrarily to other OSes, Linux updates these values in real-time. """ + cpuinfo_freqs = _cpu_get_cpuinfo_freq() paths = sorted( glob.glob("/sys/devices/system/cpu/cpufreq/policy[0-9]*") or glob.glob("/sys/devices/system/cpu/cpu[0-9]*/cpufreq")) ret = [] pjoin = os.path.join - for path in paths: - curr = cat(pjoin(path, "scaling_cur_freq"), fallback=None) + for i, path in enumerate(paths): + if len(paths) == len(cpuinfo_freqs): + # take cached value from cpuinfo if available, see: + # https://github.com/giampaolo/psutil/issues/1851 + curr = cpuinfo_freqs[i] + else: + curr = cat(pjoin(path, "scaling_cur_freq"), fallback=None) if curr is None: # Likely an old RedHat, see: # https://github.com/giampaolo/psutil/issues/1071 @@ -746,24 +763,12 @@ if os.path.exists("/sys/devices/system/cpu/cpufreq/policy0") or \ ret.append(_common.scpufreq(curr, min_, max_)) return ret -elif os.path.exists("/proc/cpuinfo"): +else: def cpu_freq(): """Alternate implementation using /proc/cpuinfo. min and max frequencies are not available and are set to None. """ - ret = [] - with open_binary('%s/cpuinfo' % get_procfs_path()) as f: - for line in f: - if line.lower().startswith(b'cpu mhz'): - key, value = line.split(b':', 1) - ret.append(_common.scpufreq(float(value), 0., 0.)) - return ret - -else: - def cpu_freq(): - """Dummy implementation when none of the above files are present. - """ - return [] + return [_common.scpufreq(x, 0., 0.) for x in _cpu_get_cpuinfo_freq()] # ===================================================================== diff --git a/psutil/tests/test_linux.py b/psutil/tests/test_linux.py index 2f6065f5..0c6d498c 100755 --- a/psutil/tests/test_linux.py +++ b/psutil/tests/test_linux.py @@ -768,18 +768,14 @@ class TestSystemCPUFrequency(PsutilTestCase): if path.startswith('/sys/devices/system/cpu/'): return False else: - if path == "/proc/cpuinfo": - flags.append(None) return os_path_exists(path) - flags = [] os_path_exists = os.path.exists try: with mock.patch("os.path.exists", side_effect=path_exists_mock): reload_module(psutil._pslinux) ret = psutil.cpu_freq() assert ret - assert flags self.assertEqual(ret.max, 0.0) self.assertEqual(ret.min, 0.0) for freq in psutil.cpu_freq(percpu=True): -- cgit v1.2.1 From ede5e46dbee0c0f6c33f80629f75aecc1ad4143c Mon Sep 17 00:00:00 2001 From: Giampaolo Rodola Date: Thu, 7 Jan 2021 12:18:59 +0100 Subject: give CREDITS to @marxin for #1851 and #1852 Signed-off-by: Giampaolo Rodola --- CREDITS | 4 ++++ HISTORY.rst | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/CREDITS b/CREDITS index e1d5d782..451b7a4d 100644 --- a/CREDITS +++ b/CREDITS @@ -732,3 +732,7 @@ I: 1620, 1727 N: Tim Schlueter W: https://github.com/modelrockettier I: 1822 + +N: marxin +W: https://github.com/marxin +I: 1851 diff --git a/HISTORY.rst b/HISTORY.rst index a33f5eb3..cb9ba8b6 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -5,6 +5,12 @@ XXXX-XX-XX +**Enhancements** + +- 1851_: [Linux] cpu_freq() is slow on systems with many CPUs. Read current + frequency values for all CPUs from /proc/cpuinfo instead of opening many + files in /sys fs. (patch by marxin) + **Bug fixes** - 1456_: [macOS] psutil.cpu_freq()'s min and max are set to 0 if can't be -- cgit v1.2.1 From e96307312c4858f9178786a2c7c4cf542de6bf4f Mon Sep 17 00:00:00 2001 From: alxchk Date: Fri, 8 Jan 2021 11:29:54 +0200 Subject: windows: Preserve GetLastError() value before calling sprintf (#1904) https://github.com/giampaolo/psutil/issues/1877#issuecomment-756342272 --- psutil/_psutil_common.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/psutil/_psutil_common.c b/psutil/_psutil_common.c index fae8d970..ff060a51 100644 --- a/psutil/_psutil_common.c +++ b/psutil/_psutil_common.c @@ -83,8 +83,9 @@ PyErr_SetFromOSErrnoWithSyscall(const char *syscall) { char fullmsg[1024]; #ifdef PSUTIL_WINDOWS + DWORD dwLastError = GetLastError(); sprintf(fullmsg, "(originated from %s)", syscall); - PyErr_SetFromWindowsErrWithFilename(GetLastError(), fullmsg); + PyErr_SetFromWindowsErrWithFilename(dwLastError, fullmsg); #else PyObject *exc; sprintf(fullmsg, "%s (originated from %s)", strerror(errno), syscall); -- cgit v1.2.1 From e80cabe5206fd7ef14fd6a47e2571f660f95babf Mon Sep 17 00:00:00 2001 From: Giampaolo Rodola Date: Fri, 8 Jan 2021 19:10:08 +0100 Subject: give CREDITS to @alxchk for #1904 Signed-off-by: Giampaolo Rodola --- CREDITS | 2 +- HISTORY.rst | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CREDITS b/CREDITS index 451b7a4d..fa8cbf1c 100644 --- a/CREDITS +++ b/CREDITS @@ -545,7 +545,7 @@ I: 1042, 1079, 1070 N: Oleksii Shevchuk W: https://github.com/alxchk -I: 1077, 1093, 1091, 1220, 1346 +I: 1077, 1093, 1091, 1220, 1346, 1904 N: Prodesire W: https://github.com/Prodesire diff --git a/HISTORY.rst b/HISTORY.rst index cb9ba8b6..dc4afbff 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -18,6 +18,8 @@ XXXX-XX-XX - 1512_: [macOS] sometimes Process.connections() will crash with EOPNOTSUPP for one connection; this is now ignored. - 1892_: [macOS] psutil.cpu_freq() broken on Apple M1. +- 1904_: [Windows] OpenProcess fails with ERROR_SUCCESS due to GetLastError() + called after sprintf(). (patch by alxchk) 5.8.0 ===== -- cgit v1.2.1