From a6822e98434cf7da6fab033898094976d881ee0f Mon Sep 17 00:00:00 2001 From: Daniel Lange Date: Fri, 4 Feb 2022 11:23:02 +0100 Subject: New upstream version 3.1.2 --- Process.c | 116 ++++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 63 insertions(+), 53 deletions(-) (limited to 'Process.c') diff --git a/Process.c b/Process.c index f0fc67f..6be36b7 100644 --- a/Process.c +++ b/Process.c @@ -41,17 +41,33 @@ static const char* const kthreadID = "KTHREAD"; static uid_t Process_getuid = (uid_t)-1; -int Process_pidDigits = 7; +int Process_pidDigits = PROCESS_MIN_PID_DIGITS; +int Process_uidDigits = PROCESS_MIN_UID_DIGITS; void Process_setupColumnWidths() { int maxPid = Platform_getMaxPid(); if (maxPid == -1) return; + if (maxPid < (int)pow(10, PROCESS_MIN_PID_DIGITS)) { + Process_pidDigits = PROCESS_MIN_PID_DIGITS; + return; + } + Process_pidDigits = ceil(log10(maxPid)); assert(Process_pidDigits <= PROCESS_MAX_PID_DIGITS); } +void Process_setUidColumnWidth(uid_t maxUid) { + if (maxUid < (uid_t)pow(10, PROCESS_MIN_UID_DIGITS)) { + Process_uidDigits = PROCESS_MIN_UID_DIGITS; + return; + } + + Process_uidDigits = ceil(log10(maxUid)); + assert(Process_uidDigits <= PROCESS_MAX_UID_DIGITS); +} + void Process_printBytes(RichString* str, unsigned long long number, bool coloring) { char buffer[16]; int len; @@ -399,7 +415,7 @@ void Process_makeCommandStr(Process* this) { * - a user thread and showThreadNames is not set */ if (Process_isKernelThread(this)) return; - if (this->state == 'Z' && !this->mergedCommand.str) + if (this->state == ZOMBIE && !this->mergedCommand.str) return; if (Process_isUserlandThread(this) && settings->showThreadNames && (showThreadNames == mc->prevShowThreadNames)) return; @@ -733,6 +749,28 @@ void Process_printPercentage(float val, char* buffer, int n, int* attr) { } } +static inline char processStateChar(ProcessState state) { + switch (state) { + case UNKNOWN: return '?'; + case RUNNABLE: return 'U'; + case RUNNING: return 'R'; + case QUEUED: return 'Q'; + case WAITING: return 'W'; + case UNINTERRUPTIBLE_WAIT: return 'D'; + case BLOCKED: return 'B'; + case PAGING: return 'P'; + case STOPPED: return 'T'; + case TRACED: return 't'; + case ZOMBIE: return 'Z'; + case DEFUNCT: return 'X'; + case IDLE: return 'I'; + case SLEEPING: return 'S'; + default: + assert(0); + return '!'; + } +} + void Process_writeField(const Process* this, RichString* str, ProcessField field) { char buffer[256]; size_t n = sizeof(buffer); @@ -867,25 +905,35 @@ void Process_writeField(const Process* this, RichString* str, ProcessField field case SESSION: xSnprintf(buffer, n, "%*d ", Process_pidDigits, this->session); break; case STARTTIME: xSnprintf(buffer, n, "%s", this->starttime_show); break; case STATE: - xSnprintf(buffer, n, "%c ", this->state); + xSnprintf(buffer, n, "%c ", processStateChar(this->state)); switch (this->state) { -#ifdef HTOP_NETBSD - case 'P': -#else - case 'R': -#endif + case RUNNABLE: + case RUNNING: + case TRACED: attr = CRT_colors[PROCESS_RUN_STATE]; break; - case 'D': + + case BLOCKED: + case DEFUNCT: + case STOPPED: + case ZOMBIE: attr = CRT_colors[PROCESS_D_STATE]; break; - case 'I': - case 'S': + + case QUEUED: + case WAITING: + case UNINTERRUPTIBLE_WAIT: + case IDLE: + case SLEEPING: attr = CRT_colors[PROCESS_SHADOW]; break; + + case UNKNOWN: + case PAGING: + break; } break; - case ST_UID: xSnprintf(buffer, n, "%5d ", this->st_uid); break; + case ST_UID: xSnprintf(buffer, n, "%*d ", Process_uidDigits, this->st_uid); break; case TIME: Process_printTime(str, this->time, coloring); return; case TGID: if (this->tgid == this->pid) @@ -908,11 +956,11 @@ void Process_writeField(const Process* this, RichString* str, ProcessField field attr = CRT_colors[PROCESS_SHADOW]; if (this->user) { - Process_printLeftAlignedField(str, attr, this->user, 9); + Process_printLeftAlignedField(str, attr, this->user, 10); return; } - xSnprintf(buffer, n, "%-9d ", this->st_uid); + xSnprintf(buffer, n, "%-10d ", this->st_uid); break; default: if (DynamicColumn_writeField(this, str, field)) @@ -1056,44 +1104,6 @@ int Process_compare(const void* v1, const void* v2) { return (Settings_getActiveDirection(settings) == 1) ? result : -result; } -static uint8_t stateCompareValue(char state) { - switch (state) { - - case 'S': - return 10; - - case 'I': - return 9; - - case 'X': - return 8; - - case 'Z': - return 7; - - case 't': - return 6; - - case 'T': - return 5; - - case 'L': - return 4; - - case 'D': - return 3; - - case 'R': - return 2; - - case '?': - return 1; - - default: - return 0; - } -} - int Process_compareByKey_Base(const Process* p1, const Process* p2, ProcessField key) { int r; @@ -1148,7 +1158,7 @@ int Process_compareByKey_Base(const Process* p1, const Process* p2, ProcessField r = SPACESHIP_NUMBER(p1->starttime_ctime, p2->starttime_ctime); return r != 0 ? r : SPACESHIP_NUMBER(p1->pid, p2->pid); case STATE: - return SPACESHIP_NUMBER(stateCompareValue(p1->state), stateCompareValue(p2->state)); + return SPACESHIP_NUMBER(p1->state, p2->state); case ST_UID: return SPACESHIP_NUMBER(p1->st_uid, p2->st_uid); case TIME: -- cgit v1.2.3