*Bug tracker at https://github.com/giampaolo/psutil/issues*

7.2.2
=====

2026-01-18

**Enhancements**

- 2705_: [Linux]: `Process.wait()`_ now uses ``pidfd_open()`` + ``poll()`` for
  waiting, resulting in no busy loop and faster response times. Requires
  Linux >= 5.3 and Python >= 3.9. Falls back to traditional polling if
  unavailable.
- 2705_: [macOS], [BSD]: `Process.wait()`_ now uses ``kqueue()`` for waiting,
  resulting in no busy loop and faster response times.

**Bug fixes**

- 2701_, [macOS]: fix compilation error on macOS < 10.7.  (patch by Sergey
  Fedorov)
- 2707_, [macOS]: fix potential memory leaks in error paths of
  `Process.memory_full_info()` and `Process.threads()`.
- 2708_, [macOS]: Process.cmdline()`_ and `Process.environ()`_ may fail with
  ``OSError: [Errno 0] Undefined error`` (from ``sysctl(KERN_PROCARGS2)``).
  They now raise `AccessDenied`_ instead.

7.2.1
=====

2025-12-29

**Bug fixes**

- 2699_, [FreeBSD], [NetBSD]: `heap_info()`_ does not detect small allocations
  (<= 1K). In order to fix that, we now flush internal jemalloc cache before
  fetching the metrics.

7.2.0
=====

2025-12-23

**Enhancements**

- 1275_: new `heap_info()`_ and `heap_trim()`_ functions, providing direct
  access to the platform's native C heap allocator (glibc, mimalloc,
  libmalloc). Useful to create tools to detect memory leaks.
- 2403_, [Linux]: publish wheels for Linux musl.
- 2680_: unit tests are no longer installed / part of the distribution. They
  now live under `tests/` instead of `psutil/tests`.

**Bug fixes**

* 2684_, [FreeBSD], [critical]: compilation fails on FreeBSD 14 due to missing
  include.
* 2691_, [Windows]: fix memory leak in `net_if_stats()`_ due to missing
  ``Py_CLEAR``.

**Compatibility notes**

- 2680_: `import psutil.tests` no longer works (but it was never documented to
  begin with).

7.1.3
=====

2025-11-02

**Enhancements**

- 2667_: enforce `clang-format` on all C and header files. It is now the
  mandatory formatting style for all C sources.
- 2672_, [macOS], [BSD]: increase the chances to recognize zombie processes and
  raise the appropriate exception (`ZombieProcess`_).
- 2676_, 2678_: replace unsafe `sprintf` / `snprintf` / `sprintf_s` calls with
  `str_format()`. Replace `strlcat` / `strlcpy` with safe `str_copy` /
  `str_append`. This unifies string handling across platforms and reduces
  unsafe usage of standard string functions, improving robustness.

**Bug fixes**

- 2674_, [Windows]: `disk_usage()`_ could truncate values on 32-bit platforms,
  potentially reporting incorrect total/free/used space for drives larger than
  4GB.
- 2675_, [macOS]: `Process.status()`_ incorrectly returns "running" for 99%
  of the processes.
- 2677_, [Windows]: fix MAC address string construction in `net_if_addrs()`_.
  Previously, the MAC address buffer was incorrectly updated using a fixed
  increment and `sprintf_s`, which could overflow or misformat the
  string if the MAC length or formatting changed. Also, the final '\n' was
  inserted unnecessarily.
- 2679_, [OpenBSD], [NetBSD], [critical]: can't build due to C syntax error.

7.1.2
=====

2025-10-25

**Enhancements**

- 2657_: stop publishing prebuilt Linux and Windows wheels for 32-bit Python.
  32-bit CPython is still supported, but psutil must now be built from source.
  2565_: produce wheels for free-thread cPython 3.13 and 3.14 (patch by
  Lysandros Nikolaou)

**Bug fixes**

- 2650_, [macOS]: `Process.cmdline()`_ and `Process.environ()`_ may incorrectly
  raise `NoSuchProcess`_ instead of `ZombieProcess`_.
- 2658_, [macOS]: double ``free()`` in `Process.environ()`_ when it fails
  internally. This posed a risk of segfault.
- 2662_, [macOS]: massive C code cleanup to guard against possible segfaults
  which were (not so) sporadically spotted on CI.

**Compatibility notes**

- 2657_: stop publishing prebuilt Linux and Windows wheels for 32-bit Python.

7.1.1
=====

2025-10-19

**Enhancements**

- 2645_, [SunOS]: dropped support for SunOS 10.
- 2646_, [SunOS]: add CI test runner for SunOS.

**Bug fixes**

- 2641_, [SunOS]: cannot compile psutil from sources due to missing C include.
- 2357_, [SunOS]: `Process.cmdline()`_ does not handle spaces properly. (patch
  by Ben Raz)

**Compatibility notes**

* 2645_: SunOS 10 is no longer supported.

7.1.0
=====

2025-09-17

**Enhancements**

- 2581_, [Windows]: publish ARM64 wheels.  (patch by Matthieu Darbois)
- 2571_, [FreeBSD]: Dropped support for FreeBSD 8 and earlier. FreeBSD 8 was
  maintained from 2009 to 2013.
- 2575_: introduced `dprint` CLI tool to format .yml and .md files.

**Bug fixes**

- 2473_, [macOS]: Fix build issue on macOS 11 and lower.
- 2494_, [Windows]: All APIs dealing with paths, such as
  `Process.memory_maps()`_, `Process.exe()`_ and `Process.open_files()`_ does
  not properly handle UNC paths. Paths such as ``\\??\\C:\\Windows\\Temp`` and
  ``'\\Device\\HarddiskVolume1\\Windows\\Temp'`` are now converted to
  ``C:\\Windows\\Temp``.  (patch by Ben Peddell)
- 2506_, [Windows]: Windows service APIs had issues with unicode services using
  special characters in their name.
- 2514_, [Linux]: `Process.cwd()`_ sometimes fail with `FileNotFoundError` due
  to a race condition.
- 2526_, [Linux]: `Process.create_time()`_, which is used to univocally
  identify a process over time, is subject to system clock updates, and as such
  can lead to `Process.is_running()`_ returning a wrong result. A monotonic
  creation time is now used instead.  (patch by Jonathan Kohler)
- 2528_, [Linux]: `Process.children()`_ may raise ``PermissionError``. It will
  now raise `AccessDenied`_ instead.
- 2540_, [macOS]: `boot_time()`_ is off by 45 seconds (C precision issue).
- 2541_, 2570_, 2578_ [Linux], [macOS], [NetBSD]: `Process.create_time()`_ does
  not reflect system clock updates.
- 2542_: if system clock is updated `Process.children()`_ and
  `Process.parent()`_ may not be able to return the right information.
- 2545_: [Illumos]: Fix handling of MIB2_UDP_ENTRY in `net_connections()`_.
- 2552_, [Windows]: `boot_time()`_ didn't take into account the time spent
  during suspend / hibernation.
- 2560_, [Linux]: `Process.memory_maps()`_ may crash with `IndexError` on
  RISCV64 due to a malformed `/proc/{PID}/smaps` file.  (patch by Julien
  Stephan)
- 2586_, [macOS], [CRITICAL]: fixed different places in C code which can
  trigger a segfault.
- 2604_, [Linux]: `virtual_memory()`_ "used" memory does not match recent
  versions of ``free`` CLI utility.  (patch by Isaac K. Ko)
- 2605_, [Linux]: `psutil.sensors_battery()` reports a negative amount for
  seconds left.
- 2607_, [Windows]: ``WindowsService.description()`` method may fail with
  ``ERROR_NOT_FOUND``. Now it returns an empty string instead.
- 2610:, [macOS], [CRITICAL]: fix `cpu_freq()`_ segfault on ARM architectures.

**Compatibility notes**

- 2571_: dropped support for FreeBSD 8 and earlier.

7.0.0
=====

2025-02-13

**Enhancements**

- 669_, [Windows]: `net_if_addrs()`_ also returns the ``broadcast`` address
  instead of ``None``.
- 2480_: Python 2.7 is no longer supported. Latest version supporting Python
  2.7 is psutil 6.1.X. Install it with: ``pip2 install psutil==6.1.*``.
- 2490_: removed long deprecated ``Process.memory_info_ex()`` method. It was
  deprecated in psutil 4.0.0, released 8 years ago. Substitute is
  ``Process.memory_full_info()``.

**Bug fixes**

- 2496_, [Linux]: Avoid segfault (a cPython bug) on ``Process.memory_maps()``
  for processes that use hundreds of GBs of memory.
- 2502_, [macOS]: `virtual_memory()`_ now relies on ``host_statistics64``
  instead of ``host_statistics``. This is the same approach used by ``vm_stat``
  CLI tool, and should grant more accurate results.

**Compatibility notes**

- 2480_: Python 2.7 is no longer supported.
- 2490_: removed long deprecated ``Process.memory_info_ex()`` method.

6.1.1
=====

2024-12-19

**Enhancements**

- 2471_: use Vulture CLI tool to detect dead code.

**Bug fixes**

- 2418_, [Linux]: fix race condition in case /proc/PID/stat does not exist, but
  /proc/PID does, resulting in FileNotFoundError.
- 2470_, [Linux]: `users()`_ may return "localhost" instead of the actual IP
  address of the user logged in.

6.1.0
=====

2024-10-17

**Enhancements**

- 2366_, [Windows]: drastically speedup `process_iter()`_. We now determine
  process unique identity by using process "fast" create time method. This
  will considerably speedup those apps which use `process_iter()`_ only once,
  e.g. to look for a process with a certain name.
- 2446_: use pytest instead of unittest.
- 2448_: add ``make install-sysdeps`` target to install the necessary system
  dependencies (python-dev, gcc, etc.) on all supported UNIX flavors.
- 2449_: add ``make install-pydeps-test`` and ``make install-pydeps-dev``
  targets. They can be used to install dependencies meant for running tests and
  for local development. They can also be installed via ``pip install .[test]``
  and ``pip install .[dev]``.
- 2456_: allow to run tests via ``python3 -m psutil.tests`` even if ``pytest``
  module is not installed. This is useful for production environments that
  don't have pytest installed, but still want to be able to test psutil
  installation.

**Bug fixes**

- 2427_: psutil (segfault) on import in the free-threaded (no GIL) version of
  Python 3.13.  (patch by Sam Gross)
- 2455_, [Linux]: ``IndexError`` may occur when reading /proc/pid/stat and
  field 40 (blkio_ticks) is missing.
- 2457_, [AIX]: significantly improve the speed of `Process.open_files()`_ for
  some edge cases.
- 2460_, [OpenBSD]: `Process.num_fds()`_ and `Process.open_files()`_ may fail
  with `NoSuchProcess`_ for PID 0. Instead, we now return "null" values (0 and
  [] respectively).

6.0.0
======

2024-06-18

**Enhancements**

- 2109_: ``maxfile`` and ``maxpath`` fields were removed from the namedtuple
  returned by `disk_partitions()`_. Reason: on network filesystems (NFS) this
  can potentially take a very long time to complete.
- 2366_, [Windows]: log debug message when using slower process APIs.
- 2375_, [macOS]: provide arm64 wheels.  (patch by Matthieu Darbois)
- 2396_: `process_iter()`_ no longer pre-emptively checks whether PIDs have
  been reused. This makes `process_iter()`_ around 20x times faster.
- 2396_: a new ``psutil.process_iter.cache_clear()`` API can be used the clear
  `process_iter()`_ internal cache.
- 2401_, Support building with free-threaded CPython 3.13. (patch by Sam Gross)
- 2407_: `Process.connections()`_ was renamed to `Process.net_connections()`_.
  The old name is still available, but it's deprecated (triggers a
  ``DeprecationWarning``) and will be removed in the future.
- 2425_: [Linux]: provide aarch64 wheels.  (patch by Matthieu Darbois / Ben Raz)

**Bug fixes**

- 2250_, [NetBSD]: `Process.cmdline()`_ sometimes fail with EBUSY. It usually
  happens for long cmdlines with lots of arguments. In this case retry getting
  the cmdline for up to 50 times, and return an empty list as last resort.
- 2254_, [Linux]: offline cpus raise NotImplementedError in cpu_freq() (patch
  by Shade Gladden)
- 2272_: Add pickle support to psutil Exceptions.
- 2359_, [Windows], [CRITICAL]: `pid_exists()`_ disagrees with `Process`_ on
  whether a pid exists when ERROR_ACCESS_DENIED.
- 2360_, [macOS]: can't compile on macOS < 10.13.  (patch by Ryan Schmidt)
- 2362_, [macOS]: can't compile on macOS 10.11.  (patch by Ryan Schmidt)
- 2365_, [macOS]: can't compile on macOS < 10.9.  (patch by Ryan Schmidt)
- 2395_, [OpenBSD]: `pid_exists()`_ erroneously return True if the argument is
  a thread ID (TID) instead of a PID (process ID).
- 2412_, [macOS]: can't compile on macOS 10.4 PowerPC due to missing `MNT_`
  constants.

**Porting notes**

Version 6.0.0 introduces some changes which affect backward compatibility:

- 2109_: the namedtuple returned by `disk_partitions()`_' no longer has
  ``maxfile`` and ``maxpath`` fields.
- 2396_: `process_iter()`_ no longer pre-emptively checks whether PIDs have
  been reused. If you want to check for PID reusage you are supposed to use
  `Process.is_running()`_ against the yielded `Process`_ instances. That will
  also automatically remove reused PIDs from `process_iter()`_ internal cache.
- 2407_: `Process.connections()`_ was renamed to `Process.net_connections()`_.
  The old name is still available, but it's deprecated (triggers a
  ``DeprecationWarning``) and will be removed in the future.

5.9.8
=====

2024-01-19

**Enhancements**

- 2343_, [FreeBSD]: filter `net_connections()`_ returned list in C instead of
  Python, and avoid to retrieve unnecessary connection types unless explicitly
  asked. E.g., on an IDLE system with few IPv6 connections this will run around
  4 times faster. Before all connection types (TCP, UDP, UNIX) were retrieved
  internally, even if only a portion was returned.
- 2342_, [NetBSD]: same as above (#2343) but for NetBSD.
- 2349_: adopted black formatting style.

**Bug fixes**

- 930_, [NetBSD], [critical]: `net_connections()`_ implementation was broken.
  It could either leak memory or core dump.
- 2340_, [NetBSD]: if process is terminated, `Process.cwd()`_ will return an
  empty string instead of raising `NoSuchProcess`_.
- 2345_, [Linux]: fix compilation on older compiler missing DUPLEX_UNKNOWN.
- 2222_, [macOS]: `cpu_freq()` now returns fixed values for `min` and `max`
  frequencies in all Apple Silicon chips.

5.9.7
=====

2023-12-17

**Enhancements**

- 2324_: enforce Ruff rule `raw-string-in-exception`, which helps providing
  clearer tracebacks when exceptions are raised by psutil.

**Bug fixes**

- 2325_, [PyPy]: psutil did not compile on PyPy due to missing
  `PyErr_SetExcFromWindowsErrWithFilenameObject` cPython API.

5.9.6
=====

2023-10-15

**Enhancements**

- 1703_: `cpu_percent()`_ and `cpu_times_percent()`_ are now thread safe,
  meaning they can be called from different threads and still return
  meaningful and independent results. Before, if (say) 10 threads called
  ``cpu_percent(interval=None)`` at the same time, only 1 thread out of 10
  would get the right result.
- 2266_: if `Process`_ class is passed a very high PID, raise `NoSuchProcess`_
  instead of OverflowError.  (patch by Xuehai Pan)
- 2246_: drop python 3.4 & 3.5 support.  (patch by Matthieu Darbois)
- 2290_: PID reuse is now pre-emptively checked for `Process.ppid()`_  and
  `Process.parents()`_.
- 2312_: use ``ruff`` Python linter instead of ``flake8 + isort``. It's an
  order of magnitude faster + it adds a ton of new code quality checks.

**Bug fixes**

- 2195_, [Linux]: no longer print exception at import time in case /proc/stat
  can't be read due to permission error. Redirect it to ``PSUTIL_DEBUG``
  instead.
- 2241_, [NetBSD]: can't compile On NetBSD 10.99.3/amd64.  (patch by Thomas
  Klausner)
- 2245_, [Windows]: fix var unbound error on possibly in `swap_memory()`_
  (patch by student_2333)
- 2268_: ``bytes2human()`` utility function was unable to properly represent
  negative values.
- 2252_, [Windows]: `disk_usage()`_ fails on Python 3.12+.  (patch by
  Matthieu Darbois)
- 2284_, [Linux]: `Process.memory_full_info()`_ may incorrectly raise
  `ZombieProcess`_ if it's determined via ``/proc/pid/smaps_rollup``. Instead
  we now fallback on reading ``/proc/pid/smaps``.
- 2287_, [OpenBSD], [NetBSD]: `Process.is_running()`_ erroneously return
  ``False`` for zombie processes, because creation time cannot be determined.
- 2288_, [Linux]: correctly raise `ZombieProcess`_ on `Process.exe()`_,
  `Process.cmdline()`_ and `Process.memory_maps()`_ instead of returning a
  "null" value.
- 2290_: differently from what stated in the doc, PID reuse is not
  pre-emptively checked for `Process.nice()`_ (set), `Process.ionice()`_,
  (set), `Process.cpu_affinity()`_ (set), `Process.rlimit()`_
  (set), `Process.parent()`_.
- 2308_, [OpenBSD]: `Process.threads()`_ always fail with AccessDenied (also as
  root).

5.9.5
=====

2023-04-17

**Enhancements**

- 2196_: in case of exception, display a cleaner error traceback by hiding the
  `KeyError` bit deriving from a missed cache hit.
- 2217_: print the full traceback when a `DeprecationWarning` or `UserWarning`
  is raised.
- 2230_, [OpenBSD]: `net_connections()`_ implementation was rewritten
  from scratch:
  - We're now able to retrieve the path of AF_UNIX sockets (before it was an
  empty string)
  - The function is faster since it no longer iterates over all processes.
  - No longer produces duplicate connection entries.
- 2238_: there are cases where `Process.cwd()`_ cannot be determined
  (e.g. directory no longer exists), in which case we returned either ``None``
  or an empty string. This was consolidated and we now return ``""`` on all
  platforms.
- 2239_, [UNIX]: if process is a zombie, and we can only determine part of the
  its truncated `Process.name()`_ (15 chars), don't fail with `ZombieProcess`_
  when we try to guess the full name from the `Process.cmdline()`_. Just
  return the truncated name.
- 2240_, [NetBSD], [OpenBSD]: add CI testing on every commit for NetBSD and
  OpenBSD platforms (python 3 only).

**Bug fixes**

- 1043_, [OpenBSD] `net_connections()`_ returns duplicate entries.
- 1915_, [Linux]: on certain kernels, ``"MemAvailable"`` field from
  ``/proc/meminfo`` returns ``0`` (possibly a kernel bug), in which case we
  calculate an approximation for ``available`` memory which matches "free"
  CLI utility.
- 2164_, [Linux]: compilation fails on kernels < 2.6.27 (e.g. CentOS 5).
- 2186_, [FreeBSD]: compilation fails with Clang 15.  (patch by Po-Chuan Hsieh)
- 2191_, [Linux]: `disk_partitions()`_: do not unnecessarily read
  /proc/filesystems and raise `AccessDenied`_ unless user specified `all=False`
  argument.
- 2216_, [Windows]: fix tests when running in a virtual environment (patch by
  Matthieu Darbois)
- 2225_, [POSIX]: `users()`_ loses precision for ``started`` attribute (off by
  1 minute).
- 2229_, [OpenBSD]: unable to properly recognize zombie processes.
  `NoSuchProcess`_ may be raised instead of `ZombieProcess`_.
- 2231_, [NetBSD]: *available*  `virtual_memory()`_ is higher than *total*.
- 2234_, [NetBSD]: `virtual_memory()`_ metrics are wrong: *available* and
  *used* are too high. We now match values shown by *htop* CLI utility.
- 2236_, [NetBSD]: `Process.num_threads()`_ and `Process.threads()`_ return
  threads that are already terminated.
- 2237_, [OpenBSD], [NetBSD]: `Process.cwd()`_ may raise ``FileNotFoundError``
  if cwd no longer exists. Return an empty string instead.

5.9.4
=====

2022-11-07

**Enhancements**

- 2102_: use Limited API when building wheels with CPython 3.6+ on Linux,
  macOS and Windows. This allows to use pre-built wheels in all future versions
  of cPython 3.  (patch by Matthieu Darbois)

**Bug fixes**

- 2077_, [Windows]: Use system-level values for `virtual_memory()`_. (patch by
  Daniel Widdis)
- 2156_, [Linux]: compilation may fail on very old gcc compilers due to missing
  ``SPEED_UNKNOWN`` definition.  (patch by Amir Rossert)
- 2010_, [macOS]: on MacOS, arm64 ``IFM_1000_TX`` and ``IFM_1000_T`` are the
  same value, causing a build failure.  (patch by Lawrence D'Anna)
- 2160_, [Windows]: Get Windows percent swap usage from performance counters.
  (patch by Daniel Widdis)

5.9.3
=====

2022-10-18

**Enhancements**

- 2040_, [macOS]: provide wheels for arm64 architecture.  (patch by Matthieu
  Darbois)

**Bug fixes**

- 2116_, [macOS], [critical]: `net_connections()`_ fails with RuntimeError.
- 2135_, [macOS]: `Process.environ()`_ may contain garbage data. Fix
  out-of-bounds read around ``sysctl_procargs``.  (patch by Bernhard Urban-Forster)
- 2138_, [Linux], **[critical]**: can't compile psutil on Android due to
  undefined ``ethtool_cmd_speed`` symbol.
- 2142_, [POSIX]: `net_if_stats()`_ 's ``flags`` on Python 2 returned unicode
  instead of str.  (patch by Matthieu Darbois)
- 2147_, [macOS] Fix disk usage report on macOS 12+.  (patch by Matthieu Darbois)
- 2150_, [Linux] `Process.threads()`_ may raise ``NoSuchProcess``. Fix race
  condition.  (patch by Daniel Li)
- 2153_, [macOS] Fix race condition in test_posix.TestProcess.test_cmdline.
  (patch by Matthieu Darbois)

5.9.2
=====

2022-09-04

**Bug fixes**

- 2093_, [FreeBSD], **[critical]**: `pids()`_ may fail with ENOMEM. Dynamically
  increase the ``malloc()`` buffer size until it's big enough.
- 2095_, [Linux]: `net_if_stats()`_ returns incorrect interface speed for
  100GbE network cards.
- 2113_, [FreeBSD], **[critical]**: `virtual_memory()`_ may raise ENOMEM due to
  missing ``#include <sys/param.h>`` directive.  (patch by Peter Jeremy)
- 2128_, [NetBSD]: `swap_memory()`_ was miscalculated.  (patch by Thomas Klausner)

5.9.1
=====

2022-05-20

**Enhancements**

- 1053_: drop Python 2.6 support.  (patches by Matthieu Darbois and Hugo van
  Kemenade)
- 2037_: Add additional flags to net_if_stats.
- 2050_, [Linux]: increase ``read(2)`` buffer size from 1k to 32k when reading
  ``/proc`` pseudo files line by line. This should help having more consistent
  results.
- 2057_, [OpenBSD]: add support for `cpu_freq()`_.
- 2107_, [Linux]: `Process.memory_full_info()`_ (reporting process USS/PSS/Swap
  memory) now reads ``/proc/pid/smaps_rollup`` instead of ``/proc/pids/smaps``,
  which makes it 5 times faster.

**Bug fixes**

- 2048_: ``AttributeError`` is raised if ``psutil.Error`` class is raised
  manually and passed through ``str``.
- 2049_, [Linux]: `cpu_freq()`_ erroneously returns ``curr`` value in GHz while
  ``min`` and ``max`` are in MHz.
- 2050_, [Linux]: `virtual_memory()`_ may raise ``ValueError`` if running in a
  LCX container.

5.9.0
=====

2021-12-29

**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)
- 1992_: `NoSuchProcess`_ message now specifies if the PID has been reused.
- 1992_: error classes (`NoSuchProcess`_, `AccessDenied`_, etc.) now have a better
  formatted and separated ``__repr__`` and ``__str__`` implementations.
- 1996_, [BSD]: add support for MidnightBSD.  (patch by Saeed Rasooli)
- 1999_, [Linux]: `disk_partitions()`_: convert ``/dev/root`` device (an alias
  used on some Linux distros) to real root device path.
- 2005_: ``PSUTIL_DEBUG`` mode now prints file name and line number of the debug
  messages coming from C extension modules.
- 2042_: rewrite HISTORY.rst to use hyperlinks pointing to psutil API doc.

**Bug fixes**

- 1456_, [macOS], **[critical]**: `cpu_freq()`_ ``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.
- 1598_, [Windows]: `disk_partitions()`_ only returns mountpoints on drives
  where it first finds one.
- 1874_, [SunOS]: swap output error due to incorrect range.
- 1892_, [macOS]: `cpu_freq()`_ broken on Apple M1.
- 1901_, [macOS]: different functions, especially `Process.open_files()`_ and
  `Process.connections()`_, could randomly raise `AccessDenied`_ because the
  internal buffer of ``proc_pidinfo(PROC_PIDLISTFDS)`` syscall was not big enough.
  We now dynamically increase the buffer size until it's big enough instead of
  giving up and raising `AccessDenied`_, which was a fallback to avoid crashing.
- 1904_, [Windows]: ``OpenProcess`` fails with ``ERROR_SUCCESS`` due to
  ``GetLastError()`` called after ``sprintf()``.  (patch by alxchk)
- 1913_, [Linux]: `wait_procs()`_ should catch ``subprocess.TimeoutExpired``
  exception.
- 1919_, [Linux]: `sensors_battery()`_ can raise ``TypeError`` on PureOS.
- 1921_, [Windows]: `swap_memory()`_ shows committed memory instead of swap.
- 1940_, [Linux]: psutil does not handle ``ENAMETOOLONG`` when accessing process
  file descriptors in procfs.  (patch by Nikita Radchenko)
- 1948_, **[critical]**: ``memoize_when_activated`` decorator is not thread-safe.
  (patch by Xuehai Pan)
- 1953_, [Windows], **[critical]**: `disk_partitions()`_ crashes due to
  insufficient buffer len. (patch by MaWe2019)
- 1965_, [Windows], **[critical]**: fix "Fatal Python error: deallocating None"
  when calling `users()`_ multiple times.
- 1980_, [Windows]: 32bit / WoW64 processes fails to read `Process.name()`_ longer
  than 128 characters resulting in `AccessDenied`_. This is now fixed.  (patch
  by PetrPospisil)
- 1991_, **[critical]**: `process_iter()`_ is not thread safe and can raise
  ``TypeError`` if invoked from multiple threads.
- 1956_, [macOS]: `Process.cpu_times()`_ reports incorrect timings on M1 machines.
  (patch by Olivier Dormond)
- 2023_, [Linux]: `cpu_freq()`_ return order is wrong on systems with more than
  9 CPUs.

5.8.0
=====

2020-12-19

**Enhancements**

- 1863_: `disk_partitions()`_ exposes 2 extra fields: ``maxfile`` and ``maxpath``,
  which are the maximum file name and path name length.
- 1872_, [Windows]: added support for PyPy 2.7.
- 1879_: provide pre-compiled wheels for Linux and macOS (yey!).
- 1880_: get rid of Travis and Cirrus CI services (they are no longer free).
  CI testing is now done by GitHub Actions on Linux, macOS and FreeBSD (yes).
  AppVeyor is still being used for Windows CI.

**Bug fixes**

- 1708_, [Linux]: get rid of `sensors_temperatures()`_ duplicates.  (patch by Tim
  Schlueter).
- 1839_, [Windows], **[critical]**: always raise `AccessDenied`_ instead of
  ``WindowsError`` when failing to query 64 processes from 32 bit ones by using
  ``NtWoW64`` APIs.
- 1866_, [Windows], **[critical]**: `Process.exe()`_, `Process.cmdline()`_,
  `Process.environ()`_ may raise "[WinError 998] Invalid access to memory
  location" on Python 3.9 / VS 2019.
- 1874_, [SunOS]: wrong swap output given when encrypted column is present.
- 1875_, [Windows], **[critical]**: `Process.username()`_ may raise
  ``ERROR_NONE_MAPPED`` if the SID has no corresponding account name. In this
  case `AccessDenied`_ is now raised.
- 1886_, [macOS]: ``EIO`` error may be raised on `Process.cmdline()`_ and
  `Process.environ()`_. Now it gets translated into `AccessDenied`_.
- 1887_, [Windows], **[critical]**: ``OpenProcess`` may fail with
  "[WinError 0] The operation completed successfully"."
  Turn it into `AccessDenied`_ or `NoSuchProcess`_ depending on whether the
  PID is alive.
- 1891_, [macOS]: get rid of deprecated ``getpagesize()``.

5.7.3
=====

2020-10-23

**Enhancements**

- 809_, [FreeBSD]: add support for `Process.rlimit()`_.
- 893_, [BSD]: add support for `Process.environ()`_ (patch by Armin Gruner)
- 1830_, [POSIX]: `net_if_stats()`_ ``isup`` also checks whether the NIC is
  running (meaning Wi-Fi or ethernet cable is connected).  (patch by Chris Burger)
- 1837_, [Linux]: improved battery detection and charge ``secsleft`` calculation
  (patch by aristocratos)

**Bug fixes**

- 1620_, [Linux]: `cpu_count()`_ with ``logical=False`` result is incorrect on
  systems with more than one CPU socket.  (patch by Vincent A. Arcila)
- 1738_, [macOS]: `Process.exe()`_ may raise ``FileNotFoundError`` if process is still
  alive but the exe file which launched it got deleted.
- 1791_, [macOS]: fix missing include for ``getpagesize()``.
- 1823_, [Windows], **[critical]**: `Process.open_files()`_ may cause a segfault
  due to a NULL pointer.
- 1838_, [Linux]: `sensors_battery()`_: if `percent` can be determined but not
  the remaining values, still return a result instead of ``None``.
  (patch by aristocratos)

5.7.2
=====

2020-07-15

**Bug fixes**

- wheels for 2.7 were inadvertently deleted.

5.7.1
=====

2020-07-15

**Enhancements**

- 1729_: parallel tests on POSIX (``make test-parallel``). They're twice as fast!
- 1741_, [POSIX]: ``make build`` now runs in parallel on Python >= 3.6 and
  it's about 15% faster.
- 1747_: `Process.wait()`_ return value is cached so that the exit code can be
  retrieved on then next call.
- 1747_, [POSIX]: `Process.wait()`_ on POSIX now returns an enum, showing the
  negative signal which was used to terminate the process. It returns something
  like ``<Negsignal.SIGTERM: -15>``.
- 1747_: `Process`_ class provides more info about the process on ``str()``
  and ``repr()`` (status and exit code).
- 1757_: memory leak tests are now stable.
- 1768_, [Windows]: added support for Windows Nano Server. (contributed by
  Julien Lebot)

**Bug fixes**

- 1726_, [Linux]: `cpu_freq()`_ parsing should use spaces instead of tabs on ia64.
  (patch by Michał Górny)
- 1760_, [Linux]: `Process.rlimit()`_ does not handle long long type properly.
- 1766_, [macOS]: `NoSuchProcess`_ may be raised instead of `ZombieProcess`_.
- 1781_, **[critical]**: `getloadavg()`_ can crash the Python interpreter.
  (patch by Ammar Askar)

5.7.0
=====

2020-02-18

**Enhancements**

- 1637_, [SunOS]: add partial support for old SunOS 5.10 Update 0 to 3.
- 1648_, [Linux]: `sensors_temperatures()`_ looks into an additional
  ``/sys/device/`` directory for additional data.  (patch by Javad Karabi)
- 1652_, [Windows]: dropped support for Windows XP and Windows Server 2003.
  Minimum supported Windows version now is Windows Vista.
- 1671_, [FreeBSD]: add CI testing/service for FreeBSD (Cirrus CI).
- 1677_, [Windows]: `Process.exe()`_ will succeed for all process PIDs (instead of
  raising `AccessDenied`_).
- 1679_, [Windows]: `net_connections()`_ and `Process.connections()`_ are 10% faster.
- 1682_, [PyPy]: added CI / test integration for PyPy via Travis.
- 1686_, [Windows]: added support for PyPy on Windows.
- 1693_, [Windows]: `boot_time()`_, `Process.create_time()`_ and `users()`_'s
  login time now have 1 micro second precision (before the precision was of 1
  second).

**Bug fixes**

- 1538_, [NetBSD]: `Process.cwd()`_ may return ``ENOENT`` instead of `NoSuchProcess`_.
- 1627_, [Linux]: `Process.memory_maps()`_ can raise ``KeyError``.
- 1642_, [SunOS]: querying basic info for PID 0 results in ``FileNotFoundError``.
- 1646_, [FreeBSD], **[critical]**: many `Process`_ methods may cause a segfault
  due to a backward incompatible change in a C type on FreeBSD 12.0.
- 1656_, [Windows]: `Process.memory_full_info()`_ raises `AccessDenied`_ even for the
  current user and os.getpid().
- 1660_, [Windows]: `Process.open_files()`_ complete rewrite + check of errors.
- 1662_, [Windows], **[critical]**: `Process.exe()`_ may raise "[WinError 0]
  The operation completed successfully".
- 1665_, [Linux]: `disk_io_counters()`_ does not take into account extra fields
  added to recent kernels.  (patch by Mike Hommey)
- 1672_: use the right C type when dealing with PIDs (int or long). Thus far
  (long) was almost always assumed, which is wrong on most platforms.
- 1673_, [OpenBSD]: `Process.connections()`_, `Process.num_fds()`_ and
  `Process.threads()`_ returned improper exception if process is gone.
- 1674_, [SunOS]: `disk_partitions()`_ may raise ``OSError``.
- 1684_, [Linux]: `disk_io_counters()`_ may raise ``ValueError`` on systems not
  having ``/proc/diskstats``.
- 1695_, [Linux]: could not compile on kernels <= 2.6.13 due to
  ``PSUTIL_HAS_IOPRIO`` not being defined.  (patch by Anselm Kruis)

5.6.7
=====

2019-11-26

**Bug fixes**

- 1630_, [Windows], **[critical]**: can't compile source distribution due to C
  syntax error.

5.6.6
=====

2019-11-25

**Bug fixes**

- 1179_, [Linux]: `Process.cmdline()`_ now takes into account misbehaving processes
  renaming the command line and using inappropriate chars to separate args.
- 1616_, **[critical]**: use of ``Py_DECREF`` instead of ``Py_CLEAR`` will
  result in double ``free()`` and segfault
  (`CVE-2019-18874 <https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-18874>`__).
  (patch by Riccardo Schirone)
- 1619_, [OpenBSD], **[critical]**: compilation fails due to C syntax error.
  (patch by Nathan Houghton)

5.6.5
=====

2019-11-06

**Bug fixes**

- 1615_: remove ``pyproject.toml`` as it was causing installation issues.

5.6.4
=====

2019-11-04

**Enhancements**

- 1527_, [Linux]: added `Process.cpu_times()`_ ``iowait`` counter, which is the
  time spent waiting for blocking I/O to complete.
- 1565_: add PEP 517/8 build backend and requirements specification for better
  pip integration.  (patch by Bernát Gábor)

**Bug fixes**

- 875_, [Windows], **[critical]**: `Process.cmdline()`_, `Process.environ()`_ or
  `Process.cwd()`_ may occasionally fail with ``ERROR_PARTIAL_COPY`` which now
  gets translated to `AccessDenied`_.
- 1126_, [Linux], **[critical]**: `Process.cpu_affinity()`_ segfaults on CentOS
  5 / manylinux. `Process.cpu_affinity()`_ support for CentOS 5 was removed.
- 1528_, [AIX], **[critical]**: compilation error on AIX 7.2 due to 32 vs 64
  bit differences. (patch by Arnon Yaari)
- 1535_: ``type`` and ``family`` fields returned by `net_connections()`_ are not
  always turned into enums.
- 1536_, [NetBSD]: `Process.cmdline()`_ erroneously raise `ZombieProcess`_ error if
  cmdline has non encodable chars.
- 1546_: usage percent may be rounded to 0 on Python 2.
- 1552_, [Windows]: `getloadavg()`_ math for calculating 5 and 15 mins values is
  incorrect.
- 1568_, [Linux]: use CC compiler env var if defined.
- 1570_, [Windows]: ``NtWow64*`` syscalls fail to raise the proper error code
- 1585_, [OSX]: avoid calling ``close()`` (in C) on possible negative integers.
  (patch by Athos Ribeiro)
- 1606_, [SunOS], **[critical]**: compilation fails on SunOS 5.10.
  (patch by vser1)

5.6.3
=====

2019-06-11

**Enhancements**

- 1494_, [AIX]: added support for `Process.environ()`_.  (patch by Arnon Yaari)

**Bug fixes**

- 1276_, [AIX]: can't get whole `Process.cmdline()`_.  (patch by Arnon Yaari)
- 1501_, [Windows]: `Process.cmdline()`_ and `Process.exe()`_ raise unhandled
  "WinError 1168 element not found" exceptions for "Registry" and
  "Memory Compression" pseudo processes on Windows 10.
- 1526_, [NetBSD], **[critical]**: `Process.cmdline()`_ could raise
  ``MemoryError``.  (patch by Kamil Rytarowski)

5.6.2
=====

2019-04-26

**Enhancements**

- 604_, [Windows]: add new `getloadavg()`_, returning system load average
  calculation, including on Windows (emulated).  (patch by Ammar Askar)
- 1404_, [Linux]: `cpu_count()`_ with ``logical=False`` uses a second method
  (read from ``/sys/devices/system/cpu/cpu[0-9]/topology/core_id``) in order to
  determine the number of CPU cores in case ``/proc/cpuinfo`` does not provide this
  info.
- 1458_: provide coloured test output. Also show failures on
  ``KeyboardInterrupt``.
- 1464_: various docfixes (always point to Python 3 doc, fix links, etc.).
- 1476_, [Windows]: it is now possible to set process high I/O priority
  (`Process.ionice()`_). Also, I/O priority values are now exposed as 4 new
  constants: ``IOPRIO_VERYLOW``, ``IOPRIO_LOW``, ``IOPRIO_NORMAL``,
  ``IOPRIO_HIGH``.
- 1478_: add make command to re-run tests failed on last run.

**Bug fixes**

- 1223_, [Windows]: `boot_time()`_ may return incorrect value on Windows XP.
- 1456_, [Linux]: `cpu_freq()`_ returns ``None`` instead of 0.0 when ``min``
  and ``max`` fields can't be determined. (patch by Alex Manuskin)
- 1462_, [Linux]: (tests) make tests invariant to ``LANG`` setting (patch by
  Benjamin Drung)
- 1463_: `cpu_distribution.py`_ script was broken.
- 1470_, [Linux]: `disk_partitions()`_: fix corner case when ``/etc/mtab``
  doesn't exist.  (patch by Cedric Lamoriniere)
- 1471_, [SunOS]: `Process.name()`_ and `Process.cmdline()`_ can return
  ``SystemError``.  (patch by Daniel Beer)
- 1472_, [Linux]: `cpu_freq()`_ does not return all CPUs on Raspberry-pi 3.
- 1474_: fix formatting of ``psutil.tests()`` which mimics ``ps aux`` output.
- 1475_, [Windows], **[critical]**: ``OSError.winerror`` attribute wasn't
  properly checked resulting in ``WindowsError(ERROR_ACCESS_DENIED)`` being
  raised instead of `AccessDenied`_.
- 1477_, [Windows]: wrong or absent error handling for private ``NTSTATUS``
  Windows APIs. Different process methods were affected by this.
- 1480_, [Windows], **[critical]**: `cpu_count()`_ with ``logical=False`` could
  cause a crash due to fixed read violation.  (patch by Samer Masterson)
- 1486_, [AIX], [SunOS]: ``AttributeError`` when interacting with `Process`_
  methods involved into `Process.oneshot()`_ context.
- 1491_, [SunOS]: `net_if_addrs()`_: use ``free()`` against ``ifap`` struct
  on error.  (patch by Agnewee)
- 1493_, [Linux]: `cpu_freq()`_: handle the case where
  ``/sys/devices/system/cpu/cpufreq/`` exists but it's empty.

5.6.1
=====

2019-03-11

**Bug fixes**

- 1329_, [AIX]: psutil doesn't compile on AIX 6.1.  (patch by Arnon Yaari)
- 1448_, [Windows], **[critical]**: crash on import due to ``rtlIpv6AddressToStringA``
  not available on Wine.
- 1451_, [Windows], **[critical]**: `Process.memory_full_info()`_ segfaults.
  ``NtQueryVirtualMemory`` is now used instead of ``QueryWorkingSet`` to
  calculate USS memory.

5.6.0
=====

2019-03-05

**Enhancements**

- 1379_, [Windows]: `Process.suspend()`_ and `Process.resume()`_ now use
  ``NtSuspendProcess`` and ``NtResumeProcess`` instead of stopping/resuming all
  threads of a process. This is faster and more reliable (aka this is what
  ProcessHacker does).
- 1420_, [Windows]: in case of exception `disk_usage()`_ now also shows the path
  name.
- 1422_, [Windows]: Windows APIs requiring to be dynamically loaded from DLL
  libraries are now loaded only once on startup (instead of on per function
  call) significantly speeding up different functions and methods.
- 1426_, [Windows]: ``PAGESIZE`` and number of processors is now calculated on
  startup.
- 1428_: in case of error, the traceback message now shows the underlying C
  function called which failed.
- 1433_: new `Process.parents()`_ method.  (idea by Ghislain Le Meur)
- 1437_: `pids()`_ are returned in sorted order.
- 1442_: Python 3 is now the default interpreter used by Makefile.

**Bug fixes**

- 1353_: `process_iter()`_ is now thread safe (it rarely raised ``TypeError``).
- 1394_, [Windows], **[critical]**: `Process.name()`_ and `Process.exe()`_ may
  erroneously return "Registry" or fail with "[Error 0] The operation completed
  successfully".
  ``QueryFullProcessImageNameW`` is now used instead of
  ``GetProcessImageFileNameW`` in order to prevent that.
- 1411_, [BSD]: lack of ``Py_DECREF`` could cause segmentation fault on process
  instantiation.
- 1419_, [Windows]: `Process.environ()`_ raises ``NotImplementedError`` when
  querying a 64-bit process in 32-bit-WoW mode. Now it raises `AccessDenied`_.
- 1427_, [OSX]: `Process.cmdline()`_ and `Process.environ()`_ may erroneously
  raise ``OSError`` on failed ``malloc()``.
- 1429_, [Windows]: ``SE DEBUG`` was not properly set for current process. It is
  now, and it should result in less `AccessDenied`_ exceptions for low PID
  processes.
- 1432_, [Windows]: `Process.memory_info_ex()`_'s USS memory is miscalculated
  because we're not using the actual system ``PAGESIZE``.
- 1439_, [NetBSD]: `Process.connections()`_ may return incomplete results if using
  `Process.oneshot()`_.
- 1447_: original exception wasn't turned into `NoSuchProcess`_ / `AccessDenied`_
  exceptions when using `Process.oneshot()`_ context manager.

**Incompatible API changes**

- 1291_, [OSX], **[critical]**: `Process.memory_maps()`_ was removed because
  inherently broken (segfault) for years.

5.5.1
=====

2019-02-15

**Enhancements**

- 1348_, [Windows]: on Windows >= 8.1 if `Process.cmdline()`_ fails due to
  ``ERROR_ACCESS_DENIED`` attempt using ``NtQueryInformationProcess`` +
  ``ProcessCommandLineInformation``. (patch by EccoTheFlintstone)

**Bug fixes**

- 1394_, [Windows]: `Process.exe()`_ returns "[Error 0] The operation completed
  successfully" when Python process runs in "Virtual Secure Mode".
- 1402_: psutil exceptions' ``repr()`` show the internal private module path.
- 1408_, [AIX], **[critical]**: psutil won't compile on AIX 7.1 due to missing
  header.  (patch by Arnon Yaari)

5.5.0
=====

2019-01-23

**Enhancements**

- 1350_, [FreeBSD]: added support for `sensors_temperatures()`_.  (patch by Alex
  Manuskin)
- 1352_, [FreeBSD]: added support for `cpu_freq()`_.  (patch by Alex Manuskin)

