lxqt-session: Backport libprocps compatibility fix

Signed-off-by: Rob Woolley <rob.woolley@windriver.com>
This commit is contained in:
Rob Woolley
2024-05-07 08:25:17 -07:00
committed by Andreas Müller
parent 8238b83467
commit bcc4f2e088
2 changed files with 87 additions and 1 deletions

View File

@@ -13,7 +13,8 @@ DEPENDS += " \
kwindowsystem \
"
SRC_URI += "file://0001-do-not-check-for-xdg-udser-dirs-at-build-time-it-is-.patch"
SRC_URI += "file://0001-do-not-check-for-xdg-udser-dirs-at-build-time-it-is-.patch \
file://reaper-build-run-on-systems-with-procps-ng-4.0.0.patch"
SRCREV = "55aa4bba19814ff678e6693e8b9c423455e8eccc"
PV = "1.2.0"

View File

@@ -0,0 +1,85 @@
The do_configure task for lxqt-session uses pkgconfig to find libprocps.
However, newer releases are named libprocps2. Allow either to be used.
Upstream-Status: Backport[https://github.com/lxqt/lxqt-session/commit/d1db1c791195f3c0cf148e2be8bd46c5a51ca535]
Signed-off-by: Rob Woolley <rob.woolley@windriver.com>
From d1db1c791195f3c0cf148e2be8bd46c5a51ca535 Mon Sep 17 00:00:00 2001
From: Palo Kisa <palo.kisa@gmail.com>
Date: Tue, 7 Mar 2023 14:21:40 +0100
Subject: [PATCH] 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(-)
Index: git/CMakeLists.txt
===================================================================
--- git.orig/CMakeLists.txt
+++ git/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()
Index: git/lxqt-session/src/procreaper.cpp
===================================================================
--- git.orig/lxqt-session/src/procreaper.cpp
+++ git/lxqt-session/src/procreaper.cpp
@@ -29,7 +29,11 @@
#include "log.h"
#if defined(Q_OS_LINUX)
#include <sys/prctl.h>
-#include <proc/readproc.h>
+# if defined(USING_LIBPROC2)
+# include <libproc2/pids.h>
+# else
+# include <proc/readproc.h>
+# endif
#elif defined(Q_OS_FREEBSD)
#include <sys/procctl.h>
#include <libutil.h>
@@ -109,6 +113,23 @@ void ProcReaper::stop(const std::set<int
const pid_t my_pid = ::getpid();
std::vector<pid_t> 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<pids_item *>(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<int
::freeproc(proc);
}
::closeproc(proc_dir);
+# endif
#elif defined(Q_OS_FREEBSD)
int cnt = 0;
if (kinfo_proc *proc_info = kinfo_getallproc(&cnt))