aboutsummaryrefslogtreecommitdiffstats
path: root/Process.c
diff options
context:
space:
mode:
Diffstat (limited to 'Process.c')
-rw-r--r--Process.c116
1 files changed, 63 insertions, 53 deletions
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:

© 2014-2024 Faster IT GmbH | imprint | privacy policy