summaryrefslogtreecommitdiff
path: root/psutil/_psutil_common.c
diff options
context:
space:
mode:
Diffstat (limited to 'psutil/_psutil_common.c')
-rw-r--r--psutil/_psutil_common.c99
1 files changed, 58 insertions, 41 deletions
diff --git a/psutil/_psutil_common.c b/psutil/_psutil_common.c
index dace4724..908dbf14 100644
--- a/psutil/_psutil_common.c
+++ b/psutil/_psutil_common.c
@@ -9,14 +9,41 @@
#include <Python.h>
#include <stdio.h>
+
+// Global vars.
+int PSUTIL_DEBUG = 0;
+int PSUTIL_TESTING = 0;
+
+
+/*
+ * Backport of unicode FS APIs from Python 3.
+ * On Python 2 we just return a plain byte string
+ * which is never supposed to raise decoding errors.
+ * See: https://github.com/giampaolo/psutil/issues/1040
+ */
+#if PY_MAJOR_VERSION < 3
+PyObject *
+PyUnicode_DecodeFSDefault(char *s) {
+ return PyString_FromString(s);
+}
+
+
+PyObject *
+PyUnicode_DecodeFSDefaultAndSize(char *s, Py_ssize_t size) {
+ return PyString_FromStringAndSize(s, size);
+}
+#endif
+
+
/*
* Set OSError(errno=ESRCH, strerror="No such process") Python exception.
+ * If msg != "" the exception message will change in accordance.
*/
PyObject *
-NoSuchProcess(void) {
+NoSuchProcess(char *msg) {
PyObject *exc;
- char *msg = strerror(ESRCH);
- exc = PyObject_CallFunction(PyExc_OSError, "(is)", ESRCH, msg);
+ exc = PyObject_CallFunction(
+ PyExc_OSError, "(is)", ESRCH, strlen(msg) ? msg : strerror(ESRCH));
PyErr_SetObject(PyExc_OSError, exc);
Py_XDECREF(exc);
return NULL;
@@ -25,63 +52,53 @@ NoSuchProcess(void) {
/*
* Set OSError(errno=EACCES, strerror="Permission denied") Python exception.
+ * If msg != "" the exception message will change in accordance.
*/
PyObject *
-AccessDenied(void) {
+AccessDenied(char *msg) {
PyObject *exc;
- char *msg = strerror(EACCES);
- exc = PyObject_CallFunction(PyExc_OSError, "(is)", EACCES, msg);
+ exc = PyObject_CallFunction(
+ PyExc_OSError, "(is)", EACCES, strlen(msg) ? msg : strerror(EACCES));
PyErr_SetObject(PyExc_OSError, exc);
Py_XDECREF(exc);
return NULL;
}
-static int _psutil_testing = -1;
-
-
/*
- * Return 1 if PSUTIL_TESTING env var is set else 0.
+ * Enable testing mode. This has the same effect as setting PSUTIL_TESTING
+ * env var. This dual method exists because updating os.environ on
+ * Windows has no effect. Called on unit tests setup.
*/
-int
-psutil_testing(void) {
- if (_psutil_testing == -1) {
- if (getenv("PSUTIL_TESTING") != NULL)
- _psutil_testing = 1;
- else
- _psutil_testing = 0;
- }
- return _psutil_testing;
+PyObject *
+psutil_set_testing(PyObject *self, PyObject *args) {
+ PSUTIL_TESTING = 1;
+ Py_INCREF(Py_None);
+ return Py_None;
}
/*
- * Return True if PSUTIL_TESTING env var is set else False.
+ * Print a debug message on stderr. No-op if PSUTIL_DEBUG env var is not set.
*/
-PyObject *
-py_psutil_testing(PyObject *self, PyObject *args) {
- PyObject *res;
- res = psutil_testing() ? Py_True : Py_False;
- Py_INCREF(res);
- return res;
+void
+psutil_debug(const char* format, ...) {
+ va_list argptr;
+ va_start(argptr, format);
+ fprintf(stderr, "psutil-dubug> ");
+ vfprintf(stderr, format, argptr);
+ fprintf(stderr, "\n");
+ va_end(argptr);
}
/*
- * Backport of unicode FS APIs from Python 3.
- * On Python 2 we just return a plain byte string
- * which is never supposed to raise decoding errors.
- * See: https://github.com/giampaolo/psutil/issues/1040
+ * Called on module import on all platforms.
*/
-#if PY_MAJOR_VERSION < 3
-PyObject *
-PyUnicode_DecodeFSDefault(char *s) {
- return PyString_FromString(s);
-}
-
-
-PyObject *
-PyUnicode_DecodeFSDefaultAndSize(char *s, Py_ssize_t size) {
- return PyString_FromStringAndSize(s, size);
+void
+psutil_setup(void) {
+ if (getenv("PSUTIL_DEBUG") != NULL)
+ PSUTIL_DEBUG = 1;
+ if (getenv("PSUTIL_TESTING") != NULL)
+ PSUTIL_TESTING = 1;
}
-#endif