From d1db1c791195f3c0cf148e2be8bd46c5a51ca535 Mon Sep 17 00:00:00 2001 From: Palo Kisa Date: Tue, 7 Mar 2023 14:21:40 +0100 Subject: [PATCH 978/978] reaper: Build/Run on systems with procps-ng >= 4.0.0 (#456) On Linux, make it possible to use libproc2 or libprocps whichever is available. --- CMakeLists.txt | 6 +++++- lxqt-session/src/procreaper.cpp | 24 +++++++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a3c5e0d..f208600 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,7 +35,11 @@ find_package(X11 REQUIRED) message(STATUS "Building with Qt${Qt5Core_VERSION}") find_package(PkgConfig REQUIRED) if (CMAKE_SYSTEM_NAME STREQUAL "Linux") - pkg_search_module(PROCPS REQUIRED libprocps) + pkg_search_module(PROCPS REQUIRED libproc2 libprocps) + message(STATUS "Using PROCPS -> ${PROCPS_MODULE_NAME} v${PROCPS_VERSION}") + if (PROCPS_VERSION VERSION_GREATER_EQUAL 4.0.0) + add_definitions("-DUSING_LIBPROC2") + endif() endif() # Please don't move, must be after lxqt diff --git a/lxqt-session/src/procreaper.cpp b/lxqt-session/src/procreaper.cpp index 2acd030..1ea4bdc 100644 --- a/lxqt-session/src/procreaper.cpp +++ b/lxqt-session/src/procreaper.cpp @@ -29,7 +29,11 @@ #include "log.h" #if defined(Q_OS_LINUX) #include -#include +# if defined(USING_LIBPROC2) +# include +# else +# include +# endif #elif defined(Q_OS_FREEBSD) #include #include @@ -109,6 +113,23 @@ void ProcReaper::stop(const std::set & excludedPids) const pid_t my_pid = ::getpid(); std::vector children; #if defined(Q_OS_LINUX) +# if defined(USING_LIBPROC2) + constexpr pids_item items[] = { PIDS_ID_PPID, PIDS_ID_TGID }; + enum rel_items { rel_ppid, rel_tgid }; + pids_info * info = nullptr; + procps_pids_new(&info, const_cast(items), sizeof(items) / sizeof(pids_item)); + pids_stack * stack = nullptr; + while ((stack = procps_pids_get(info, PIDS_FETCH_TASKS_ONLY))) + { + const int ppid = PIDS_VAL(rel_ppid, s_int, stack, info); + if (ppid == my_pid) + { + const int tgid = PIDS_VAL(rel_tgid, s_int, stack, info); + children.push_back(tgid); + } + } + procps_pids_unref(&info); +# else PROCTAB * proc_dir = ::openproc(PROC_FILLSTAT); while (proc_t * proc = ::readproc(proc_dir, nullptr)) { @@ -119,6 +140,7 @@ void ProcReaper::stop(const std::set & excludedPids) ::freeproc(proc); } ::closeproc(proc_dir); +# endif #elif defined(Q_OS_FREEBSD) int cnt = 0; if (kinfo_proc *proc_info = kinfo_getallproc(&cnt)) -- 2.39.2 ix/commit/doc/images/coreutils-graph.dot?id=aaee461b9d5fb85fc1a548877dc7eea3dd4fbf50'>doc: Update dot graphs....* doc/images/bootstrap-packages.dot, doc/images/coreutils-bag-graph.dot, doc/images/coreutils-graph.dot, doc/images/shepherd-graph.dot: Regenerate. Ludovic Courtès 2015-10-15doc: Regenerate 'guix graph' examples....* doc/images/coreutils-bag-graph.dot, doc/images/coreutils-graph.dot: Regenerate from current packages. This removes the weird dependency on 'sed'. Ludovic Courtès 2015-08-27Add 'guix graph'....* guix/scripts/graph.scm, tests/graph.scm, tests/guix-graph.sh, doc/images/coreutils-bag-graph.dot, doc/images/coreutils-graph.dot: New files. * Makefile.am (MODULES): Add guix/scripts/graph.scm. (SH_TESTS): Add tests/guix-graph.sh. (SCM_TESTS): Add tests/graph.scm. * doc.am (DOT_FILES, DOT_VECTOR_GRAPHICS): New variables. (EXTRA_DIST): Use them. (dist_infoimage_DATA): Use $(DOT_FILES). (pdf-local, info-local, ps-local): Likewise. * doc/guix.texi (Packages with Multiple Outputs): Add cross-reference to 'guix graph'. (Invoking guix gc): Likewise. (Invoking guix graph): New section. Ludovic Courtès