summaryrefslogtreecommitdiff
path: root/psutil/_psosx.py
diff options
context:
space:
mode:
Diffstat (limited to 'psutil/_psosx.py')
-rw-r--r--psutil/_psosx.py84
1 files changed, 30 insertions, 54 deletions
diff --git a/psutil/_psosx.py b/psutil/_psosx.py
index e4296495..eda70d21 100644
--- a/psutil/_psosx.py
+++ b/psutil/_psosx.py
@@ -4,7 +4,6 @@
"""macOS platform implementation."""
-import contextlib
import errno
import functools
import os
@@ -35,7 +34,7 @@ __extra__all__ = []
# =====================================================================
-PAGESIZE = os.sysconf("SC_PAGE_SIZE")
+PAGESIZE = cext_posix.getpagesize()
AF_LINK = cext_posix.AF_LINK
TCP_STATUSES = {
@@ -159,9 +158,9 @@ def cpu_count_logical():
return cext.cpu_count_logical()
-def cpu_count_physical():
- """Return the number of physical CPUs in the system."""
- return cext.cpu_count_phys()
+def cpu_count_cores():
+ """Return the number of CPU cores in the system."""
+ return cext.cpu_count_cores()
def cpu_stats():
@@ -201,7 +200,9 @@ def disk_partitions(all=False):
if not all:
if not os.path.isabs(device) or not os.path.exists(device):
continue
- ntuple = _common.sdiskpart(device, mountpoint, fstype, opts)
+ maxfile = maxpath = None # set later
+ ntuple = _common.sdiskpart(device, mountpoint, fstype, opts,
+ maxfile, maxpath)
retlist.append(ntuple)
return retlist
@@ -262,7 +263,7 @@ def net_if_stats():
for name in names:
try:
mtu = cext_posix.net_if_mtu(name)
- isup = cext_posix.net_if_flags(name)
+ isup = cext_posix.net_if_is_running(name)
duplex, speed = cext_posix.net_if_duplex_speed(name)
except OSError as err:
# https://github.com/giampaolo/psutil/issues/1279
@@ -324,6 +325,14 @@ def pids():
pid_exists = _psposix.pid_exists
+def is_zombie(pid):
+ try:
+ st = cext.proc_kinfo_oneshot(pid)[kinfo_proc_map['status']]
+ return st == cext.SZOMB
+ except Exception:
+ return False
+
+
def wrap_exceptions(fun):
"""Decorator which translates bare OSError exceptions into
NoSuchProcess and AccessDenied.
@@ -333,7 +342,10 @@ def wrap_exceptions(fun):
try:
return fun(self, *args, **kwargs)
except ProcessLookupError:
- raise NoSuchProcess(self.pid, self._name)
+ if is_zombie(self.pid):
+ raise ZombieProcess(self.pid, self._name, self._ppid)
+ else:
+ raise NoSuchProcess(self.pid, self._name)
except PermissionError:
raise AccessDenied(self.pid, self._name)
except cext.ZombieProcessError:
@@ -341,32 +353,6 @@ def wrap_exceptions(fun):
return wrapper
-@contextlib.contextmanager
-def catch_zombie(proc):
- """There are some poor C APIs which incorrectly raise ESRCH when
- the process is still alive or it's a zombie, or even RuntimeError
- (those who don't set errno). This is here in order to solve:
- https://github.com/giampaolo/psutil/issues/1044
- """
- try:
- yield
- except (OSError, RuntimeError) as err:
- if isinstance(err, RuntimeError) or err.errno == errno.ESRCH:
- try:
- # status() is not supposed to lie and correctly detect
- # zombies so if it raises ESRCH it's true.
- status = proc.status()
- except NoSuchProcess:
- raise err
- else:
- if status == _common.STATUS_ZOMBIE:
- raise ZombieProcess(proc.pid, proc._name, proc._ppid)
- else:
- raise AccessDenied(proc.pid, proc._name)
- else:
- raise
-
-
class Process(object):
"""Wrapper class around underlying C implementation."""
@@ -389,8 +375,7 @@ class Process(object):
@memoize_when_activated
def _get_pidtaskinfo(self):
# Note: should work for PIDs owned by user only.
- with catch_zombie(self):
- ret = cext.proc_pidtaskinfo_oneshot(self.pid)
+ ret = cext.proc_pidtaskinfo_oneshot(self.pid)
assert len(ret) == len(pidtaskinfo_map)
return ret
@@ -409,18 +394,15 @@ class Process(object):
@wrap_exceptions
def exe(self):
- with catch_zombie(self):
- return cext.proc_exe(self.pid)
+ return cext.proc_exe(self.pid)
@wrap_exceptions
def cmdline(self):
- with catch_zombie(self):
- return cext.proc_cmdline(self.pid)
+ return cext.proc_cmdline(self.pid)
@wrap_exceptions
def environ(self):
- with catch_zombie(self):
- return parse_environ_block(cext.proc_environ(self.pid))
+ return parse_environ_block(cext.proc_environ(self.pid))
@wrap_exceptions
def ppid(self):
@@ -429,8 +411,7 @@ class Process(object):
@wrap_exceptions
def cwd(self):
- with catch_zombie(self):
- return cext.proc_cwd(self.pid)
+ return cext.proc_cwd(self.pid)
@wrap_exceptions
def uids(self):
@@ -503,8 +484,7 @@ class Process(object):
if self.pid == 0:
return []
files = []
- with catch_zombie(self):
- rawlist = cext.proc_open_files(self.pid)
+ rawlist = cext.proc_open_files(self.pid)
for path, fd in rawlist:
if isfile_strict(path):
ntuple = _common.popenfile(path, fd)
@@ -517,8 +497,7 @@ class Process(object):
raise ValueError("invalid %r kind argument; choose between %s"
% (kind, ', '.join([repr(x) for x in conn_tmap])))
families, types = conn_tmap[kind]
- with catch_zombie(self):
- rawlist = cext.proc_connections(self.pid, families, types)
+ rawlist = cext.proc_connections(self.pid, families, types)
ret = []
for item in rawlist:
fd, fam, type, laddr, raddr, status = item
@@ -531,8 +510,7 @@ class Process(object):
def num_fds(self):
if self.pid == 0:
return 0
- with catch_zombie(self):
- return cext.proc_num_fds(self.pid)
+ return cext.proc_num_fds(self.pid)
@wrap_exceptions
def wait(self, timeout=None):
@@ -540,13 +518,11 @@ class Process(object):
@wrap_exceptions
def nice_get(self):
- with catch_zombie(self):
- return cext_posix.getpriority(self.pid)
+ return cext_posix.getpriority(self.pid)
@wrap_exceptions
def nice_set(self, value):
- with catch_zombie(self):
- return cext_posix.setpriority(self.pid, value)
+ return cext_posix.setpriority(self.pid, value)
@wrap_exceptions
def status(self):