From 1e8cef9f124c881699853c26e79cd1e8a36bd03b Mon Sep 17 00:00:00 2001 From: Giampaolo Rodola Date: Fri, 7 Oct 2016 22:07:18 +0200 Subject: [PATCH] #799 / OSX: also include proc.name() in the list of grouped oneshot info --- psutil/_psosx.py | 4 +++- psutil/_psutil_osx.c | 18 ++++++++++++++++-- scripts/internal/bench_oneshot.py | 1 + 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/psutil/_psosx.py b/psutil/_psosx.py index 284fed086..361c0a8ba 100644 --- a/psutil/_psosx.py +++ b/psutil/_psosx.py @@ -68,6 +68,7 @@ ttynr=7, ctime=8, status=9, + name=10, ) pidtaskinfo_map = dict( @@ -313,7 +314,8 @@ def oneshot_exit(self): @wrap_exceptions def name(self): - return cext.proc_name(self.pid) + name = self._get_kinfo_proc()[kinfo_proc_map['name']] + return name if name is not None else cext.proc_name(self.pid) @wrap_exceptions def exe(self): diff --git a/psutil/_psutil_osx.c b/psutil/_psutil_osx.c index c0260f956..d90f3fd12 100644 --- a/psutil/_psutil_osx.c +++ b/psutil/_psutil_osx.c @@ -124,14 +124,27 @@ static PyObject * psutil_proc_kinfo_oneshot(PyObject *self, PyObject *args) { long pid; struct kinfo_proc kp; + PyObject *py_name; if (! PyArg_ParseTuple(args, "l", &pid)) return NULL; if (psutil_get_kinfo_proc(pid, &kp) == -1) return NULL; +#if PY_MAJOR_VERSION >= 3 + py_name = PyUnicode_DecodeFSDefault(kp.kp_proc.p_comm); +#else + py_name = Py_BuildValue("s", kp.kp_proc.p_comm); +#endif + if (! py_name) { + // Likely a decoding error. We don't want to fail the whole + // operation. The python module may retry with proc_name(). + PyErr_Clear(); + py_name = Py_None; + } + return Py_BuildValue( - "lllllllidi", + "lllllllidiO", (long)kp.kp_eproc.e_ppid, // (long) ppid (long)kp.kp_eproc.e_pcred.p_ruid, // (long) real uid (long)kp.kp_eproc.e_ucred.cr_uid, // (long) effective uid @@ -141,7 +154,8 @@ psutil_proc_kinfo_oneshot(PyObject *self, PyObject *args) { (long)kp.kp_eproc.e_pcred.p_svgid, // (long) saved gid kp.kp_eproc.e_tdev, // (int) tty nr PSUTIL_TV2DOUBLE(kp.kp_proc.p_starttime), // (double) create time - (int)kp.kp_proc.p_stat // (int) status + (int)kp.kp_proc.p_stat, // (int) status + py_name // (pystr) name ); } diff --git a/scripts/internal/bench_oneshot.py b/scripts/internal/bench_oneshot.py index f46b5d2c5..12a76680f 100755 --- a/scripts/internal/bench_oneshot.py +++ b/scripts/internal/bench_oneshot.py @@ -77,6 +77,7 @@ 'create_time', 'gids', 'memory_info', + 'name', 'num_ctx_switches', 'num_threads', 'ppid',