diff options
author | Giampaolo Rodola <g.rodola@gmail.com> | 2016-01-22 18:10:42 +0100 |
---|---|---|
committer | Giampaolo Rodola <g.rodola@gmail.com> | 2016-01-22 18:10:42 +0100 |
commit | 7f789ffeb47effc9c9f824a0130212d19e2ab39c (patch) | |
tree | 81a0fb6566067464baf7ac04a8717c723cce0cc8 | |
parent | 9481d97b6ad1e91670327cef649139fd4181ebc6 (diff) | |
download | psutil-7f789ffeb47effc9c9f824a0130212d19e2ab39c.tar.gz |
#733: try to pass ENCODING_ERRORS_HANDLER to the C extension
-rw-r--r-- | psutil/_psosx.py | 10 | ||||
-rw-r--r-- | psutil/_psutil_osx.c | 11 |
2 files changed, 17 insertions, 4 deletions
diff --git a/psutil/_psosx.py b/psutil/_psosx.py index 0e770b80..ad8b9578 100644 --- a/psutil/_psosx.py +++ b/psutil/_psosx.py @@ -7,6 +7,7 @@ import errno import functools import os +import sys from collections import namedtuple from . import _common @@ -73,6 +74,12 @@ AccessDenied = None TimeoutExpired = None +# --- utils + +def get_encoding_errors_handler(): + return sys.modules['psutil'].ENCODING_ERRORS_HANDLER + + # --- functions def virtual_memory(): @@ -222,10 +229,11 @@ class Process(object): self.pid = pid self._name = None self._ppid = None + self._encoding_errors_handler = get_encoding_errors_handler() @wrap_exceptions def name(self): - return cext.proc_name(self.pid) + return cext.proc_name(self.pid, self._encoding_errors_handler) @wrap_exceptions def exe(self): diff --git a/psutil/_psutil_osx.c b/psutil/_psutil_osx.c index be007c55..0ac41729 100644 --- a/psutil/_psutil_osx.c +++ b/psutil/_psutil_osx.c @@ -134,13 +134,18 @@ static PyObject * psutil_proc_name(PyObject *self, PyObject *args) { long pid; struct kinfo_proc kp; - if (! PyArg_ParseTuple(args, "l", &pid)) + const char *encoding_errs; + + if (! PyArg_ParseTuple(args, "ls", &pid, &encoding_errs)) return NULL; if (psutil_get_kinfo_proc(pid, &kp) == -1) return NULL; #if PY_MAJOR_VERSION >= 3 - // TODO: have python pass ENCODING_ERRORS_HANDLER as an arg - return PyUnicode_DecodeFSDefault(kp.kp_proc.p_comm); + return PyUnicode_Decode( + kp.kp_proc.p_comm, + strlen(kp.kp_proc.p_comm), + Py_FileSystemDefaultEncoding, + encoding_errs); #else return Py_BuildValue("s", kp.kp_proc.p_comm); #endif |