diff options
author | Giampaolo Rodola <g.rodola@gmail.com> | 2020-01-29 00:08:14 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-01-29 00:08:14 +0100 |
commit | 994c429c010049a6a0556ce3b0d1af1f86f27867 (patch) | |
tree | 0042fbc7c863f2cc1ff3cd81c29d6450f0af6a8e | |
parent | 0e8e5a983ac7e346224cfaa45856738628c1bdc5 (diff) | |
download | psutil-994c429c010049a6a0556ce3b0d1af1f86f27867.tar.gz |
Properly handle PID type in C (#1672)
32 files changed, 301 insertions, 245 deletions
diff --git a/HISTORY.rst b/HISTORY.rst index 3f2a81b0..9b6dd984 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -26,6 +26,7 @@ XXXX-XX-XX - 1662_: [Windows] process exe() may raise WinError 0. - 1665_: [Linux] disk_io_counters() does not take into account extra fields added to recent kernels. (patch by Mike Hommey) +- 1672_: properly handle PID C type. - 1673_: [OpenBSD] Process connections(), num_fds() and threads() returned improper exception if process is gone. diff --git a/INSTALL.rst b/INSTALL.rst index 2b1ea329..c3b9e91c 100644 --- a/INSTALL.rst +++ b/INSTALL.rst @@ -93,7 +93,7 @@ OpenBSD :: export PKG_PATH=http://ftp.eu.openbsd.org/pub/OpenBSD/`uname -r`/packages/`uname -m`/ - pkg_add -v python3 gcc + pkg_add -v python gcc python3 -m pip install psutil NetBSD @@ -15,7 +15,6 @@ DEPS = \ ipaddress \ mock==1.0.1 \ pyperf \ - readline \ requests \ setuptools \ sphinx \ diff --git a/appveyor.yml b/appveyor.yml index a99670e3..b38cbf1b 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -99,12 +99,6 @@ only_commits: - psutil/_psutil_windows.* - psutil/_pswindows.py - psutil/arch/windows/* - - psutil/tests/__init__.py - - psutil/tests/__main__.py - - psutil/tests/test_memory_leaks.py - - psutil/tests/test_misc.py - - psutil/tests/test_process.py - - psutil/tests/test_system.py - - psutil/tests/test_windows.py + - psutil/tests/* - scripts/* - setup.py diff --git a/psutil/_pslinux.py b/psutil/_pslinux.py index d8f8ed5c..06935111 100644 --- a/psutil/_pslinux.py +++ b/psutil/_pslinux.py @@ -1213,7 +1213,7 @@ def sensors_temperatures(): current = float(cat(path)) / 1000.0 path = os.path.join(os.path.dirname(base), 'name') unit_name = cat(path, binary=False) - except (IOError, OSError, ValueError) as err: + except (IOError, OSError, ValueError): # A lot of things can go wrong here, so let's just skip the # whole entry. Sure thing is Linux's /sys/class/hwmon really # is a stinky broken mess. @@ -1222,8 +1222,6 @@ def sensors_temperatures(): # https://github.com/giampaolo/psutil/issues/1129 # https://github.com/giampaolo/psutil/issues/1245 # https://github.com/giampaolo/psutil/issues/1323 - warnings.warn("ignoring %r for file %r" % (err, path), - RuntimeWarning) continue high = cat(base + '_max', fallback=None) diff --git a/psutil/_psutil_bsd.c b/psutil/_psutil_bsd.c index 30d9f9de..953fcd08 100644 --- a/psutil/_psutil_bsd.c +++ b/psutil/_psutil_bsd.c @@ -132,9 +132,9 @@ psutil_pids(PyObject *self, PyObject *args) { orig_address = proclist; // save so we can free it after we're done for (idx = 0; idx < num_processes; idx++) { #ifdef PSUTIL_FREEBSD - py_pid = Py_BuildValue("i", proclist->ki_pid); + py_pid = PyLong_FromPid(proclist->ki_pid); #elif defined(PSUTIL_OPENBSD) || defined(PSUTIL_NETBSD) - py_pid = Py_BuildValue("i", proclist->p_pid); + py_pid = PyLong_FromPid(proclist->p_pid); #endif if (!py_pid) goto error; @@ -180,7 +180,7 @@ psutil_boot_time(PyObject *self, PyObject *args) { */ static PyObject * psutil_proc_oneshot_info(PyObject *self, PyObject *args) { - long pid; + pid_t pid; long rss; long vms; long memtext; @@ -191,9 +191,10 @@ psutil_proc_oneshot_info(PyObject *self, PyObject *args) { long pagesize = sysconf(_SC_PAGESIZE); char str[1000]; PyObject *py_name; + PyObject *py_ppid; PyObject *py_retlist; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; if (psutil_kinfo_proc(pid, &kp) == -1) return NULL; @@ -255,16 +256,25 @@ psutil_proc_oneshot_info(PyObject *self, PyObject *args) { oncpu = -1; #endif +#ifdef PSUTIL_FREEBSD + py_ppid = PyLong_FromPid(kp.ki_ppid); +#elif defined(PSUTIL_OPENBSD) || defined(PSUTIL_NETBSD) + py_ppid = PyLong_FromPid(kp.p_ppid); +#else + py_ppid = Py_BuildfValue(-1); +#endif + if (! py_ppid) + return NULL; + // Return a single big tuple with all process info. py_retlist = Py_BuildValue( #if defined(__FreeBSD_version) && __FreeBSD_version >= 1200031 - "(lillllllLdllllddddlllllbO)", + "(OillllllLdllllddddlllllbO)", #else - "(lillllllidllllddddlllllbO)", + "(OillllllidllllddddlllllbO)", #endif #ifdef PSUTIL_FREEBSD - // - (long)kp.ki_ppid, // (long) ppid + py_ppid, // (pid_t) ppid (int)kp.ki_stat, // (int) status // UIDs (long)kp.ki_ruid, // (long) real uid @@ -297,8 +307,7 @@ psutil_proc_oneshot_info(PyObject *self, PyObject *args) { // others oncpu, // (int) the CPU we are on #elif defined(PSUTIL_OPENBSD) || defined(PSUTIL_NETBSD) - // - (long)kp.p_ppid, // (long) ppid + py_ppid, // (pid_t) ppid (int)kp.p_stat, // (int) status // UIDs (long)kp.p_ruid, // (long) real uid @@ -337,6 +346,7 @@ psutil_proc_oneshot_info(PyObject *self, PyObject *args) { ); Py_DECREF(py_name); + Py_DECREF(py_ppid); return py_retlist; } @@ -346,11 +356,11 @@ psutil_proc_oneshot_info(PyObject *self, PyObject *args) { */ static PyObject * psutil_proc_name(PyObject *self, PyObject *args) { - long pid; + pid_t pid; kinfo_proc kp; char str[1000]; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; if (psutil_kinfo_proc(pid, &kp) == -1) return NULL; @@ -369,10 +379,10 @@ psutil_proc_name(PyObject *self, PyObject *args) { */ static PyObject * psutil_proc_cmdline(PyObject *self, PyObject *args) { - long pid; + pid_t pid; PyObject *py_retlist = NULL; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; py_retlist = psutil_get_cmdline(pid); if (py_retlist == NULL) @@ -442,7 +452,7 @@ psutil_cpu_times(PyObject *self, PyObject *args) { #if (defined(__FreeBSD_version) && __FreeBSD_version >= 800000) || PSUTIL_OPENBSD || defined(PSUTIL_NETBSD) static PyObject * psutil_proc_open_files(PyObject *self, PyObject *args) { - long pid; + pid_t pid; int i; int cnt; int regular; @@ -457,7 +467,7 @@ psutil_proc_open_files(PyObject *self, PyObject *args) { if (py_retlist == NULL) return NULL; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) goto error; if (psutil_kinfo_proc(pid, &kipp) == -1) goto error; @@ -786,6 +796,7 @@ psutil_users(PyObject *self, PyObject *args) { PyObject *py_tty = NULL; PyObject *py_hostname = NULL; PyObject *py_tuple = NULL; + PyObject *py_pid = NULL; if (py_retlist == NULL) return NULL; @@ -823,7 +834,7 @@ psutil_users(PyObject *self, PyObject *args) { #ifdef PSUTIL_OPENBSD -1 // process id (set to None later) #else - ut.ut_pid // process id + ut.ut_pid // TODO: use PyLong_FromPid #endif ); if (!py_tuple) { @@ -856,17 +867,21 @@ psutil_users(PyObject *self, PyObject *args) { py_hostname = PyUnicode_DecodeFSDefault(utx->ut_host); if (! py_hostname) goto error; +#ifdef PSUTIL_OPENBSD + py_pid = Py_BuildValue("i", -1); // set to None later +#else + py_pid = PyLong_FromPid(utx->ut_pid); +#endif + if (! py_pid) + goto error; + py_tuple = Py_BuildValue( - "(OOOfi)", + "(OOOfO)", py_username, // username py_tty, // tty py_hostname, // hostname (float)utx->ut_tv.tv_sec, // start time -#ifdef PSUTIL_OPENBSD - -1 // process id (set to None later) -#else - utx->ut_pid // process id -#endif + py_pid // process id ); if (!py_tuple) { @@ -881,6 +896,7 @@ psutil_users(PyObject *self, PyObject *args) { Py_CLEAR(py_tty); Py_CLEAR(py_hostname); Py_CLEAR(py_tuple); + Py_CLEAR(py_pid); } endutxent(); @@ -892,6 +908,7 @@ error: Py_XDECREF(py_tty); Py_XDECREF(py_hostname); Py_XDECREF(py_tuple); + Py_XDECREF(py_pid); Py_DECREF(py_retlist); return NULL; } diff --git a/psutil/_psutil_common.c b/psutil/_psutil_common.c index 9075fda3..0c86a4e6 100644 --- a/psutil/_psutil_common.c +++ b/psutil/_psutil_common.c @@ -235,7 +235,7 @@ psutil_loadlibs() { // --- Mandatory NtQuerySystemInformation = psutil_GetProcAddressFromLib( "ntdll.dll", "NtQuerySystemInformation"); - if (NtQuerySystemInformation == NULL) + if (! NtQuerySystemInformation) return 1; NtQueryInformationProcess = psutil_GetProcAddress( "ntdll.dll", "NtQueryInformationProcess"); diff --git a/psutil/_psutil_common.h b/psutil/_psutil_common.h index 92a98b9c..d45cf56b 100644 --- a/psutil/_psutil_common.h +++ b/psutil/_psutil_common.h @@ -23,7 +23,43 @@ static const int PSUTIL_CONN_NONE = 128; PyObject* PyUnicode_DecodeFSDefault(char *s); PyObject* PyUnicode_DecodeFSDefaultAndSize(char *s, Py_ssize_t size); #endif -PyObject* PyErr_SetFromOSErrnoWithSyscall(const char *syscall); + +// Python 2: SIZEOF_PID_T not defined but _getpid() returns an int. +#if defined(PSUTIL_WINDOWS) && !defined(SIZEOF_PID_T) + #define SIZEOF_PID_T SIZEOF_INT +#endif + +#if !defined(_Py_PARSE_PID) || PY_MAJOR_VERSION < 3 + #if !defined(SIZEOF_PID_T) || !defined(SIZEOF_INT) || !defined(SIZEOF_LONG) + #error "missing SIZEOF* definition" + #endif +#endif + +// _Py_PARSE_PID is Python 3 only, but since it's private make sure it's +// always present. +#ifndef _Py_PARSE_PID + #if SIZEOF_PID_T == SIZEOF_INT + #define _Py_PARSE_PID "i" + #elif SIZEOF_PID_T == SIZEOF_LONG + #define _Py_PARSE_PID "l" + #elif defined(SIZEOF_LONG_LONG) && SIZEOF_PID_T == SIZEOF_LONG_LONG + #define _Py_PARSE_PID "L" + #else + #error "_Py_PARSE_PID: sizeof(pid_t) is neither sizeof(int), " + "sizeof(long) or sizeof(long long)" + #endif +#endif + +#if PY_MAJOR_VERSION < 3 + #if ((SIZEOF_PID_T == SIZEOF_INT) || (SIZEOF_PID_T == SIZEOF_LONG)) + #define PyLong_FromPid PyInt_FromLong + #elif defined(SIZEOF_LONG_LONG) && SIZEOF_PID_T == SIZEOF_LONG_LONG + #define PyLong_FromPid PyLong_FromLongLong + #else + #error "PyLong_FromPid: sizeof(pid_t) is neither sizeof(int), " + "sizeof(long) or sizeof(long long)" + #endif +#endif // ==================================================================== // --- Custom exceptions @@ -31,6 +67,7 @@ PyObject* PyErr_SetFromOSErrnoWithSyscall(const char *syscall); PyObject* AccessDenied(const char *msg); PyObject* NoSuchProcess(const char *msg); +PyObject* PyErr_SetFromOSErrnoWithSyscall(const char *syscall); // ==================================================================== // --- Global utils diff --git a/psutil/_psutil_linux.c b/psutil/_psutil_linux.c index 0d16eb42..93cc071b 100644 --- a/psutil/_psutil_linux.c +++ b/psutil/_psutil_linux.c @@ -97,9 +97,9 @@ ioprio_set(int which, int who, int ioprio) { */ static PyObject * psutil_proc_ioprio_get(PyObject *self, PyObject *args) { - long pid; + pid_t pid; int ioprio, ioclass, iodata; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; ioprio = ioprio_get(IOPRIO_WHO_PROCESS, pid); if (ioprio == -1) @@ -117,12 +117,14 @@ psutil_proc_ioprio_get(PyObject *self, PyObject *args) { */ static PyObject * psutil_proc_ioprio_set(PyObject *self, PyObject *args) { - long pid; + pid_t pid; int ioprio, ioclass, iodata; int retval; - if (! PyArg_ParseTuple(args, "lii", &pid, &ioclass, &iodata)) + if (! PyArg_ParseTuple( + args, _Py_PARSE_PID "ii", &pid, &ioclass, &iodata)) { return NULL; + } ioprio = IOPRIO_PRIO_VALUE(ioclass, iodata); retval = ioprio_set(IOPRIO_WHO_PROCESS, pid, ioprio); if (retval == -1) @@ -140,15 +142,17 @@ psutil_proc_ioprio_set(PyObject *self, PyObject *args) { */ static PyObject * psutil_linux_prlimit(PyObject *self, PyObject *args) { - long pid; + pid_t pid; int ret, resource; struct rlimit old, new; struct rlimit *newp = NULL; PyObject *py_soft = NULL; PyObject *py_hard = NULL; - if (! PyArg_ParseTuple(args, "li|OO", &pid, &resource, &py_soft, &py_hard)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID "i|OO", &pid, &resource, + &py_soft, &py_hard)) { return NULL; + } // get if (py_soft == NULL && py_hard == NULL) { @@ -290,12 +294,12 @@ psutil_linux_sysinfo(PyObject *self, PyObject *args) { static PyObject * psutil_proc_cpu_affinity_get(PyObject *self, PyObject *args) { int cpu, ncpus, count, cpucount_s; - long pid; + pid_t pid; size_t setsize; cpu_set_t *mask = NULL; PyObject *py_list = NULL; - if (!PyArg_ParseTuple(args, "l", &pid)) + if (!PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; ncpus = NCPUS_START; while (1) { @@ -358,12 +362,12 @@ static PyObject * psutil_proc_cpu_affinity_set(PyObject *self, PyObject *args) { cpu_set_t cpu_set; size_t len; - long pid; + pid_t pid; int i, seq_len; PyObject *py_cpu_set; PyObject *py_cpu_seq = NULL; - if (!PyArg_ParseTuple(args, "lO", &pid, &py_cpu_set)) + if (!PyArg_ParseTuple(args, _Py_PARSE_PID "O", &pid, &py_cpu_set)) return NULL; if (!PySequence_Check(py_cpu_set)) { @@ -441,8 +445,9 @@ psutil_users(PyObject *self, PyObject *args) { py_hostname = PyUnicode_DecodeFSDefault(ut->ut_host); if (! py_hostname) goto error; + py_tuple = Py_BuildValue( - "(OOOfOi)", + "OOOfO" _Py_PARSE_PID, py_username, // username py_tty, // tty py_hostname, // hostname diff --git a/psutil/_psutil_osx.c b/psutil/_psutil_osx.c index 8d086122..c51c1c78 100644 --- a/psutil/_psutil_osx.c +++ b/psutil/_psutil_osx.c @@ -88,12 +88,12 @@ psutil_sys_vminfo(vm_statistics_data_t *vmstat) { * https://github.com/giampaolo/psutil/issues/1291#issuecomment-396062519 */ int -psutil_task_for_pid(long pid, mach_port_t *task) +psutil_task_for_pid(pid_t pid, mach_port_t *task) { // See: https://github.com/giampaolo/psutil/issues/1181 kern_return_t err = KERN_SUCCESS; - err = task_for_pid(mach_task_self(), (pid_t)pid, task); + err = task_for_pid(mach_task_self(), pid, task); if (err != KERN_SUCCESS) { if (psutil_pid_exists(pid) == 0) NoSuchProcess("task_for_pid"); @@ -133,7 +133,7 @@ psutil_pids(PyObject *self, PyObject *args) { // save the address of proclist so we can free it later orig_address = proclist; for (idx = 0; idx < num_processes; idx++) { - py_pid = Py_BuildValue("i", proclist->kp_proc.p_pid); + py_pid = PyLong_FromPid(proclist->kp_proc.p_pid); if (! py_pid) goto error; if (PyList_Append(py_retlist, py_pid)) @@ -164,12 +164,12 @@ error: */ static PyObject * psutil_proc_kinfo_oneshot(PyObject *self, PyObject *args) { - long pid; + pid_t pid; struct kinfo_proc kp; PyObject *py_name; PyObject *py_retlist; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; if (psutil_get_kinfo_proc(pid, &kp) == -1) return NULL; @@ -183,8 +183,8 @@ psutil_proc_kinfo_oneshot(PyObject *self, PyObject *args) { } py_retlist = Py_BuildValue( - "lllllllidiO", - (long)kp.kp_eproc.e_ppid, // (long) ppid + _Py_PARSE_PID "llllllidiO", + kp.kp_eproc.e_ppid, // (pid_t) ppid (long)kp.kp_eproc.e_pcred.p_ruid, // (long) real uid (long)kp.kp_eproc.e_ucred.cr_uid, // (long) effective uid (long)kp.kp_eproc.e_pcred.p_svuid, // (long) saved uid @@ -215,10 +215,10 @@ psutil_proc_kinfo_oneshot(PyObject *self, PyObject *args) { */ static PyObject * psutil_proc_pidtaskinfo_oneshot(PyObject *self, PyObject *args) { - long pid; + pid_t pid; struct proc_taskinfo pti; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; if (psutil_proc_pidinfo(pid, PROC_PIDTASKINFO, 0, &pti, sizeof(pti)) <= 0) return NULL; @@ -250,10 +250,10 @@ psutil_proc_pidtaskinfo_oneshot(PyObject *self, PyObject *args) { */ static PyObject * psutil_proc_name(PyObject *self, PyObject *args) { - long pid; + pid_t pid; struct kinfo_proc kp; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; if (psutil_get_kinfo_proc(pid, &kp) == -1) return NULL; @@ -267,10 +267,10 @@ psutil_proc_name(PyObject *self, PyObject *args) { */ static PyObject * psutil_proc_cwd(PyObject *self, PyObject *args) { - long pid; + pid_t pid; struct proc_vnodepathinfo pathinfo; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; if (psutil_proc_pidinfo( @@ -288,14 +288,14 @@ psutil_proc_cwd(PyObject *self, PyObject *args) { */ static PyObject * psutil_proc_exe(PyObject *self, PyObject *args) { - long pid; + pid_t pid; char buf[PATH_MAX]; int ret; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; errno = 0; - ret = proc_pidpath((pid_t)pid, &buf, sizeof(buf)); + ret = proc_pidpath(pid, &buf, sizeof(buf)); if (ret == 0) { if (pid == 0) AccessDenied("automatically set for PID 0"); @@ -312,10 +312,10 @@ psutil_proc_exe(PyObject *self, PyObject *args) { */ static PyObject * psutil_proc_cmdline(PyObject *self, PyObject *args) { - long pid; + pid_t pid; PyObject *py_retlist = NULL; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; // get the commandline, defined in arch/osx/process_info.c @@ -329,10 +329,10 @@ psutil_proc_cmdline(PyObject *self, PyObject *args) { */ static PyObject * psutil_proc_environ(PyObject *self, PyObject *args) { - long pid; + pid_t pid; PyObject *py_retdict = NULL; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; // get the environment block, defined in arch/osx/process_info.c @@ -422,7 +422,7 @@ psutil_in_shared_region(mach_vm_address_t addr, cpu_type_t type) { */ static PyObject * psutil_proc_memory_uss(PyObject *self, PyObject *args) { - long pid; + pid_t pid; size_t len; cpu_type_t cpu_type; size_t private_pages = 0; @@ -435,7 +435,7 @@ psutil_proc_memory_uss(PyObject *self, PyObject *args) { vm_region_top_info_data_t info; mach_port_t object_name; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; if (psutil_task_for_pid(pid, &task) != 0) @@ -865,7 +865,7 @@ error: */ static PyObject * psutil_proc_threads(PyObject *self, PyObject *args) { - long pid; + pid_t pid; int err, ret; kern_return_t kr; unsigned int info_count = TASK_BASIC_INFO_COUNT; @@ -882,7 +882,7 @@ psutil_proc_threads(PyObject *self, PyObject *args) { if (py_retlist == NULL) return NULL; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) goto error; if (psutil_task_for_pid(pid, &task) != 0) @@ -968,7 +968,7 @@ error: */ static PyObject * psutil_proc_open_files(PyObject *self, PyObject *args) { - long pid; + pid_t pid; int pidinfo_result; int iterations; int i; @@ -985,7 +985,7 @@ psutil_proc_open_files(PyObject *self, PyObject *args) { if (py_retlist == NULL) return NULL; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) goto error; pidinfo_result = psutil_proc_pidinfo(pid, PROC_PIDLISTFDS, 0, NULL, 0); @@ -1070,7 +1070,7 @@ error: */ static PyObject * psutil_proc_connections(PyObject *self, PyObject *args) { - long pid; + pid_t pid; int pidinfo_result; int iterations; int i; @@ -1090,8 +1090,10 @@ psutil_proc_connections(PyObject *self, PyObject *args) { if (py_retlist == NULL) return NULL; - if (! PyArg_ParseTuple(args, "lOO", &pid, &py_af_filter, &py_type_filter)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID "OO", &pid, &py_af_filter, + &py_type_filter)) { goto error; + } if (!PySequence_Check(py_af_filter) || !PySequence_Check(py_type_filter)) { PyErr_SetString(PyExc_TypeError, "arg 2 or 3 is not a sequence"); @@ -1124,7 +1126,7 @@ psutil_proc_connections(PyObject *self, PyObject *args) { if (fdp_pointer->proc_fdtype == PROX_FDTYPE_SOCKET) { errno = 0; - nb = proc_pidfdinfo((pid_t)pid, fdp_pointer->proc_fd, + nb = proc_pidfdinfo(pid, fdp_pointer->proc_fd, PROC_PIDFDSOCKETINFO, &si, sizeof(si)); // --- errors checking @@ -1272,22 +1274,22 @@ error: */ static PyObject * psutil_proc_num_fds(PyObject *self, PyObject *args) { - long pid; + pid_t pid; int pidinfo_result; int num; struct proc_fdinfo *fds_pointer; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; - pidinfo_result = proc_pidinfo((pid_t)pid, PROC_PIDLISTFDS, 0, NULL, 0); + pidinfo_result = proc_pidinfo(pid, PROC_PIDLISTFDS, 0, NULL, 0); if (pidinfo_result <= 0) return PyErr_SetFromErrno(PyExc_OSError); fds_pointer = malloc(pidinfo_result); if (fds_pointer == NULL) return PyErr_NoMemory(); - pidinfo_result = proc_pidinfo((pid_t)pid, PROC_PIDLISTFDS, 0, fds_pointer, + pidinfo_result = proc_pidinfo(pid, PROC_PIDLISTFDS, 0, fds_pointer, pidinfo_result); if (pidinfo_result <= 0) { free(fds_pointer); @@ -1834,7 +1836,6 @@ static PyMethodDef mod_methods[] = { void init_psutil_osx(void) #endif /* PY_MAJOR_VERSION */ { - PyObject *v; #if PY_MAJOR_VERSION >= 3 PyObject *mod = PyModule_Create(&moduledef); #else diff --git a/psutil/_psutil_posix.c b/psutil/_psutil_posix.c index 88bea5ce..fa554be9 100644 --- a/psutil/_psutil_posix.c +++ b/psutil/_psutil_posix.c @@ -51,7 +51,7 @@ * -1: error (Python exception is set) */ int -psutil_pid_exists(long pid) { +psutil_pid_exists(pid_t pid) { int ret; // No negative PID exists, plus -1 is an alias for sending signal @@ -71,12 +71,7 @@ psutil_pid_exists(long pid) { #endif } -#if defined(PSUTIL_OSX) - ret = kill((pid_t)pid , 0); -#else ret = kill(pid , 0); -#endif - if (ret == 0) return 1; else { @@ -127,11 +122,11 @@ psutil_raise_for_pid(long pid, char *syscall) { */ static PyObject * psutil_posix_getpriority(PyObject *self, PyObject *args) { - long pid; + pid_t pid; int priority; errno = 0; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; #ifdef PSUTIL_OSX @@ -150,11 +145,11 @@ psutil_posix_getpriority(PyObject *self, PyObject *args) { */ static PyObject * psutil_posix_setpriority(PyObject *self, PyObject *args) { - long pid; + pid_t pid; int priority; int retval; - if (! PyArg_ParseTuple(args, "li", &pid, &priority)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID "i", &pid, &priority)) return NULL; #ifdef PSUTIL_OSX @@ -666,7 +661,10 @@ static PyMethodDef mod_methods[] = { if (mod == NULL) INITERR; -#if defined(PSUTIL_BSD) || defined(PSUTIL_OSX) || defined(PSUTIL_SUNOS) || defined(PSUTIL_AIX) +#if defined(PSUTIL_BSD) || \ + defined(PSUTIL_OSX) || \ + defined(PSUTIL_SUNOS) || \ + defined(PSUTIL_AIX) if (PyModule_AddIntConstant(mod, "AF_LINK", AF_LINK)) INITERR; #endif diff --git a/psutil/_psutil_posix.h b/psutil/_psutil_posix.h index fe25b366..59b9e532 100644 --- a/psutil/_psutil_posix.h +++ b/psutil/_psutil_posix.h @@ -4,5 +4,5 @@ * found in the LICENSE file. */ -int psutil_pid_exists(long pid); -void psutil_raise_for_pid(long pid, char *msg); +int psutil_pid_exists(pid_t pid); +void psutil_raise_for_pid(pid_t pid, char *msg); diff --git a/psutil/_psutil_windows.c b/psutil/_psutil_windows.c index 510bde8a..cabfe934 100644 --- a/psutil/_psutil_windows.c +++ b/psutil/_psutil_windows.c @@ -111,10 +111,10 @@ psutil_boot_time(PyObject *self, PyObject *args) { */ static PyObject * psutil_pid_exists(PyObject *self, PyObject *args) { - long pid; + DWORD pid; int status; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; status = psutil_pid_is_running(pid); @@ -142,7 +142,7 @@ psutil_pids(PyObject *self, PyObject *args) { goto error; for (i = 0; i < numberOfReturnedPIDs; i++) { - py_pid = Py_BuildValue("I", proclist[i]); + py_pid = PyLong_FromPid(proclist[i]); if (!py_pid) goto error; if (PyList_Append(py_retlist, py_pid)) @@ -169,9 +169,9 @@ error: static PyObject * psutil_proc_kill(PyObject *self, PyObject *args) { HANDLE hProcess; - long pid; + DWORD pid; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; if (pid == 0) return AccessDenied("automatically set for PID 0"); @@ -212,10 +212,10 @@ psutil_proc_wait(PyObject *self, PyObject *args) { HANDLE hProcess; DWORD ExitCode; DWORD retVal; - long pid; + DWORD pid; long timeout; - if (! PyArg_ParseTuple(args, "ll", &pid, &timeout)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID "l", &pid, &timeout)) return NULL; if (pid == 0) return AccessDenied("automatically set for PID 0"); @@ -281,11 +281,11 @@ psutil_proc_wait(PyObject *self, PyObject *args) { */ static PyObject * psutil_proc_cpu_times(PyObject *self, PyObject *args) { - long pid; + pid_t pid; HANDLE hProcess; FILETIME ftCreate, ftExit, ftKernel, ftUser; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; hProcess = psutil_handle_from_pid(pid, PROCESS_QUERY_LIMITED_INFORMATION); @@ -332,12 +332,12 @@ psutil_proc_cpu_times(PyObject *self, PyObject *args) { */ static PyObject * psutil_proc_create_time(PyObject *self, PyObject *args) { - long pid; + pid_t pid; long long unix_time; HANDLE hProcess; FILETIME ftCreate, ftExit, ftKernel, ftUser; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; // special case for PIDs 0 and 4, return system boot time @@ -397,14 +397,15 @@ psutil_proc_create_time(PyObject *self, PyObject *args) { */ static PyObject * psutil_proc_cmdline(PyObject *self, PyObject *args, PyObject *kwdict) { - long pid; + DWORD pid; int pid_return; int use_peb; PyObject *py_usepeb = Py_True; static char *keywords[] = {"pid", "use_peb", NULL}; - if (!PyArg_ParseTupleAndKeywords(args, kwdict, "i|O", - keywords, &pid, &py_usepeb)) { + if (!PyArg_ParseTupleAndKeywords(args, kwdict, _Py_PARSE_PID "|O", + keywords, &pid, &py_usepeb)) + { return NULL; } if ((pid == 0) || (pid == 4)) @@ -426,10 +427,10 @@ psutil_proc_cmdline(PyObject *self, PyObject *args, PyObject *kwdict) { */ static PyObject * psutil_proc_environ(PyObject *self, PyObject *args) { - long pid; + DWORD pid; int pid_return; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; if ((pid == 0) || (pid == 4)) return Py_BuildValue("s", ""); @@ -449,12 +450,12 @@ psutil_proc_environ(PyObject *self, PyObject *args) { */ static PyObject * psutil_proc_exe(PyObject *self, PyObject *args) { - long pid; + DWORD pid; HANDLE hProcess; wchar_t exe[MAX_PATH]; unsigned int size = sizeof(exe); - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; hProcess = psutil_handle_from_pid(pid, PROCESS_QUERY_LIMITED_INFORMATION); @@ -484,12 +485,12 @@ psutil_proc_exe(PyObject *self, PyObject *args) { */ static PyObject * psutil_proc_name(PyObject *self, PyObject *args) { - long pid; + DWORD pid; int ok; PROCESSENTRY32W pentry; HANDLE hSnapShot; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, pid); if (hSnapShot == INVALID_HANDLE_VALUE) @@ -525,7 +526,7 @@ psutil_proc_memory_info(PyObject *self, PyObject *args) { DWORD pid; PROCESS_MEMORY_COUNTERS_EX cnt; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; hProcess = psutil_handle_from_pid(pid, PROCESS_QUERY_LIMITED_INFORMATION); @@ -641,7 +642,7 @@ psutil_proc_memory_uss(PyObject *self, PyObject *args) { PMEMORY_WORKING_SET_INFORMATION wsInfo; ULONG_PTR i; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; hProcess = psutil_handle_from_pid(pid, PROCESS_QUERY_INFORMATION); if (hProcess == NULL) @@ -706,10 +707,10 @@ psutil_virtual_mem(PyObject *self, PyObject *args) { */ static PyObject * psutil_proc_cwd(PyObject *self, PyObject *args) { - long pid; + DWORD pid; int pid_return; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; pid_return = psutil_pid_is_running(pid); @@ -727,13 +728,13 @@ psutil_proc_cwd(PyObject *self, PyObject *args) { */ static PyObject * psutil_proc_suspend_or_resume(PyObject *self, PyObject *args) { - long pid; + DWORD pid; NTSTATUS status; HANDLE hProcess; PyObject* suspend; - if (! PyArg_ParseTuple(args, "lO", &pid, &suspend)) - return NULL; + if (! PyArg_ParseTuple(args, _Py_PARSE_PID "O", &pid, &suspend)) + return NULL; hProcess = psutil_handle_from_pid(pid, PROCESS_SUSPEND_RESUME); if (hProcess == NULL) @@ -756,9 +757,9 @@ psutil_proc_suspend_or_resume(PyObject *self, PyObject *args) { static PyObject * psutil_proc_threads(PyObject *self, PyObject *args) { - HANDLE hThread; + HANDLE hThread = NULL; THREADENTRY32 te32 = {0}; - long pid; + DWORD pid; int pid_return; int rc; FILETIME ftDummy, ftKernel, ftUser; @@ -768,7 +769,7 @@ psutil_proc_threads(PyObject *self, PyObject *args) { if (py_retlist == NULL) return NULL; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) goto error; if (pid == 0) { // raise AD instead of returning 0 as procexp is able to @@ -866,7 +867,7 @@ psutil_proc_open_files(PyObject *self, PyObject *args) { DWORD access = PROCESS_DUP_HANDLE | PROCESS_QUERY_INFORMATION; PyObject *py_retlist; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; processHandle = psutil_handle_from_pid(pid, access); @@ -884,7 +885,7 @@ psutil_proc_open_files(PyObject *self, PyObject *args) { */ static PyObject * psutil_proc_username(PyObject *self, PyObject *args) { - long pid; + DWORD pid; HANDLE processHandle = NULL; HANDLE tokenHandle = NULL; PTOKEN_USER user = NULL; @@ -898,7 +899,7 @@ psutil_proc_username(PyObject *self, PyObject *args) { PyObject *py_domain = NULL; PyObject *py_tuple = NULL; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; processHandle = psutil_handle_from_pid( @@ -1011,11 +1012,11 @@ error: */ static PyObject * psutil_proc_priority_get(PyObject *self, PyObject *args) { - long pid; + DWORD pid; DWORD priority; HANDLE hProcess; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; hProcess = psutil_handle_from_pid(pid, PROCESS_QUERY_LIMITED_INFORMATION); @@ -1038,13 +1039,13 @@ psutil_proc_priority_get(PyObject *self, PyObject *args) { */ static PyObject * psutil_proc_priority_set(PyObject *self, PyObject *args) { - long pid; + DWORD pid; int priority; int retval; HANDLE hProcess; DWORD access = PROCESS_QUERY_INFORMATION | PROCESS_SET_INFORMATION; - if (! PyArg_ParseTuple(args, "li", &pid, &priority)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID "i", &pid, &priority)) return NULL; hProcess = psutil_handle_from_pid(pid, access); if (hProcess == NULL) @@ -1067,12 +1068,12 @@ psutil_proc_priority_set(PyObject *self, PyObject *args) { */ static PyObject * psutil_proc_io_priority_get(PyObject *self, PyObject *args) { - long pid; + DWORD pid; HANDLE hProcess; DWORD IoPriority; NTSTATUS status; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; hProcess = psutil_handle_from_pid(pid, PROCESS_QUERY_LIMITED_INFORMATION); @@ -1099,13 +1100,13 @@ psutil_proc_io_priority_get(PyObject *self, PyObject *args) { */ static PyObject * psutil_proc_io_priority_set(PyObject *self, PyObject *args) { - long pid; + DWORD pid; DWORD prio; HANDLE hProcess; NTSTATUS status; DWORD access = PROCESS_QUERY_INFORMATION | PROCESS_SET_INFORMATION; - if (! PyArg_ParseTuple(args, "li", &pid, &prio)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID "i", &pid, &prio)) return NULL; hProcess = psutil_handle_from_pid(pid, access); @@ -1135,7 +1136,7 @@ psutil_proc_io_counters(PyObject *self, PyObject *args) { HANDLE hProcess; IO_COUNTERS IoCounters; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; hProcess = psutil_handle_from_pid(pid, PROCESS_QUERY_LIMITED_INFORMATION); if (NULL == hProcess) @@ -1168,7 +1169,7 @@ psutil_proc_cpu_affinity_get(PyObject *self, PyObject *args) { DWORD_PTR proc_mask; DWORD_PTR system_mask; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; hProcess = psutil_handle_from_pid(pid, PROCESS_QUERY_LIMITED_INFORMATION); if (hProcess == NULL) { @@ -1200,9 +1201,9 @@ psutil_proc_cpu_affinity_set(PyObject *self, PyObject *args) { DWORD_PTR mask; #ifdef _WIN64 - if (! PyArg_ParseTuple(args, "lK", &pid, &mask)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID "K", &pid, &mask)) #else - if (! PyArg_ParseTuple(args, "lk", &pid, &mask)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID "k", &pid, &mask)) #endif { return NULL; @@ -1232,7 +1233,7 @@ psutil_proc_is_suspended(PyObject *self, PyObject *args) { PSYSTEM_PROCESS_INFORMATION process; PVOID buffer; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; if (! psutil_get_proc_info(pid, &process, &buffer)) return NULL; @@ -1391,7 +1392,7 @@ psutil_proc_num_handles(PyObject *self, PyObject *args) { HANDLE hProcess; DWORD handleCount; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; hProcess = psutil_handle_from_pid(pid, PROCESS_QUERY_LIMITED_INFORMATION); if (NULL == hProcess) @@ -1449,7 +1450,7 @@ psutil_proc_memory_maps(PyObject *self, PyObject *args) { if (py_retlist == NULL) return NULL; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) goto error; hProcess = psutil_handle_from_pid(pid, access); if (NULL == hProcess) @@ -1530,10 +1531,10 @@ psutil_ppid_map(PyObject *self, PyObject *args) { if (Process32First(handle, &pe)) { do { - py_pid = Py_BuildValue("I", pe.th32ProcessID); + py_pid = PyLong_FromPid(pe.th32ProcessID); if (py_pid == NULL) goto error; - py_ppid = Py_BuildValue("I", pe.th32ParentProcessID); + py_ppid = PyLong_FromPid(pe.th32ParentProcessID); if (py_ppid == NULL) goto error; if (PyDict_SetItem(py_retdict, py_pid, py_ppid)) diff --git a/psutil/arch/freebsd/proc_socks.c b/psutil/arch/freebsd/proc_socks.c index a458a01e..cdf5770b 100644 --- a/psutil/arch/freebsd/proc_socks.c +++ b/psutil/arch/freebsd/proc_socks.c @@ -179,7 +179,7 @@ psutil_search_tcplist(char *buf, struct kinfo_file *kif) { PyObject * psutil_proc_connections(PyObject *self, PyObject *args) { // Return connections opened by process. - long pid; + pid_t pid; int i; int cnt; struct kinfo_file *freep = NULL; @@ -202,8 +202,11 @@ psutil_proc_connections(PyObject *self, PyObject *args) { if (py_retlist == NULL) return NULL; - if (! PyArg_ParseTuple(args, "lOO", &pid, &py_af_filter, &py_type_filter)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID "OO", &pid, + &py_af_filter, &py_type_filter)) + { goto error; + } if (!PySequence_Check(py_af_filter) || !PySequence_Check(py_type_filter)) { PyErr_SetString(PyExc_TypeError, "arg 2 or 3 is not a sequence"); goto error; diff --git a/psutil/arch/freebsd/specific.c b/psutil/arch/freebsd/specific.c index 18fa51fa..3d54b47e 100644 --- a/psutil/arch/freebsd/specific.c +++ b/psutil/arch/freebsd/specific.c @@ -44,7 +44,7 @@ int -psutil_kinfo_proc(const pid_t pid, struct kinfo_proc *proc) { +psutil_kinfo_proc(pid_t pid, struct kinfo_proc *proc) { // Fills a kinfo_proc struct based on process pid. int mib[4]; size_t size; @@ -141,7 +141,7 @@ psutil_get_proc_list(struct kinfo_proc **procList, size_t *procCount) { * 1 for insufficient privileges. */ static char -*psutil_get_cmd_args(long pid, size_t *argsize) { +*psutil_get_cmd_args(pid_t pid, size_t *argsize) { int mib[4]; int argmax; size_t size = sizeof(argmax); @@ -183,7 +183,7 @@ static char // returns the command line as a python list object PyObject * -psutil_get_cmdline(long pid) { +psutil_get_cmdline(pid_t pid) { char *argstr = NULL; size_t pos = 0; size_t argsize = 0; @@ -230,14 +230,14 @@ error: */ PyObject * psutil_proc_exe(PyObject *self, PyObject *args) { - long pid; + pid_t pid; char pathname[PATH_MAX]; int error; int mib[4]; int ret; size_t size; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; mib[0] = CTL_KERN; @@ -274,9 +274,9 @@ psutil_proc_exe(PyObject *self, PyObject *args) { PyObject * psutil_proc_num_threads(PyObject *self, PyObject *args) { // Return number of threads used by process as a Python integer. - long pid; + pid_t pid; struct kinfo_proc kp; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; if (psutil_kinfo_proc(pid, &kp) == -1) return NULL; @@ -291,7 +291,7 @@ psutil_proc_threads(PyObject *self, PyObject *args) { // Thanks to Robert N. M. Watson: // http://code.metager.de/source/xref/freebsd/usr.bin/procstat/ // procstat_threads.c - long pid; + pid_t pid; int mib[4]; struct kinfo_proc *kip = NULL; struct kinfo_proc *kipp = NULL; @@ -303,7 +303,7 @@ psutil_proc_threads(PyObject *self, PyObject *args) { if (py_retlist == NULL) return NULL; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) goto error; // we need to re-query for thread information, so don't use *kipp @@ -520,7 +520,7 @@ psutil_swap_mem(PyObject *self, PyObject *args) { #if defined(__FreeBSD_version) && __FreeBSD_version >= 800000 PyObject * psutil_proc_cwd(PyObject *self, PyObject *args) { - long pid; + pid_t pid; struct kinfo_file *freep = NULL; struct kinfo_file *kif; struct kinfo_proc kipp; @@ -528,7 +528,7 @@ psutil_proc_cwd(PyObject *self, PyObject *args) { int i, cnt; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) goto error; if (psutil_kinfo_proc(pid, &kipp) == -1) goto error; @@ -571,13 +571,13 @@ error: #if defined(__FreeBSD_version) && __FreeBSD_version >= 800000 PyObject * psutil_proc_num_fds(PyObject *self, PyObject *args) { - long pid; + pid_t pid; int cnt; struct kinfo_file *freep; struct kinfo_proc kipp; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; if (psutil_kinfo_proc(pid, &kipp) == -1) return NULL; @@ -730,7 +730,7 @@ PyObject * psutil_proc_memory_maps(PyObject *self, PyObject *args) { // Return a list of tuples for every process memory maps. //'procstat' cmdline utility has been used as an example. - long pid; + pid_t pid; int ptrwidth; int i, cnt; char addr[1000]; @@ -746,7 +746,7 @@ psutil_proc_memory_maps(PyObject *self, PyObject *args) { if (py_retlist == NULL) return NULL; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) goto error; if (psutil_kinfo_proc(pid, &kp) == -1) goto error; @@ -846,14 +846,14 @@ psutil_proc_cpu_affinity_get(PyObject* self, PyObject* args) { // Get process CPU affinity. // Reference: // http://sources.freebsd.org/RELENG_9/src/usr.bin/cpuset/cpuset.c - long pid; + pid_t pid; int ret; int i; cpuset_t mask; PyObject* py_retlist; PyObject* py_cpu_num; - if (!PyArg_ParseTuple(args, "i", &pid)) + if (!PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; ret = cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_PID, pid, sizeof(mask), &mask); @@ -888,7 +888,7 @@ psutil_proc_cpu_affinity_set(PyObject *self, PyObject *args) { // Set process CPU affinity. // Reference: // http://sources.freebsd.org/RELENG_9/src/usr.bin/cpuset/cpuset.c - long pid; + pid_t pid; int i; int seq_len; int ret; @@ -896,7 +896,7 @@ psutil_proc_cpu_affinity_set(PyObject *self, PyObject *args) { PyObject *py_cpu_set; PyObject *py_cpu_seq = NULL; - if (!PyArg_ParseTuple(args, "lO", &pid, &py_cpu_set)) + if (!PyArg_ParseTuple(args, _Py_PARSE_PID "O", &pid, &py_cpu_set)) return NULL; py_cpu_seq = PySequence_Fast(py_cpu_set, "expected a sequence or integer"); diff --git a/psutil/arch/freebsd/sys_socks.c b/psutil/arch/freebsd/sys_socks.c index e0e2046b..ab61f393 100644 --- a/psutil/arch/freebsd/sys_socks.c +++ b/psutil/arch/freebsd/sys_socks.c @@ -129,7 +129,7 @@ int psutil_gather_inet(int proto, PyObject *py_retlist) { } while (xig->xig_gen != exig->xig_gen && retry--); for (;;) { - struct xfile *xf; + struct xfile *xf; int lport, rport, status, family; xig = (struct xinpgen *)(void *)((char *)xig + xig->xig_len); @@ -203,19 +203,20 @@ int psutil_gather_inet(int proto, PyObject *py_retlist) { if (!py_raddr) goto error; py_tuple = Py_BuildValue( - "(iiiNNii)", + "iiiNNi" _Py_PARSE_PID, xf->xf_fd, // fd family, // family type, // type py_laddr, // laddr py_raddr, // raddr status, // status - xf->xf_pid); // pid + xf->xf_pid // pid + ); if (!py_tuple) goto error; if (PyList_Append(py_retlist, py_tuple)) goto error; - Py_DECREF(py_tuple); + Py_CLEAR(py_tuple); } free(buf); @@ -286,7 +287,7 @@ int psutil_gather_unix(int proto, PyObject *py_retlist) { } while (xug->xug_gen != exug->xug_gen && retry--); for (;;) { - struct xfile *xf; + struct xfile *xf; xug = (struct xunpgen *)(void *)((char *)xug + xug->xug_len); if (xug >= exug) diff --git a/psutil/arch/openbsd/specific.c b/psutil/arch/openbsd/specific.c index 18079b89..d97a8f9b 100644 --- a/psutil/arch/openbsd/specific.c +++ b/psutil/arch/openbsd/specific.c @@ -90,7 +90,7 @@ psutil_kinfo_proc(pid_t pid, struct kinfo_proc *proc) { struct kinfo_file * -kinfo_getfile(long pid, int* cnt) { +kinfo_getfile(pid_t pid, int* cnt) { // Mimic's FreeBSD kinfo_file call, taking a pid and a ptr to an // int as arg and returns an array with cnt struct kinfo_file. int mib[6]; @@ -99,7 +99,7 @@ kinfo_getfile(long pid, int* cnt) { mib[0] = CTL_KERN; mib[1] = KERN_FILE; mib[2] = KERN_FILE_BYPID; - mib[3] = (int) pid; + mib[3] = pid; mib[4] = sizeof(struct kinfo_file); mib[5] = 0; @@ -179,7 +179,7 @@ psutil_get_proc_list(struct kinfo_proc **procList, size_t *procCount) { static char ** -_psutil_get_argv(long pid) { +_psutil_get_argv(pid_t pid) { static char **argv; int argv_mib[] = {CTL_KERN, KERN_PROC_ARGS, pid, KERN_PROC_ARGV}; size_t argv_size = 128; @@ -204,7 +204,7 @@ _psutil_get_argv(long pid) { // returns the command line as a python list object PyObject * -psutil_get_cmdline(long pid) { +psutil_get_cmdline(pid_t pid) { static char **argv; char **p; PyObject *py_arg = NULL; @@ -241,7 +241,7 @@ psutil_proc_threads(PyObject *self, PyObject *args) { // https://github.com/janmojzis/pstree/blob/master/proc_kvm.c // Note: this requires root access, else it will fail trying // to access /dev/kmem. - long pid; + pid_t pid; kvm_t *kd = NULL; int nentries, i; char errbuf[4096]; @@ -251,7 +251,7 @@ psutil_proc_threads(PyObject *self, PyObject *args) { if (py_retlist == NULL) return NULL; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) goto error; kd = kvm_openfiles(0, 0, 0, O_RDONLY, errbuf); @@ -276,7 +276,7 @@ psutil_proc_threads(PyObject *self, PyObject *args) { continue; if (kp[i].p_pid == pid) { py_tuple = Py_BuildValue( - "Idd", + _Py_PARSE_PID "dd", kp[i].p_tid, PSUTIL_KPT2DOUBLE(kp[i].p_uutime), PSUTIL_KPT2DOUBLE(kp[i].p_ustime)); @@ -402,13 +402,13 @@ error: PyObject * psutil_proc_num_fds(PyObject *self, PyObject *args) { - long pid; + pid_t pid; int cnt; struct kinfo_file *freep; struct kinfo_proc kipp; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; if (psutil_kinfo_proc(pid, &kipp) == -1) @@ -428,12 +428,12 @@ psutil_proc_cwd(PyObject *self, PyObject *args) { // Reference: // https://github.com/openbsd/src/blob/ // 588f7f8c69786211f2d16865c552afb91b1c7cba/bin/ps/print.c#L191 - long pid; + pid_t pid; struct kinfo_proc kp; char path[MAXPATHLEN]; size_t pathlen = sizeof path; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; if (psutil_kinfo_proc(pid, &kp) == -1) return NULL; @@ -492,7 +492,7 @@ psutil_inet6_addrstr(struct in6_addr *p) */ PyObject * psutil_proc_connections(PyObject *self, PyObject *args) { - long pid; + pid_t pid; int i; int cnt; struct kinfo_file *freep = NULL; @@ -509,7 +509,8 @@ psutil_proc_connections(PyObject *self, PyObject *args) { if (py_retlist == NULL) return NULL; - if (! PyArg_ParseTuple(args, "lOO", &pid, &py_af_filter, &py_type_filter)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID "OO", &pid, &py_af_filter, + &py_type_filter)) goto error; if (!PySequence_Check(py_af_filter) || !PySequence_Check(py_type_filter)) { PyErr_SetString(PyExc_TypeError, "arg 2 or 3 is not a sequence"); diff --git a/psutil/arch/openbsd/specific.h b/psutil/arch/openbsd/specific.h index 4f870268..b8170a02 100644 --- a/psutil/arch/openbsd/specific.h +++ b/psutil/arch/openbsd/specific.h @@ -10,10 +10,10 @@ typedef struct kinfo_proc kinfo_proc; int psutil_kinfo_proc(pid_t pid, struct kinfo_proc *proc); -struct kinfo_file * kinfo_getfile(long pid, int* cnt); +struct kinfo_file * kinfo_getfile(pid_t pid, int* cnt); int psutil_get_proc_list(struct kinfo_proc **procList, size_t *procCount); -char **_psutil_get_argv(long pid); -PyObject * psutil_get_cmdline(long pid); +char **_psutil_get_argv(pid_t pid); +PyObject * psutil_get_cmdline(pid_t pid); // PyObject *psutil_proc_threads(PyObject *self, PyObject *args); diff --git a/psutil/arch/osx/process_info.c b/psutil/arch/osx/process_info.c index 47cf864f..4b84a723 100644 --- a/psutil/arch/osx/process_info.c +++ b/psutil/arch/osx/process_info.c @@ -119,7 +119,7 @@ psutil_get_argmax() { // Return 1 if pid refers to a zombie process else 0. int -psutil_is_zombie(long pid) { +psutil_is_zombie(pid_t pid) { struct kinfo_proc kp; if (psutil_get_kinfo_proc(pid, &kp) == -1) @@ -131,7 +131,7 @@ psutil_is_zombie(long pid) { // return process args as a python list PyObject * -psutil_get_cmdline(long pid) { +psutil_get_cmdline(pid_t pid) { int mib[3]; int nargs; size_t len; @@ -162,7 +162,7 @@ psutil_get_cmdline(long pid) { // read argument space mib[0] = CTL_KERN; mib[1] = KERN_PROCARGS2; - mib[2] = (pid_t)pid; + mib[2] = pid; if (sysctl(mib, 3, procargs, &argmax, NULL, 0) < 0) { // In case of zombie process we'll get EINVAL. We translate it // to NSP and _psosx.py will translate it to ZP. @@ -225,7 +225,7 @@ error: // return process environment as a python string PyObject * -psutil_get_environ(long pid) { +psutil_get_environ(pid_t pid) { int mib[3]; int nargs; char *procargs = NULL; @@ -254,7 +254,7 @@ psutil_get_environ(long pid) { // read argument space mib[0] = CTL_KERN; mib[1] = KERN_PROCARGS2; - mib[2] = (pid_t)pid; + mib[2] = pid; if (sysctl(mib, 3, procargs, &argmax, NULL, 0) < 0) { // In case of zombie process we'll get EINVAL. We translate it // to NSP and _psosx.py will translate it to ZP. @@ -339,13 +339,13 @@ error: int -psutil_get_kinfo_proc(long pid, struct kinfo_proc *kp) { +psutil_get_kinfo_proc(pid_t pid, struct kinfo_proc *kp) { int mib[4]; size_t len; mib[0] = CTL_KERN; mib[1] = KERN_PROC; mib[2] = KERN_PROC_PID; - mib[3] = (pid_t)pid; + mib[3] = pid; // fetch the info with sysctl() len = sizeof(struct kinfo_proc); @@ -371,9 +371,9 @@ psutil_get_kinfo_proc(long pid, struct kinfo_proc *kp) { * Returns 0 on failure (and Python exception gets already set). */ int -psutil_proc_pidinfo(long pid, int flavor, uint64_t arg, void *pti, int size) { +psutil_proc_pidinfo(pid_t pid, int flavor, uint64_t arg, void *pti, int size) { errno = 0; - int ret = proc_pidinfo((int)pid, flavor, arg, pti, size); + int ret = proc_pidinfo(pid, flavor, arg, pti, size); if ((ret <= 0) || ((unsigned long)ret < sizeof(pti))) { psutil_raise_for_pid(pid, "proc_pidinfo()"); return 0; diff --git a/psutil/arch/osx/process_info.h b/psutil/arch/osx/process_info.h index bd7ffa89..35755247 100644 --- a/psutil/arch/osx/process_info.h +++ b/psutil/arch/osx/process_info.h @@ -9,10 +9,10 @@ typedef struct kinfo_proc kinfo_proc; int psutil_get_argmax(void); -int psutil_is_zombie(long pid); -int psutil_get_kinfo_proc(long pid, struct kinfo_proc *kp); +int psutil_is_zombie(pid_t pid); +int psutil_get_kinfo_proc(pid_t pid, struct kinfo_proc *kp); int psutil_get_proc_list(kinfo_proc **procList, size_t *procCount); int psutil_proc_pidinfo( - long pid, int flavor, uint64_t arg, void *pti, int size); -PyObject* psutil_get_cmdline(long pid); -PyObject* psutil_get_environ(long pid); + pid_t pid, int flavor, uint64_t arg, void *pti, int size); +PyObject* psutil_get_cmdline(pid_t pid); +PyObject* psutil_get_environ(pid_t pid); diff --git a/psutil/arch/windows/process_info.c b/psutil/arch/windows/process_info.c index 64ff0f0d..d8104c81 100644 --- a/psutil/arch/windows/process_info.c +++ b/psutil/arch/windows/process_info.c @@ -58,7 +58,7 @@ enum psutil_process_data_kind { * -1 is returned, and an appropriate Python exception is set. */ static int -psutil_get_process_data(long pid, +psutil_get_process_data(DWORD pid, enum psutil_process_data_kind kind, WCHAR **pdata, SIZE_T *psize) { @@ -377,7 +377,7 @@ error: * AccessDenied. Requires Windows 8.1+. */ static int -psutil_cmdline_query_proc(long pid, WCHAR **pdata, SIZE_T *psize) { +psutil_cmdline_query_proc(DWORD pid, WCHAR **pdata, SIZE_T *psize) { HANDLE hProcess = NULL; ULONG bufLen = 0; NTSTATUS status; @@ -470,7 +470,7 @@ error: * with given pid or NULL on error. */ PyObject * -psutil_get_cmdline(long pid, int use_peb) { +psutil_get_cmdline(DWORD pid, int use_peb) { PyObject *ret = NULL; WCHAR *data = NULL; SIZE_T size; @@ -531,7 +531,7 @@ out: PyObject * -psutil_get_cwd(long pid) { +psutil_get_cwd(DWORD pid) { PyObject *ret = NULL; WCHAR *data = NULL; SIZE_T size; @@ -555,7 +555,7 @@ out: * process with given pid or NULL on error. */ PyObject * -psutil_get_environ(long pid) { +psutil_get_environ(DWORD pid) { PyObject *ret = NULL; WCHAR *data = NULL; SIZE_T size; @@ -672,7 +672,7 @@ psutil_proc_info(PyObject *self, PyObject *args) { long long create_time; PyObject *py_retlist; - if (! PyArg_ParseTuple(args, "l", &pid)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; if (! psutil_get_proc_info(pid, &process, &buffer)) return NULL; diff --git a/psutil/arch/windows/process_info.h b/psutil/arch/windows/process_info.h index 5fe342b3..5e89ddeb 100644 --- a/psutil/arch/windows/process_info.h +++ b/psutil/arch/windows/process_info.h @@ -15,7 +15,7 @@ int psutil_get_proc_info(DWORD pid, PSYSTEM_PROCESS_INFORMATION *retProcess, PVOID *retBuffer); -PyObject* psutil_get_cmdline(long pid, int use_peb); -PyObject* psutil_get_cwd(long pid); -PyObject* psutil_get_environ(long pid); +PyObject* psutil_get_cmdline(DWORD pid, int use_peb); +PyObject* psutil_get_cwd(DWORD pid); +PyObject* psutil_get_environ(DWORD pid); PyObject* psutil_proc_info(PyObject *self, PyObject *args); diff --git a/psutil/arch/windows/process_utils.c b/psutil/arch/windows/process_utils.c index dbdebd48..f9d2f2f9 100644 --- a/psutil/arch/windows/process_utils.c +++ b/psutil/arch/windows/process_utils.c @@ -152,7 +152,6 @@ psutil_pid_is_running(DWORD pid) { return 1; if (pid < 0) return 0; - return psutil_pid_in_pids(pid); hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pid); @@ -167,9 +166,6 @@ psutil_pid_is_running(DWORD pid) { } CloseHandle(hProcess); - if ((PSUTIL_TESTING) && (psutil_pid_in_pids(pid) == 1)) { - PyErr_SetString(PyExc_AssertionError, "NULL handle but PID exists"); - return -1; - } - return 0; + PyErr_Clear(); + return psutil_pid_in_pids(pid); } diff --git a/psutil/arch/windows/socks.c b/psutil/arch/windows/socks.c index 5272e127..cb19d5d2 100644 --- a/psutil/arch/windows/socks.c +++ b/psutil/arch/windows/socks.c @@ -113,7 +113,7 @@ static DWORD __GetExtendedUdpTable(TYPE_GetExtendedUdpTable call, PyObject * psutil_net_connections(PyObject *self, PyObject *args) { static long null_address[4] = { 0, 0, 0, 0 }; - unsigned long pid; + DWORD pid; int pid_return; PVOID table = NULL; DWORD tableSize; @@ -126,7 +126,7 @@ psutil_net_connections(PyObject *self, PyObject *args) { CHAR addressBufferLocal[65]; CHAR addressBufferRemote[65]; - PyObject *py_retlist; + PyObject *py_retlist = NULL; PyObject *py_conn_tuple = NULL; PyObject *py_af_filter = NULL; PyObject *py_type_filter = NULL; @@ -137,9 +137,11 @@ psutil_net_connections(PyObject *self, PyObject *args) { PyObject *_SOCK_STREAM = PyLong_FromLong((long)SOCK_STREAM); PyObject *_SOCK_DGRAM = PyLong_FromLong((long)SOCK_DGRAM); - // Import some functions. - if (! PyArg_ParseTuple(args, "lOO", &pid, &py_af_filter, &py_type_filter)) + if (! PyArg_ParseTuple(args, _Py_PARSE_PID "OO", &pid, &py_af_filter, + &py_type_filter)) + { goto error; + } if (!PySequence_Check(py_af_filter) || !PySequence_Check(py_type_filter)) { psutil_conn_decref_objs(); diff --git a/psutil/tests/test_bsd.py b/psutil/tests/test_bsd.py index 7cba4b78..e525e667 100755 --- a/psutil/tests/test_bsd.py +++ b/psutil/tests/test_bsd.py @@ -372,10 +372,11 @@ class FreeBSDSystemTestCase(unittest.TestCase): self.assertAlmostEqual(psutil.cpu_stats().soft_interrupts, sysctl('vm.stats.sys.v_soft'), delta=1000) + @retry_on_failure() def test_cpu_stats_syscalls(self): # pretty high tolerance but it looks like it's OK. self.assertAlmostEqual(psutil.cpu_stats().syscalls, - sysctl('vm.stats.sys.v_syscall'), delta=100000) + sysctl('vm.stats.sys.v_syscall'), delta=200000) # def test_cpu_stats_traps(self): # self.assertAlmostEqual(psutil.cpu_stats().traps, diff --git a/psutil/tests/test_connections.py b/psutil/tests/test_connections.py index aede6640..c7fe1992 100755 --- a/psutil/tests/test_connections.py +++ b/psutil/tests/test_connections.py @@ -32,6 +32,7 @@ from psutil.tests import AF_UNIX from psutil.tests import bind_socket from psutil.tests import bind_unix_socket from psutil.tests import check_net_address +from psutil.tests import CIRRUS from psutil.tests import create_sockets from psutil.tests import enum from psutil.tests import get_free_port @@ -191,7 +192,7 @@ class TestUnconnectedSockets(Base, unittest.TestCase): def get_conn_from_sock(self, sock): cons = thisproc.connections(kind='all') smap = dict([(c.fd, c) for c in cons]) - if NETBSD: + if NETBSD or FREEBSD: # NetBSD opens a UNIX socket to /var/log/run # so there may be more connections. return smap[sock.fileno()] @@ -321,8 +322,10 @@ class TestConnectedSocket(Base, unittest.TestCase): if NETBSD or FREEBSD: # On NetBSD creating a UNIX socket will cause # a UNIX connection to /var/run/log. - cons = [c for c in cons if c.raddr != '/var/run/log' and - c.laddr] + cons = [c for c in cons if c.raddr != '/var/run/log'] + if CIRRUS: + cons = [c for c in cons if c.fd in + (server.fileno(), client.fileno())] self.assertEqual(len(cons), 2, msg=cons) if LINUX or FREEBSD or SUNOS: # remote path is never set diff --git a/psutil/tests/test_contracts.py b/psutil/tests/test_contracts.py index 13a5bb49..bdf055d0 100755 --- a/psutil/tests/test_contracts.py +++ b/psutil/tests/test_contracts.py @@ -238,7 +238,8 @@ class TestSystemAPITypes(unittest.TestCase): @unittest.skipIf(not HAS_CPU_FREQ, "not supported") def test_cpu_freq(self): - print(repr(psutil.cpu_freq())) + if psutil.cpu_freq() is None: + raise self.skipTest("cpu_freq() returns None") self.assert_ntuple_of_nums(psutil.cpu_freq(), type_=(float, int, long)) def test_disk_io_counters(self): diff --git a/psutil/tests/test_linux.py b/psutil/tests/test_linux.py index f503b384..80bbd113 100755 --- a/psutil/tests/test_linux.py +++ b/psutil/tests/test_linux.py @@ -313,6 +313,7 @@ class TestSystemVirtualMemory(unittest.TestCase): self.assertEqual(ret.available, 0) self.assertEqual(ret.slab, 0) + @retry_on_failure() def test_avail_old_percent(self): # Make sure that our calculation of avail mem for old kernels # is off by max 10%. diff --git a/psutil/tests/test_memory_leaks.py b/psutil/tests/test_memory_leaks.py index ba75eef0..132a0b07 100755 --- a/psutil/tests/test_memory_leaks.py +++ b/psutil/tests/test_memory_leaks.py @@ -23,6 +23,7 @@ import time import psutil import psutil._common +from psutil import FREEBSD from psutil import LINUX from psutil import MACOS from psutil import OPENBSD @@ -32,12 +33,13 @@ from psutil import WINDOWS from psutil._common import bytes2human from psutil._compat import ProcessLookupError from psutil._compat import xrange +from psutil.tests import CIRRUS from psutil.tests import create_sockets from psutil.tests import get_test_subprocess from psutil.tests import HAS_CPU_AFFINITY from psutil.tests import HAS_CPU_FREQ -from psutil.tests import HAS_GETLOADAVG from psutil.tests import HAS_ENVIRON +from psutil.tests import HAS_GETLOADAVG from psutil.tests import HAS_IONICE from psutil.tests import HAS_MEMORY_MAPS from psutil.tests import HAS_NET_IO_COUNTERS @@ -365,14 +367,14 @@ class TestProcessObjectLeaks(TestMemLeak): self.execute(cext.proc_info, os.getpid()) +@unittest.skipIf(not WINDOWS, "WINDOWS only") class TestProcessDualImplementation(TestMemLeak): - if WINDOWS: - def test_cmdline_peb_true(self): - self.execute(cext.proc_cmdline, os.getpid(), use_peb=True) + def test_cmdline_peb_true(self): + self.execute(cext.proc_cmdline, os.getpid(), use_peb=True) - def test_cmdline_peb_false(self): - self.execute(cext.proc_cmdline, os.getpid(), use_peb=False) + def test_cmdline_peb_false(self): + self.execute(cext.proc_cmdline, os.getpid(), use_peb=False) class TestTerminatedProcessLeaks(TestProcessObjectLeaks): @@ -485,8 +487,7 @@ class TestModuleFunctionsLeaks(TestMemLeak): self.execute(psutil.virtual_memory) # TODO: remove this skip when this gets fixed - @unittest.skipIf(SUNOS, - "worthless on SUNOS (uses a subprocess)") + @unittest.skipIf(SUNOS, "worthless on SUNOS (uses a subprocess)") def test_swap_memory(self): self.execute(psutil.swap_memory) @@ -519,14 +520,14 @@ class TestModuleFunctionsLeaks(TestMemLeak): # --- net - @unittest.skipIf(TRAVIS and MACOS, "false positive on travis") + @unittest.skipIf(TRAVIS and MACOS, "false positive on TRAVIS + MACOS") + @unittest.skipIf(CIRRUS and FREEBSD, "false positive on CIRRUS + FREEBSD") @skip_if_linux() @unittest.skipIf(not HAS_NET_IO_COUNTERS, 'not supported') def test_net_io_counters(self): self.execute(psutil.net_io_counters, nowrap=False) - @unittest.skipIf(LINUX, - "worthless on Linux (pure python)") + @skip_if_linux() @unittest.skipIf(MACOS and os.getuid() != 0, "need root access") def test_net_connections(self): with create_sockets(): @@ -564,7 +565,6 @@ class TestModuleFunctionsLeaks(TestMemLeak): def test_boot_time(self): self.execute(psutil.boot_time) - # XXX - on Windows this produces a false positive @unittest.skipIf(WINDOWS, "XXX produces a false positive on Windows") def test_users(self): self.execute(psutil.users) diff --git a/psutil/tests/test_process.py b/psutil/tests/test_process.py index b1b30750..0b54f5b1 100755 --- a/psutil/tests/test_process.py +++ b/psutil/tests/test_process.py @@ -24,7 +24,6 @@ import psutil from psutil import AIX from psutil import BSD -from psutil import FREEBSD from psutil import LINUX from psutil import MACOS from psutil import NETBSD @@ -1085,17 +1084,13 @@ class TestProcess(unittest.TestCase): side_effect=psutil.NoSuchProcess(0, 'foo')): self.assertIsNone(p.parent()) + @retry_on_failure() def test_parents(self): assert psutil.Process().parents() p1, p2 = create_proc_children_pair() self.assertEqual(p1.parents()[0], psutil.Process()) self.assertEqual(p2.parents()[0], p1) self.assertEqual(p2.parents()[1], psutil.Process()) - if POSIX and not FREEBSD: - # On FreeBSD PID 1 has an older/smaller time than PID 0 (?) - lowest_pid = psutil.pids()[0] - self.assertEqual(p1.parents()[-1].pid, lowest_pid) - self.assertEqual(p2.parents()[-1].pid, lowest_pid) def test_children(self): reap_children(recursive=True) diff --git a/psutil/tests/test_unicode.py b/psutil/tests/test_unicode.py index 6308de09..6b1d720e 100755 --- a/psutil/tests/test_unicode.py +++ b/psutil/tests/test_unicode.py @@ -65,6 +65,7 @@ from psutil import WINDOWS from psutil._compat import PY3 from psutil._compat import u from psutil.tests import APPVEYOR +from psutil.tests import CIRRUS from psutil.tests import ASCII_FS from psutil.tests import bind_unix_socket from psutil.tests import chdir @@ -233,7 +234,7 @@ class _BaseFSAPIsTests(object): conn = psutil.Process().connections('unix')[0] self.assertIsInstance(conn.laddr, str) # AF_UNIX addr not set on OpenBSD - if not OPENBSD: + if not OPENBSD and not CIRRUS: # XXX self.assertEqual(conn.laddr, name) @unittest.skipIf(not POSIX, "POSIX only") @@ -158,7 +158,7 @@ if WINDOWS: "psapi", "kernel32", "advapi32", "shell32", "netapi32", "wtsapi32", "ws2_32", "PowrProf", "pdh", ], - # extra_compile_args=["/Z7"], + # extra_compile_args=["/W 4"], # extra_link_args=["/DEBUG"] ) |