diff options
author | marcluque <marc.luque@outlook.com> | 2021-10-12 00:45:09 +0200 |
---|---|---|
committer | cgzones <cgzones@googlemail.com> | 2021-11-02 20:02:54 +0100 |
commit | d8dfbbd37ca7855be44391697424edac9015f14f (patch) | |
tree | 598c12d03eca299cf7096a86c215243d5d63e504 /Process.c | |
parent | afa3fe4af1af9dc5347c06578fa2fb940f8cfc8d (diff) |
Tidy up process state handling
Diffstat (limited to 'Process.c')
-rw-r--r-- | Process.c | 92 |
1 files changed, 43 insertions, 49 deletions
@@ -415,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; @@ -749,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); @@ -883,22 +905,32 @@ 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, "%*d ", Process_uidDigits, this->st_uid); break; @@ -1072,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; @@ -1164,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: |