Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(62)

Unified Diff: third_party/psutil/psutil/_psutil_bsd.c

Issue 8159001: Update third_party/psutil and fix the licence issue with it. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: remove the suppression and unnecessary files. Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/psutil/psutil/_psutil_bsd.h ('k') | third_party/psutil/psutil/_psutil_common.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/psutil/psutil/_psutil_bsd.c
diff --git a/third_party/psutil/psutil/_psutil_bsd.c b/third_party/psutil/psutil/_psutil_bsd.c
index 7586d9f1f54f5763aaad96dc270914186adb1310..d937cbf4c1efcc47bbca100c344f3f89497a7747 100644
--- a/third_party/psutil/psutil/_psutil_bsd.c
+++ b/third_party/psutil/psutil/_psutil_bsd.c
@@ -1,5 +1,9 @@
/*
- * $Id: _psutil_bsd.c 780 2010-11-10 18:42:47Z jloden $
+ * $Id: _psutil_bsd.c 1142 2011-10-05 18:45:49Z g.rodola $
+ *
+ * Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
*
* FreeBSD platform-specific module methods for _psutil_bsd
*/
@@ -16,127 +20,19 @@
#include <sys/user.h>
#include <sys/proc.h>
#include <sys/vmmeter.h> /* needed for vmtotal struct */
+#include <sys/mount.h>
+// network-related stuff
+#include <net/if.h>
+#include <net/if_dl.h>
+#include <net/route.h>
#include "_psutil_bsd.h"
+#include "_psutil_common.h"
#include "arch/bsd/process_info.h"
-/*
- * define the psutil C module methods and initialize the module.
- */
-static PyMethodDef
-PsutilMethods[] =
-{
- // --- per-process functions
-
- {"get_process_name", get_process_name, METH_VARARGS,
- "Return process name"},
- {"get_process_cmdline", get_process_cmdline, METH_VARARGS,
- "Return process cmdline as a list of cmdline arguments"},
- {"get_process_ppid", get_process_ppid, METH_VARARGS,
- "Return process ppid as an integer"},
- {"get_process_uid", get_process_uid, METH_VARARGS,
- "Return process real user id as an integer"},
- {"get_process_gid", get_process_gid, METH_VARARGS,
- "Return process real group id as an integer"},
- {"get_cpu_times", get_cpu_times, METH_VARARGS,
- "Return tuple of user/kern time for the given PID"},
- {"get_process_create_time", get_process_create_time, METH_VARARGS,
- "Return a float indicating the process create time expressed in "
- "seconds since the epoch"},
- {"get_memory_info", get_memory_info, METH_VARARGS,
- "Return a tuple of RSS/VMS memory information"},
- {"get_process_num_threads", get_process_num_threads, METH_VARARGS,
- "Return number of threads used by process"},
-
-
- // --- system-related functions
-
- {"get_pid_list", get_pid_list, METH_VARARGS,
- "Returns a list of PIDs currently running on the system"},
- {"get_num_cpus", get_num_cpus, METH_VARARGS,
- "Return number of CPUs on the system"},
- {"get_total_phymem", get_total_phymem, METH_VARARGS,
- "Return the total amount of physical memory, in bytes"},
- {"get_avail_phymem", get_avail_phymem, METH_VARARGS,
- "Return the amount of available physical memory, in bytes"},
- {"get_total_virtmem", get_total_virtmem, METH_VARARGS,
- "Return the total amount of virtual memory, in bytes"},
- {"get_avail_virtmem", get_avail_virtmem, METH_VARARGS,
- "Return the amount of available virtual memory, in bytes"},
- {"get_system_cpu_times", get_system_cpu_times, METH_VARARGS,
- "Return system cpu times as a tuple (user, system, nice, idle, irc)"},
-
- {NULL, NULL, 0, NULL}
-};
-
-struct module_state {
- PyObject *error;
-};
-
-#if PY_MAJOR_VERSION >= 3
-#define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
-#else
-#define GETSTATE(m) (&_state)
-static struct module_state _state;
-#endif
-
-#if PY_MAJOR_VERSION >= 3
-
-static int
-psutil_bsd_traverse(PyObject *m, visitproc visit, void *arg) {
- Py_VISIT(GETSTATE(m)->error);
- return 0;
-}
-static int
-psutil_bsd_clear(PyObject *m) {
- Py_CLEAR(GETSTATE(m)->error);
- return 0;
-}
-
-static struct PyModuleDef
-moduledef = {
- PyModuleDef_HEAD_INIT,
- "psutil_bsd",
- NULL,
- sizeof(struct module_state),
- PsutilMethods,
- NULL,
- psutil_bsd_traverse,
- psutil_bsd_clear,
- NULL
-};
-
-#define INITERROR return NULL
-
-PyObject *
-PyInit__psutil_bsd(void)
-
-#else
-#define INITERROR return
-
-void init_psutil_bsd(void)
-#endif
-{
-#if PY_MAJOR_VERSION >= 3
- PyObject *module = PyModule_Create(&moduledef);
-#else
- PyObject *module = Py_InitModule("_psutil_bsd", PsutilMethods);
-#endif
- if (module == NULL) {
- INITERROR;
- }
- struct module_state *st = GETSTATE(module);
-
- st->error = PyErr_NewException("_psutil_bsd.Error", NULL, NULL);
- if (st->error == NULL) {
- Py_DECREF(module);
- INITERROR;
- }
-#if PY_MAJOR_VERSION >= 3
- return module;
-#endif
-}
+// convert a timeval struct to a double
+#define TV2DOUBLE(t) ((t).tv_sec + (t).tv_usec / 1000000.0)
/*
@@ -161,11 +57,9 @@ get_kinfo_proc(const pid_t pid, struct kinfo_proc *proc)
/*
* sysctl stores 0 in the size if we can't find the process information.
- * Set errno to ESRCH which will be translated in NoSuchProcess later on.
*/
if (size == 0) {
- errno = ESRCH;
- PyErr_SetFromErrno(PyExc_OSError);
+ NoSuchProcess();
return -1;
}
return 0;
@@ -207,6 +101,28 @@ get_pid_list(PyObject* self, PyObject* args)
/*
+ * Return a Python float indicating the system boot time expressed in
+ * seconds since the epoch.
+ */
+static PyObject*
+get_system_boot_time(PyObject* self, PyObject* args)
+{
+ /* fetch sysctl "kern.boottime" */
+ static int request[2] = { CTL_KERN, KERN_BOOTTIME };
+ struct timeval result;
+ size_t result_len = sizeof result;
+ time_t boot_time = 0;
+
+ if (sysctl(request, 2, &result, &result_len, NULL, 0) == -1) {
+ PyErr_SetFromErrno(0);
+ return NULL;
+ }
+ boot_time = result.tv_sec;
+ return Py_BuildValue("f", (float)boot_time);
+}
+
+
+/*
* Return process name from kinfo_proc as a Python string.
*/
static PyObject*
@@ -225,6 +141,47 @@ get_process_name(PyObject* self, PyObject* args)
/*
+ * Return process pathname executable.
+ * Thanks to Robert N. M. Watson:
+ * http://fxr.googlebit.com/source/usr.bin/procstat/procstat_bin.c?v=8-CURRENT
+ */
+static PyObject*
+get_process_exe(PyObject* self, PyObject* args)
+{
+ long pid;
+ char pathname[PATH_MAX];
+ int error;
+ int mib[4];
+ size_t size;
+
+ if (! PyArg_ParseTuple(args, "l", &pid)) {
+ return NULL;
+ }
+
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_PROC;
+ mib[2] = KERN_PROC_PATHNAME;
+ mib[3] = pid;
+
+ size = sizeof(pathname);
+ error = sysctl(mib, 4, pathname, &size, NULL, 0);
+ if (error == -1) {
+ PyErr_SetFromErrno(PyExc_OSError);
+ return NULL;
+ }
+ if (size == 0 || strlen(pathname) == 0) {
+ if (pid_exists(pid) == 0) {
+ return NoSuchProcess();
+ }
+ else {
+ strcpy(pathname, "");
+ }
+ }
+ return Py_BuildValue("s", pathname);
+}
+
+
+/*
* Return process cmdline as a Python list of cmdline arguments.
*/
static PyObject*
@@ -268,10 +225,29 @@ get_process_ppid(PyObject* self, PyObject* args)
/*
- * Return process real uid from kinfo_proc as a Python integer.
+ * Return process status as a Python integer.
+ */
+static PyObject*
+get_process_status(PyObject* self, PyObject* args)
+{
+ long pid;
+ struct kinfo_proc kp;
+ if (! PyArg_ParseTuple(args, "l", &pid)) {
+ return NULL;
+ }
+ if (get_kinfo_proc(pid, &kp) == -1) {
+ return NULL;
+ }
+ return Py_BuildValue("i", (int)kp.ki_stat);
+}
+
+
+/*
+ * Return process real, effective and saved user ids from kinfo_proc
+ * as a Python tuple.
*/
static PyObject*
-get_process_uid(PyObject* self, PyObject* args)
+get_process_uids(PyObject* self, PyObject* args)
{
long pid;
struct kinfo_proc kp;
@@ -281,15 +257,18 @@ get_process_uid(PyObject* self, PyObject* args)
if (get_kinfo_proc(pid, &kp) == -1) {
return NULL;
}
- return Py_BuildValue("l", (long)kp.ki_ruid);
+ return Py_BuildValue("lll", (long)kp.ki_ruid,
+ (long)kp.ki_uid,
+ (long)kp.ki_svuid);
}
/*
- * Return process real group id from ki_comm as a Python integer.
+ * Return process real, effective and saved group ids from kinfo_proc
+ * as a Python tuple.
*/
static PyObject*
-get_process_gid(PyObject* self, PyObject* args)
+get_process_gids(PyObject* self, PyObject* args)
{
long pid;
struct kinfo_proc kp;
@@ -299,7 +278,28 @@ get_process_gid(PyObject* self, PyObject* args)
if (get_kinfo_proc(pid, &kp) == -1) {
return NULL;
}
- return Py_BuildValue("l", (long)kp.ki_rgid);
+ return Py_BuildValue("lll", (long)kp.ki_rgid,
+ (long)kp.ki_groups[0],
+ (long)kp.ki_svuid);
+}
+
+
+/*
+ * Return process real, effective and saved group ids from kinfo_proc
+ * as a Python tuple.
+ */
+static PyObject*
+get_process_tty_nr(PyObject* self, PyObject* args)
+{
+ long pid;
+ struct kinfo_proc kp;
+ if (! PyArg_ParseTuple(args, "l", &pid)) {
+ return NULL;
+ }
+ if (get_kinfo_proc(pid, &kp) == -1) {
+ return NULL;
+ }
+ return Py_BuildValue("i", kp.ki_tdev);
}
@@ -321,9 +321,74 @@ get_process_num_threads(PyObject* self, PyObject* args)
}
+/*
+ * Retrieves all threads used by process returning a list of tuples
+ * including thread id, user time and system time.
+ * Thanks to Robert N. M. Watson:
+ * http://fxr.googlebit.com/source/usr.bin/procstat/procstat_threads.c?v=8-CURRENT
+ */
+static PyObject*
+get_process_threads(PyObject* self, PyObject* args)
+{
+ long pid;
+ int mib[4];
+ struct kinfo_proc *kip;
+ struct kinfo_proc *kipp;
+ int error;
+ unsigned int i;
+ size_t size;
+ PyObject* retList = PyList_New(0);
+ PyObject* pyTuple = NULL;
-// convert a timeval struct to a double
-#define TV2DOUBLE(t) ((t).tv_sec + (t).tv_usec / 1000000.0)
+ if (! PyArg_ParseTuple(args, "l", &pid)) {
+ return NULL;
+ }
+
+ /*
+ * We need to re-query for thread information, so don't use *kipp.
+ */
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_PROC;
+ mib[2] = KERN_PROC_PID | KERN_PROC_INC_THREAD;
+ mib[3] = pid;
+
+ size = 0;
+ error = sysctl(mib, 4, NULL, &size, NULL, 0);
+ if (error == -1) {
+ PyErr_SetFromErrno(PyExc_OSError);
+ return NULL;
+ }
+ if (size == 0) {
+ return NoSuchProcess();
+ }
+
+ kip = malloc(size);
+ if (kip == NULL) {
+ PyErr_SetFromErrno(PyExc_OSError);
+ return NULL;
+ }
+
+ error = sysctl(mib, 4, kip, &size, NULL, 0);
+ if (error == -1) {
+ PyErr_SetFromErrno(PyExc_OSError);
+ return NULL;
+ }
+ if (size == 0) {
+ return NoSuchProcess();
+ }
+
+ for (i = 0; i < size / sizeof(*kipp); i++) {
+ kipp = &kip[i];
+ pyTuple = Py_BuildValue("Idd", kipp->ki_tid,
+ TV2DOUBLE(kipp->ki_rusage.ru_utime),
+ TV2DOUBLE(kipp->ki_rusage.ru_stime)
+ );
+ PyList_Append(retList, pyTuple);
+ Py_XDECREF(pyTuple);
+ }
+ free(kip);
+ return retList;
+}
/*
@@ -391,6 +456,29 @@ get_process_create_time(PyObject* self, PyObject* args)
/*
+ * Return a Python float indicating the process create time expressed in
+ * seconds since the epoch.
+ */
+static PyObject*
+get_process_io_counters(PyObject* self, PyObject* args)
+{
+ long pid;
+ struct kinfo_proc kp;
+ if (! PyArg_ParseTuple(args, "l", &pid)) {
+ return NULL;
+ }
+ if (get_kinfo_proc(pid, &kp) == -1) {
+ return NULL;
+ }
+ // there's apparently no way to determine bytes count, hence return -1.
+ return Py_BuildValue("(llll)", kp.ki_rusage.ru_inblock,
+ kp.ki_rusage.ru_oublock,
+ -1, -1);
+}
+
+
+
+/*
* Return the RSS and VMS as a Python tuple.
*/
static PyObject*
@@ -546,15 +634,6 @@ get_system_cpu_times(PyObject* self, PyObject* args)
return NULL;
}
- /*
- #define CP_USER 0
- #define CP_NICE 1
- #define CP_SYS 2
- #define CP_INTR 3
- #define CP_IDLE 4
- #define CPUSTATES 5
- */
- //user, nice, system, idle, iowait, irqm, softirq
return Py_BuildValue("(ddddd)",
(double)cpu_time[CP_USER] / CLOCKS_PER_SEC,
(double)cpu_time[CP_NICE] / CLOCKS_PER_SEC,
@@ -564,3 +643,317 @@ get_system_cpu_times(PyObject* self, PyObject* args)
);
}
+
+/*
+ * Return a Python list of tuple representing per-cpu times
+ */
+static PyObject*
+get_system_per_cpu_times(PyObject* self, PyObject* args)
+{
+ static int maxcpus;
+ int mib[2];
+ int ncpu;
+ size_t len;
+ size_t size;
+ int i;
+ PyObject* py_retlist = PyList_New(0);
+ PyObject* py_cputime;
+
+ // retrieve maxcpus value
+ size = sizeof(maxcpus);
+ if (sysctlbyname("kern.smp.maxcpus", &maxcpus, &size, NULL, 0) < 0) {
+ PyErr_SetFromErrno(0);
+ return NULL;
+ }
+ long cpu_time[maxcpus][CPUSTATES];
+
+ // retrieve the number of cpus
+ mib[0] = CTL_HW;
+ mib[1] = HW_NCPU;
+ len = sizeof(ncpu);
+ if (sysctl(mib, 2, &ncpu, &len, NULL, 0) == -1) {
+ PyErr_SetFromErrno(0);
+ return NULL;
+ }
+
+ // per-cpu info
+ size = sizeof(cpu_time);
+ if (sysctlbyname("kern.cp_times", &cpu_time, &size, NULL, 0) == -1) {
+ PyErr_SetFromErrno(0);
+ return NULL;
+ }
+
+ for (i = 0; i < ncpu; i++) {
+ py_cputime = Py_BuildValue("(ddddd)",
+ (double)cpu_time[i][CP_USER] / CLOCKS_PER_SEC,
+ (double)cpu_time[i][CP_NICE] / CLOCKS_PER_SEC,
+ (double)cpu_time[i][CP_SYS] / CLOCKS_PER_SEC,
+ (double)cpu_time[i][CP_IDLE] / CLOCKS_PER_SEC,
+ (double)cpu_time[i][CP_INTR] / CLOCKS_PER_SEC
+ );
+ PyList_Append(py_retlist, py_cputime);
+ Py_XDECREF(py_cputime);
+ }
+
+ return py_retlist;
+}
+
+
+/*
+ * Return a list of tuples including device, mount point and fs type
+ * for all partitions mounted on the system.
+ */
+static PyObject*
+get_disk_partitions(PyObject* self, PyObject* args)
+{
+ int num;
+ int i;
+ long len;
+ struct statfs *fs;
+ PyObject* py_retlist = PyList_New(0);
+ PyObject* py_tuple;
+
+ // get the number of mount points
+ Py_BEGIN_ALLOW_THREADS
+ num = getfsstat(NULL, 0, MNT_NOWAIT);
+ Py_END_ALLOW_THREADS
+ if (num == -1) {
+ PyErr_SetFromErrno(0);
+ return NULL;
+ }
+
+ len = sizeof(*fs) * num;
+ fs = malloc(len);
+
+ Py_BEGIN_ALLOW_THREADS
+ num = getfsstat(fs, len, MNT_NOWAIT);
+ Py_END_ALLOW_THREADS
+ if (num == -1) {
+ free(fs);
+ PyErr_SetFromErrno(0);
+ return NULL;
+ }
+
+ for (i = 0; i < num; i++) {
+ py_tuple = Py_BuildValue("(sss)", fs[i].f_mntfromname, // device
+ fs[i].f_mntonname, // mount point
+ fs[i].f_fstypename); // fs type
+ PyList_Append(py_retlist, py_tuple);
+ Py_XDECREF(py_tuple);
+ }
+
+ free(fs);
+ return py_retlist;
+}
+
+
+/*
+ * Return a Python list of named tuples with overall network I/O information
+ */
+static PyObject*
+get_network_io_counters(PyObject* self, PyObject* args)
+{
+ PyObject* py_retdict = PyDict_New();
+ PyObject* py_ifc_info;
+
+ char *buf = NULL, *lim, *next;
+ struct if_msghdr *ifm;
+ int mib[6];
+ size_t len;
+
+ mib[0] = CTL_NET; // networking subsystem
+ mib[1] = PF_ROUTE; // type of information
+ mib[2] = 0; // protocol (IPPROTO_xxx)
+ mib[3] = 0; // address family
+ mib[4] = NET_RT_IFLIST; // operation
+ mib[5] = 0;
+
+ if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {
+ Py_DECREF(py_retdict);
+ PyErr_SetFromErrno(0);
+ return NULL;
+ }
+
+
+ buf = malloc(len);
+
+ if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
+ if (buf) {
+ free(buf);
+ }
+ Py_DECREF(py_retdict);
+ PyErr_SetFromErrno(0);
+ return NULL;
+ }
+
+ lim = buf + len;
+
+ for (next = buf; next < lim; ) {
+ ifm = (struct if_msghdr *)next;
+ next += ifm->ifm_msglen;
+
+ if (ifm->ifm_type == RTM_IFINFO) {
+ struct if_msghdr *if2m = (struct if_msghdr *)ifm;
+ struct sockaddr_dl *sdl = (struct sockaddr_dl *)(if2m + 1);
+ char ifc_name[32];
+
+ strncpy(ifc_name, sdl->sdl_data, sdl->sdl_nlen);
+ ifc_name[sdl->sdl_nlen] = 0;
+
+ py_ifc_info = Py_BuildValue("(KKKK)",
+ if2m->ifm_data.ifi_obytes,
+ if2m->ifm_data.ifi_ibytes,
+ if2m->ifm_data.ifi_opackets,
+ if2m->ifm_data.ifi_ipackets);
+ PyDict_SetItemString(py_retdict, ifc_name, py_ifc_info);
+ Py_XDECREF(py_ifc_info);
+ }
+ else {
+ continue;
+ }
+ }
+
+ return py_retdict;
+}
+
+
+
+
+/*
+ * define the psutil C module methods and initialize the module.
+ */
+static PyMethodDef
+PsutilMethods[] =
+{
+ // --- per-process functions
+
+ {"get_process_name", get_process_name, METH_VARARGS,
+ "Return process name"},
+ {"get_process_exe", get_process_exe, METH_VARARGS,
+ "Return process pathname executable"},
+ {"get_process_cmdline", get_process_cmdline, METH_VARARGS,
+ "Return process cmdline as a list of cmdline arguments"},
+ {"get_process_ppid", get_process_ppid, METH_VARARGS,
+ "Return process ppid as an integer"},
+ {"get_process_uids", get_process_uids, METH_VARARGS,
+ "Return process real effective and saved user ids as a Python tuple"},
+ {"get_process_gids", get_process_gids, METH_VARARGS,
+ "Return process real effective and saved group ids as a Python tuple"},
+ {"get_cpu_times", get_cpu_times, METH_VARARGS,
+ "Return tuple of user/kern time for the given PID"},
+ {"get_process_create_time", get_process_create_time, METH_VARARGS,
+ "Return a float indicating the process create time expressed in "
+ "seconds since the epoch"},
+ {"get_memory_info", get_memory_info, METH_VARARGS,
+ "Return a tuple of RSS/VMS memory information"},
+ {"get_process_num_threads", get_process_num_threads, METH_VARARGS,
+ "Return number of threads used by process"},
+ {"get_process_threads", get_process_threads, METH_VARARGS,
+ "Return process threads"},
+ {"get_process_status", get_process_status, METH_VARARGS,
+ "Return process status as an integer"},
+ {"get_process_io_counters", get_process_io_counters, METH_VARARGS,
+ "Return process IO counters"},
+ {"get_process_tty_nr", get_process_tty_nr, METH_VARARGS,
+ "Return process tty (terminal) number"},
+
+
+ // --- system-related functions
+
+ {"get_pid_list", get_pid_list, METH_VARARGS,
+ "Returns a list of PIDs currently running on the system"},
+ {"get_num_cpus", get_num_cpus, METH_VARARGS,
+ "Return number of CPUs on the system"},
+ {"get_total_phymem", get_total_phymem, METH_VARARGS,
+ "Return the total amount of physical memory, in bytes"},
+ {"get_avail_phymem", get_avail_phymem, METH_VARARGS,
+ "Return the amount of available physical memory, in bytes"},
+ {"get_total_virtmem", get_total_virtmem, METH_VARARGS,
+ "Return the total amount of virtual memory, in bytes"},
+ {"get_avail_virtmem", get_avail_virtmem, METH_VARARGS,
+ "Return the amount of available virtual memory, in bytes"},
+ {"get_system_cpu_times", get_system_cpu_times, METH_VARARGS,
+ "Return system cpu times as a tuple (user, system, nice, idle, irc)"},
+ {"get_system_per_cpu_times", get_system_per_cpu_times, METH_VARARGS,
+ "Return system per-cpu times as a list of tuples"},
+ {"get_system_boot_time", get_system_boot_time, METH_VARARGS,
+ "Return a float indicating the system boot time expressed in "
+ "seconds since the epoch"},
+ {"get_disk_partitions", get_disk_partitions, METH_VARARGS,
+ "Return a list of tuples including device, mount point and "
+ "fs type for all partitions mounted on the system."},
+ {"get_network_io_counters", get_network_io_counters, METH_VARARGS,
+ "Return dict of tuples of networks I/O information."},
+
+ {NULL, NULL, 0, NULL}
+};
+
+struct module_state {
+ PyObject *error;
+};
+
+#if PY_MAJOR_VERSION >= 3
+#define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
+#else
+#define GETSTATE(m) (&_state)
+#endif
+
+#if PY_MAJOR_VERSION >= 3
+
+static int
+psutil_bsd_traverse(PyObject *m, visitproc visit, void *arg) {
+ Py_VISIT(GETSTATE(m)->error);
+ return 0;
+}
+
+static int
+psutil_bsd_clear(PyObject *m) {
+ Py_CLEAR(GETSTATE(m)->error);
+ return 0;
+}
+
+static struct PyModuleDef
+moduledef = {
+ PyModuleDef_HEAD_INIT,
+ "psutil_bsd",
+ NULL,
+ sizeof(struct module_state),
+ PsutilMethods,
+ NULL,
+ psutil_bsd_traverse,
+ psutil_bsd_clear,
+ NULL
+};
+
+#define INITERROR return NULL
+
+PyObject *
+PyInit__psutil_bsd(void)
+
+#else
+#define INITERROR return
+
+void init_psutil_bsd(void)
+#endif
+{
+#if PY_MAJOR_VERSION >= 3
+ PyObject *module = PyModule_Create(&moduledef);
+#else
+ PyObject *module = Py_InitModule("_psutil_bsd", PsutilMethods);
+#endif
+ PyModule_AddIntConstant(module, "SSTOP", SSTOP);
+ PyModule_AddIntConstant(module, "SSLEEP", SSLEEP);
+ PyModule_AddIntConstant(module, "SRUN", SRUN);
+ PyModule_AddIntConstant(module, "SIDL", SIDL);
+ PyModule_AddIntConstant(module, "SWAIT", SWAIT);
+ PyModule_AddIntConstant(module, "SLOCK", SLOCK);
+ PyModule_AddIntConstant(module, "SZOMB", SZOMB);
+
+ if (module == NULL) {
+ INITERROR;
+ }
+#if PY_MAJOR_VERSION >= 3
+ return module;
+#endif
+}
+
« no previous file with comments | « third_party/psutil/psutil/_psutil_bsd.h ('k') | third_party/psutil/psutil/_psutil_common.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698