summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiampaolo Rodola <g.rodola@gmail.com>2016-01-22 18:10:42 +0100
committerGiampaolo Rodola <g.rodola@gmail.com>2016-01-22 18:10:42 +0100
commit7f789ffeb47effc9c9f824a0130212d19e2ab39c (patch)
tree81a0fb6566067464baf7ac04a8717c723cce0cc8
parent9481d97b6ad1e91670327cef649139fd4181ebc6 (diff)
downloadpsutil-7f789ffeb47effc9c9f824a0130212d19e2ab39c.tar.gz
#733: try to pass ENCODING_ERRORS_HANDLER to the C extension
-rw-r--r--psutil/_psosx.py10
-rw-r--r--psutil/_psutil_osx.c11
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