summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiampaolo Rodola <g.rodola@gmail.com>2023-04-14 21:38:07 +0000
committerGiampaolo Rodola <g.rodola@gmail.com>2023-04-14 21:38:07 +0000
commit19461905377ce3060b60df1949c082086492dab9 (patch)
tree4da20c0133cbc1902e59bc22926c66742f4c3160
parenta0b096c88421548593ecebe93bbe369385087f3b (diff)
downloadpsutil-19461905377ce3060b60df1949c082086492dab9.tar.gz
Fix #2236 / NetNBSD: skip terminated process threads
Process threads() and num_threads() methods now skip threads which are in ZOMBIE or IDLE state. It turns out that after a thread is terminated / join()ed, instead of disappearing it can stick around in a ZOMBIE or IDLE state, presumably for a while before being garbage collected. Signed-off-by: Giampaolo Rodola <g.rodola@gmail.com>
-rw-r--r--HISTORY.rst2
-rw-r--r--psutil/arch/netbsd/proc.c4
2 files changed, 6 insertions, 0 deletions
diff --git a/HISTORY.rst b/HISTORY.rst
index d214e61f..324961bc 100644
--- a/HISTORY.rst
+++ b/HISTORY.rst
@@ -37,6 +37,8 @@
- 2231_, [NetBSD]: *available* `virtual_memory()`_ is higher than *total*.
- 2234_, [NetBSD]: `virtual_memory()`_ metrics are wrong: *available* and
*used* are too high. We now match values shown by *htop* CLI utility.
+- 2236_, [NetBSD]: `Process.num_threads()`_ and `Process.threads()`_ return
+ threads that are already terminated.
5.9.4
=====
diff --git a/psutil/arch/netbsd/proc.c b/psutil/arch/netbsd/proc.c
index b87473a6..e71afb38 100644
--- a/psutil/arch/netbsd/proc.c
+++ b/psutil/arch/netbsd/proc.c
@@ -247,6 +247,10 @@ psutil_proc_threads(PyObject *self, PyObject *args) {
nlwps = (int)(size / sizeof(struct kinfo_lwp));
for (i = 0; i < nlwps; i++) {
+ if ((&kl[i])->l_stat == LSIDL || (&kl[i])->l_stat == LSZOMB)
+ continue;
+ // XXX: we return 2 "user" times because the struct does not provide
+ // any "system" time.
py_tuple = Py_BuildValue("idd",
(&kl[i])->l_lid,
PSUTIL_KPT2DOUBLE((&kl[i])->l_rtime),