From ce27f8379d143d64ab6a7787fdf38cb864e18edd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= Date: Sun, 8 Aug 2021 16:04:26 +0200 Subject: Respect "Show custom thread names" setting update Update merged command-line when started with "Show custom thread names" disabled and enabling at runtime. Also only consider showThreadNames when working on userland threads. --- Process.c | 12 ++++++------ linux/LinuxProcessList.c | 19 ++++++++----------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/Process.c b/Process.c index fbc9f732..d359c005 100644 --- a/Process.c +++ b/Process.c @@ -401,7 +401,7 @@ void Process_makeCommandStr(Process* this) { return; if (this->state == 'Z' && !this->mergedCommand.str) return; - if (Process_isUserlandThread(this) && settings->showThreadNames) + if (Process_isUserlandThread(this) && settings->showThreadNames && (showThreadNames == mc->prevShowThreadNames)) return; /* this->mergedCommand.str needs updating only if its state or contents changed. @@ -500,7 +500,7 @@ void Process_makeCommandStr(Process* this) { assert(cmdlineBasenameStart <= (int)strlen(cmdline)); if (!showMergedCommand || !procExe || !procComm) { /* fall back to cmdline */ - if (showMergedCommand && showThreadNames && !procExe && procComm && strlen(procComm)) { /* Prefix column with comm */ + if (showMergedCommand && (!Process_isUserlandThread(this) || showThreadNames) && !procExe && procComm && strlen(procComm)) { /* Prefix column with comm */ if (strncmp(cmdline + cmdlineBasenameStart, procComm, MINIMUM(TASK_COMM_LEN - 1, strlen(procComm))) != 0) { WRITE_HIGHLIGHT(0, strlen(procComm), commAttr, CMDLINE_HIGHLIGHT_FLAG_COMM); str = stpcpy(str, procComm); @@ -524,7 +524,7 @@ void Process_makeCommandStr(Process* this) { assert(exeBasenameOffset <= (int)strlen(procExe)); bool haveCommInExe = false; - if (procExe && procComm && showThreadNames) { + if (procExe && procComm && (!Process_isUserlandThread(this) || showThreadNames)) { haveCommInExe = strncmp(procExe + exeBasenameOffset, procComm, TASK_COMM_LEN - 1) == 0; } @@ -556,14 +556,14 @@ void Process_makeCommandStr(Process* this) { /* Try to match procComm with procExe's basename: This is reliable (predictable) */ if (searchCommInCmdline) { /* commStart/commEnd will be adjusted later along with cmdline */ - haveCommInCmdline = showThreadNames && findCommInCmdline(procComm, cmdline, cmdlineBasenameStart, &commStart, &commEnd); + haveCommInCmdline = (!Process_isUserlandThread(this) || showThreadNames) && findCommInCmdline(procComm, cmdline, cmdlineBasenameStart, &commStart, &commEnd); } int matchLen = matchCmdlinePrefixWithExeSuffix(cmdline, cmdlineBasenameStart, procExe, exeBasenameOffset, exeBasenameLen); bool haveCommField = false; - if (!haveCommInExe && !haveCommInCmdline && procComm && showThreadNames) { + if (!haveCommInExe && !haveCommInCmdline && procComm && (!Process_isUserlandThread(this) || showThreadNames)) { WRITE_SEPARATOR; WRITE_HIGHLIGHT(0, strlen(procComm), commAttr, CMDLINE_HIGHLIGHT_FLAG_COMM); str = stpcpy(str, procComm); @@ -583,7 +583,7 @@ void Process_makeCommandStr(Process* this) { WRITE_SEPARATOR; } - if (!haveCommInExe && haveCommInCmdline && !haveCommField && showThreadNames) + if (!haveCommInExe && haveCommInCmdline && !haveCommField && (!Process_isUserlandThread(this) || showThreadNames)) WRITE_HIGHLIGHT(commStart, commEnd - commStart, commAttr, CMDLINE_HIGHLIGHT_FLAG_COMM); /* Display cmdline if it hasn't been consumed by procExe */ diff --git a/linux/LinuxProcessList.c b/linux/LinuxProcessList.c index 3ad4e2f0..cd218ceb 100644 --- a/linux/LinuxProcessList.c +++ b/linux/LinuxProcessList.c @@ -1223,7 +1223,7 @@ static bool LinuxProcessList_readCmdlineFile(Process* process, openat_arg_t proc if ((amtRead = xReadfileat(procFd, "comm", command, sizeof(command))) > 0) { command[amtRead - 1] = '\0'; Process_updateComm(process, command); - } else if (process->procComm) { + } else { Process_updateComm(process, NULL); } @@ -1543,18 +1543,15 @@ static bool LinuxProcessList_recurseProcTree(LinuxProcessList* this, openat_arg_ LinuxProcessList_readAutogroup(lp, procFd); } - if (proc->state == 'Z' && !proc->cmdline && statCommand[0]) { + if (!proc->cmdline && statCommand[0] && + (proc->state == 'Z' || Process_isKernelThread(proc) || settings->showThreadNames)) { Process_updateCmdline(proc, statCommand, 0, strlen(statCommand)); - } else if (Process_isThread(proc)) { - if ((settings->showThreadNames || Process_isKernelThread(proc)) && statCommand[0]) { - Process_updateCmdline(proc, statCommand, 0, strlen(statCommand)); - } + } - if (Process_isKernelThread(proc)) { - pl->kernelThreads++; - } else { - pl->userlandThreads++; - } + if (Process_isKernelThread(proc)) { + pl->kernelThreads++; + } else if (Process_isUserlandThread(proc)) { + pl->userlandThreads++; } /* Set at the end when we know if a new entry is a thread */ -- cgit v1.2.3