summaryrefslogtreecommitdiffhomepage
path: root/compat/process-list.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'compat/process-list.hpp')
-rw-r--r--compat/process-list.hpp23
1 files changed, 18 insertions, 5 deletions
diff --git a/compat/process-list.hpp b/compat/process-list.hpp
index 6d960610..39e12603 100644
--- a/compat/process-list.hpp
+++ b/compat/process-list.hpp
@@ -52,7 +52,7 @@ static QStringList get_all_executable_names()
template<typename = void>
static QStringList get_all_executable_names()
{
- QStringList ret;
+ QStringList ret; ret.reserve(2048);
std::vector<int> vec;
while (true)
@@ -138,19 +138,32 @@ static QStringList get_all_executable_names()
template<typename = void>
QStringList get_all_executable_names()
{
- QStringList ret;
+ QStringList ret; ret.reserve(2048);
enum pids_item items[] = { PIDS_ID_PID, PIDS_CMD, PIDS_CMDLINE_V };
enum rel_items { rel_pid, rel_cmd, rel_cmdline };
struct pids_info *info = NULL;
struct pids_stack *stack;
- QString tmp; tmp.reserve(64);
+ QString tmp; tmp.reserve(255);
procps_pids_new(&info, items, 3);
+ // procps-ng version 4.0.5 removed an unused argument in PIDS_VAL() macro.
+ // cf. https://gitlab.com/procps-ng/procps/-/commit/967fdcfb06e20aad0f3
+
+ // Although the emitted machine code is identical, backward API
+ // compatibility was silently broken in the patch with no upgrade path
+ // (e.g. deprecating PIDS_VAL() while introducing PIDS_VAL2()).
+
+ // Unfortunately, procps-ng doesn't include a #define for identifying its
+ // version. For these reasons the code below depends on undocumented ABI
+ // compatibility between procps-ng versions.. -sh 20241226
+
+#define OPENTRACK_PIDS_VAL(i, type, stack) stack->head[i].result.type
+
while ((stack = procps_pids_get(info, PIDS_FETCH_TASKS_ONLY)))
{
- char **p_cmdline = PIDS_VAL(rel_cmdline, strv, stack, info);
+ char **p_cmdline = OPENTRACK_PIDS_VAL(rel_cmdline, strv, stack);
// note, wine sets argv[0] so no parsing like in OSX case
if (p_cmdline && p_cmdline[0] && p_cmdline[0][0] &&
@@ -177,7 +190,7 @@ QStringList get_all_executable_names()
template<typename = void>
QStringList get_all_executable_names()
{
- QStringList ret;
+ QStringList ret; ret.reserve(2048);
proc_t** procs = readproctab(PROC_FILLCOM);
if (procs == nullptr)
{