mirror of https://github.com/xzeldon/htop.git
Auto-size (normalized) CPU usage columns
This commit is contained in:
parent
b6c0667eae
commit
edf319e53d
27
Process.c
27
Process.c
|
@ -732,22 +732,22 @@ void Process_printLeftAlignedField(RichString* str, int attr, const char* conten
|
||||||
RichString_appendChr(str, attr, ' ', width + 1 - columns);
|
RichString_appendChr(str, attr, ' ', width + 1 - columns);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Process_printPercentage(float val, char* buffer, int n, int* attr) {
|
void Process_printPercentage(float val, char* buffer, int n, uint8_t width, int* attr) {
|
||||||
if (val >= 0) {
|
if (val >= 0) {
|
||||||
if (val < 99.9F) {
|
if (val < 99.9F) {
|
||||||
if (val < 0.05F) {
|
if (val < 0.05F) {
|
||||||
*attr = CRT_colors[PROCESS_SHADOW];
|
*attr = CRT_colors[PROCESS_SHADOW];
|
||||||
}
|
}
|
||||||
xSnprintf(buffer, n, "%4.1f ", val);
|
xSnprintf(buffer, n, "%*.1f ", width, val);
|
||||||
} else {
|
} else {
|
||||||
*attr = CRT_colors[PROCESS_MEGABYTES];
|
*attr = CRT_colors[PROCESS_MEGABYTES];
|
||||||
if (val < 100.0F)
|
if (val < 100.0F)
|
||||||
val = 100.0F; // Don't round down and display "val" as "99".
|
val = 100.0F; // Don't round down and display "val" as "99".
|
||||||
xSnprintf(buffer, n, "%4.0f ", val);
|
xSnprintf(buffer, n, "%*.0f ", width, val);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
*attr = CRT_colors[PROCESS_SHADOW];
|
*attr = CRT_colors[PROCESS_SHADOW];
|
||||||
xSnprintf(buffer, n, " N/A ");
|
xSnprintf(buffer, n, "%*.*s ", width, width, "N/A");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -888,13 +888,13 @@ void Process_writeField(const Process* this, RichString* str, ProcessField field
|
||||||
|
|
||||||
xSnprintf(buffer, n, "%4ld ", this->nlwp);
|
xSnprintf(buffer, n, "%4ld ", this->nlwp);
|
||||||
break;
|
break;
|
||||||
case PERCENT_CPU: Process_printPercentage(this->percent_cpu, buffer, n, &attr); break;
|
case PERCENT_CPU: Process_printPercentage(this->percent_cpu, buffer, n, Process_fieldWidths[PERCENT_CPU], &attr); break;
|
||||||
case PERCENT_NORM_CPU: {
|
case PERCENT_NORM_CPU: {
|
||||||
float cpuPercentage = this->percent_cpu / this->processList->activeCPUs;
|
float cpuPercentage = this->percent_cpu / this->processList->activeCPUs;
|
||||||
Process_printPercentage(cpuPercentage, buffer, n, &attr);
|
Process_printPercentage(cpuPercentage, buffer, n, Process_fieldWidths[PERCENT_CPU], &attr);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PERCENT_MEM: Process_printPercentage(this->percent_mem, buffer, n, &attr); break;
|
case PERCENT_MEM: Process_printPercentage(this->percent_mem, buffer, n, 4, &attr); break;
|
||||||
case PGRP: xSnprintf(buffer, n, "%*d ", Process_pidDigits, this->pgrp); break;
|
case PGRP: xSnprintf(buffer, n, "%*d ", Process_pidDigits, this->pgrp); break;
|
||||||
case PID: xSnprintf(buffer, n, "%*d ", Process_pidDigits, this->pid); break;
|
case PID: xSnprintf(buffer, n, "%*d ", Process_pidDigits, this->pid); break;
|
||||||
case PPID: xSnprintf(buffer, n, "%*d ", Process_pidDigits, this->ppid); break;
|
case PPID: xSnprintf(buffer, n, "%*d ", Process_pidDigits, this->ppid); break;
|
||||||
|
@ -1272,3 +1272,16 @@ void Process_updateFieldWidth(ProcessField key, size_t width) {
|
||||||
else if (width > Process_fieldWidths[key])
|
else if (width > Process_fieldWidths[key])
|
||||||
Process_fieldWidths[key] = (uint8_t)width;
|
Process_fieldWidths[key] = (uint8_t)width;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Process_updateCPUFieldWidths(float percentage) {
|
||||||
|
if (percentage < 99.9) {
|
||||||
|
Process_updateFieldWidth(PERCENT_CPU, 4);
|
||||||
|
Process_updateFieldWidth(PERCENT_NORM_CPU, 4);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t width = ceil(log10(percentage + .2));
|
||||||
|
|
||||||
|
Process_updateFieldWidth(PERCENT_CPU, width);
|
||||||
|
Process_updateFieldWidth(PERCENT_NORM_CPU, width);
|
||||||
|
}
|
||||||
|
|
|
@ -372,7 +372,7 @@ void Process_fillStarttimeBuffer(Process* this);
|
||||||
|
|
||||||
void Process_printLeftAlignedField(RichString* str, int attr, const char* content, unsigned int width);
|
void Process_printLeftAlignedField(RichString* str, int attr, const char* content, unsigned int width);
|
||||||
|
|
||||||
void Process_printPercentage(float val, char* buffer, int n, int* attr);
|
void Process_printPercentage(float val, char* buffer, int n, uint8_t width, int* attr);
|
||||||
|
|
||||||
void Process_display(const Object* cast, RichString* out);
|
void Process_display(const Object* cast, RichString* out);
|
||||||
|
|
||||||
|
@ -412,5 +412,6 @@ void Process_writeCommand(const Process* this, int attr, int baseAttr, RichStrin
|
||||||
|
|
||||||
void Process_resetFieldWidths(void);
|
void Process_resetFieldWidths(void);
|
||||||
void Process_updateFieldWidth(ProcessField key, size_t width);
|
void Process_updateFieldWidth(ProcessField key, size_t width);
|
||||||
|
void Process_updateCPUFieldWidths(float percentage);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -39,8 +39,8 @@ const ProcessFieldData Process_fields[LAST_PROCESSFIELD] = {
|
||||||
[M_VIRT] = { .name = "M_VIRT", .title = " VIRT ", .description = "Total program size in virtual memory", .flags = 0, .defaultSortDesc = true, },
|
[M_VIRT] = { .name = "M_VIRT", .title = " VIRT ", .description = "Total program size in virtual memory", .flags = 0, .defaultSortDesc = true, },
|
||||||
[M_RESIDENT] = { .name = "M_RESIDENT", .title = " RES ", .description = "Resident set size, size of the text and data sections, plus stack usage", .flags = 0, .defaultSortDesc = true, },
|
[M_RESIDENT] = { .name = "M_RESIDENT", .title = " RES ", .description = "Resident set size, size of the text and data sections, plus stack usage", .flags = 0, .defaultSortDesc = true, },
|
||||||
[ST_UID] = { .name = "ST_UID", .title = "UID", .description = "User ID of the process owner", .flags = 0, },
|
[ST_UID] = { .name = "ST_UID", .title = "UID", .description = "User ID of the process owner", .flags = 0, },
|
||||||
[PERCENT_CPU] = { .name = "PERCENT_CPU", .title = "CPU% ", .description = "Percentage of the CPU time the process used in the last sampling", .flags = 0, .defaultSortDesc = true, },
|
[PERCENT_CPU] = { .name = "PERCENT_CPU", .title = "CPU% ", .description = "Percentage of the CPU time the process used in the last sampling", .flags = 0, .defaultSortDesc = true, .autoWidth = true, },
|
||||||
[PERCENT_NORM_CPU] = { .name = "PERCENT_NORM_CPU", .title = "NCPU%", .description = "Normalized percentage of the CPU time the process used in the last sampling (normalized by cpu count)", .flags = 0, .defaultSortDesc = true, },
|
[PERCENT_NORM_CPU] = { .name = "PERCENT_NORM_CPU", .title = "NCPU%", .description = "Normalized percentage of the CPU time the process used in the last sampling (normalized by cpu count)", .flags = 0, .defaultSortDesc = true, .autoWidth = true, },
|
||||||
[PERCENT_MEM] = { .name = "PERCENT_MEM", .title = "MEM% ", .description = "Percentage of the memory the process is using, based on resident memory size", .flags = 0, .defaultSortDesc = true, },
|
[PERCENT_MEM] = { .name = "PERCENT_MEM", .title = "MEM% ", .description = "Percentage of the memory the process is using, based on resident memory size", .flags = 0, .defaultSortDesc = true, },
|
||||||
[USER] = { .name = "USER", .title = "USER ", .description = "Username of the process owner (or user ID if name cannot be determined)", .flags = 0, },
|
[USER] = { .name = "USER", .title = "USER ", .description = "Username of the process owner (or user ID if name cannot be determined)", .flags = 0, },
|
||||||
[TIME] = { .name = "TIME", .title = " TIME+ ", .description = "Total time the process has spent in user and system time", .flags = 0, .defaultSortDesc = true, },
|
[TIME] = { .name = "TIME", .title = " TIME+ ", .description = "Total time the process has spent in user and system time", .flags = 0, .defaultSortDesc = true, },
|
||||||
|
@ -377,6 +377,7 @@ void DarwinProcess_setFromLibprocPidinfo(DarwinProcess* proc, DarwinProcessList*
|
||||||
} else {
|
} else {
|
||||||
proc->super.percent_cpu = 0.0;
|
proc->super.percent_cpu = 0.0;
|
||||||
}
|
}
|
||||||
|
Process_updateCPUFieldWidths(proc->super.percent_cpu);
|
||||||
|
|
||||||
proc->super.time = nanosecondsToCentiseconds(total_current_time_ns);
|
proc->super.time = nanosecondsToCentiseconds(total_current_time_ns);
|
||||||
proc->super.nlwp = pti.pti_threadnum;
|
proc->super.nlwp = pti.pti_threadnum;
|
||||||
|
|
|
@ -38,8 +38,8 @@ const ProcessFieldData Process_fields[LAST_PROCESSFIELD] = {
|
||||||
[M_VIRT] = { .name = "M_VIRT", .title = " VIRT ", .description = "Total program size in virtual memory", .flags = 0, .defaultSortDesc = true, },
|
[M_VIRT] = { .name = "M_VIRT", .title = " VIRT ", .description = "Total program size in virtual memory", .flags = 0, .defaultSortDesc = true, },
|
||||||
[M_RESIDENT] = { .name = "M_RESIDENT", .title = " RES ", .description = "Resident set size, size of the text and data sections, plus stack usage", .flags = 0, .defaultSortDesc = true, },
|
[M_RESIDENT] = { .name = "M_RESIDENT", .title = " RES ", .description = "Resident set size, size of the text and data sections, plus stack usage", .flags = 0, .defaultSortDesc = true, },
|
||||||
[ST_UID] = { .name = "ST_UID", .title = "UID", .description = "User ID of the process owner", .flags = 0, },
|
[ST_UID] = { .name = "ST_UID", .title = "UID", .description = "User ID of the process owner", .flags = 0, },
|
||||||
[PERCENT_CPU] = { .name = "PERCENT_CPU", .title = "CPU% ", .description = "Percentage of the CPU time the process used in the last sampling", .flags = 0, .defaultSortDesc = true, },
|
[PERCENT_CPU] = { .name = "PERCENT_CPU", .title = "CPU% ", .description = "Percentage of the CPU time the process used in the last sampling", .flags = 0, .defaultSortDesc = true, .autoWidth = true, },
|
||||||
[PERCENT_NORM_CPU] = { .name = "PERCENT_NORM_CPU", .title = "NCPU%", .description = "Normalized percentage of the CPU time the process used in the last sampling (normalized by cpu count)", .flags = 0, .defaultSortDesc = true, },
|
[PERCENT_NORM_CPU] = { .name = "PERCENT_NORM_CPU", .title = "NCPU%", .description = "Normalized percentage of the CPU time the process used in the last sampling (normalized by cpu count)", .flags = 0, .defaultSortDesc = true, .autoWidth = true, },
|
||||||
[PERCENT_MEM] = { .name = "PERCENT_MEM", .title = "MEM% ", .description = "Percentage of the memory the process is using, based on resident memory size", .flags = 0, .defaultSortDesc = true, },
|
[PERCENT_MEM] = { .name = "PERCENT_MEM", .title = "MEM% ", .description = "Percentage of the memory the process is using, based on resident memory size", .flags = 0, .defaultSortDesc = true, },
|
||||||
[USER] = { .name = "USER", .title = "USER ", .description = "Username of the process owner (or user ID if name cannot be determined)", .flags = 0, },
|
[USER] = { .name = "USER", .title = "USER ", .description = "Username of the process owner (or user ID if name cannot be determined)", .flags = 0, },
|
||||||
[TIME] = { .name = "TIME", .title = " TIME+ ", .description = "Total time the process has spent in user and system time", .flags = 0, .defaultSortDesc = true, },
|
[TIME] = { .name = "TIME", .title = " TIME+ ", .description = "Total time the process has spent in user and system time", .flags = 0, .defaultSortDesc = true, },
|
||||||
|
|
|
@ -513,6 +513,7 @@ void ProcessList_goThroughEntries(ProcessList* super, bool pauseProcessUpdate) {
|
||||||
|
|
||||||
proc->percent_cpu = 100.0 * ((double)kproc->kp_lwp.kl_pctcpu / (double)kernelFScale);
|
proc->percent_cpu = 100.0 * ((double)kproc->kp_lwp.kl_pctcpu / (double)kernelFScale);
|
||||||
proc->percent_mem = 100.0 * proc->m_resident / (double)(super->totalMem);
|
proc->percent_mem = 100.0 * proc->m_resident / (double)(super->totalMem);
|
||||||
|
Process_updateCPUFieldWidths(proc->percent_cpu);
|
||||||
|
|
||||||
if (proc->percent_cpu > 0.1) {
|
if (proc->percent_cpu > 0.1) {
|
||||||
// system idle process should own all CPU time left regardless of CPU count
|
// system idle process should own all CPU time left regardless of CPU count
|
||||||
|
|
|
@ -37,8 +37,8 @@ const ProcessFieldData Process_fields[LAST_PROCESSFIELD] = {
|
||||||
[M_VIRT] = { .name = "M_VIRT", .title = " VIRT ", .description = "Total program size in virtual memory", .flags = 0, .defaultSortDesc = true, },
|
[M_VIRT] = { .name = "M_VIRT", .title = " VIRT ", .description = "Total program size in virtual memory", .flags = 0, .defaultSortDesc = true, },
|
||||||
[M_RESIDENT] = { .name = "M_RESIDENT", .title = " RES ", .description = "Resident set size, size of the text and data sections, plus stack usage", .flags = 0, .defaultSortDesc = true, },
|
[M_RESIDENT] = { .name = "M_RESIDENT", .title = " RES ", .description = "Resident set size, size of the text and data sections, plus stack usage", .flags = 0, .defaultSortDesc = true, },
|
||||||
[ST_UID] = { .name = "ST_UID", .title = "UID", .description = "User ID of the process owner", .flags = 0, },
|
[ST_UID] = { .name = "ST_UID", .title = "UID", .description = "User ID of the process owner", .flags = 0, },
|
||||||
[PERCENT_CPU] = { .name = "PERCENT_CPU", .title = "CPU% ", .description = "Percentage of the CPU time the process used in the last sampling", .flags = 0, .defaultSortDesc = true, },
|
[PERCENT_CPU] = { .name = "PERCENT_CPU", .title = "CPU% ", .description = "Percentage of the CPU time the process used in the last sampling", .flags = 0, .defaultSortDesc = true, .autoWidth = true, },
|
||||||
[PERCENT_NORM_CPU] = { .name = "PERCENT_NORM_CPU", .title = "NCPU%", .description = "Normalized percentage of the CPU time the process used in the last sampling (normalized by cpu count)", .flags = 0, .defaultSortDesc = true, },
|
[PERCENT_NORM_CPU] = { .name = "PERCENT_NORM_CPU", .title = "NCPU%", .description = "Normalized percentage of the CPU time the process used in the last sampling (normalized by cpu count)", .flags = 0, .defaultSortDesc = true, .autoWidth = true, },
|
||||||
[PERCENT_MEM] = { .name = "PERCENT_MEM", .title = "MEM% ", .description = "Percentage of the memory the process is using, based on resident memory size", .flags = 0, .defaultSortDesc = true, },
|
[PERCENT_MEM] = { .name = "PERCENT_MEM", .title = "MEM% ", .description = "Percentage of the memory the process is using, based on resident memory size", .flags = 0, .defaultSortDesc = true, },
|
||||||
[USER] = { .name = "USER", .title = "USER ", .description = "Username of the process owner (or user ID if name cannot be determined)", .flags = 0, },
|
[USER] = { .name = "USER", .title = "USER ", .description = "Username of the process owner (or user ID if name cannot be determined)", .flags = 0, },
|
||||||
[TIME] = { .name = "TIME", .title = " TIME+ ", .description = "Total time the process has spent in user and system time", .flags = 0, .defaultSortDesc = true, },
|
[TIME] = { .name = "TIME", .title = " TIME+ ", .description = "Total time the process has spent in user and system time", .flags = 0, .defaultSortDesc = true, },
|
||||||
|
|
|
@ -559,6 +559,7 @@ void ProcessList_goThroughEntries(ProcessList* super, bool pauseProcessUpdate) {
|
||||||
|
|
||||||
proc->percent_cpu = 100.0 * ((double)kproc->ki_pctcpu / (double)kernelFScale);
|
proc->percent_cpu = 100.0 * ((double)kproc->ki_pctcpu / (double)kernelFScale);
|
||||||
proc->percent_mem = 100.0 * proc->m_resident / (double)(super->totalMem);
|
proc->percent_mem = 100.0 * proc->m_resident / (double)(super->totalMem);
|
||||||
|
Process_updateCPUFieldWidths(proc->percent_cpu);
|
||||||
|
|
||||||
if (kproc->ki_stat == SRUN && kproc->ki_oncpu != NOCPU) {
|
if (kproc->ki_stat == SRUN && kproc->ki_oncpu != NOCPU) {
|
||||||
proc->processor = kproc->ki_oncpu;
|
proc->processor = kproc->ki_oncpu;
|
||||||
|
|
|
@ -57,8 +57,8 @@ const ProcessFieldData Process_fields[LAST_PROCESSFIELD] = {
|
||||||
[M_DRS] = { .name = "M_DRS", .title = " DATA ", .description = "Size of the data segment plus stack usage of the process", .flags = 0, .defaultSortDesc = true, },
|
[M_DRS] = { .name = "M_DRS", .title = " DATA ", .description = "Size of the data segment plus stack usage of the process", .flags = 0, .defaultSortDesc = true, },
|
||||||
[M_LRS] = { .name = "M_LRS", .title = " LIB ", .description = "The library size of the process (calculated from memory maps)", .flags = PROCESS_FLAG_LINUX_LRS_FIX, .defaultSortDesc = true, },
|
[M_LRS] = { .name = "M_LRS", .title = " LIB ", .description = "The library size of the process (calculated from memory maps)", .flags = PROCESS_FLAG_LINUX_LRS_FIX, .defaultSortDesc = true, },
|
||||||
[ST_UID] = { .name = "ST_UID", .title = "UID", .description = "User ID of the process owner", .flags = 0, },
|
[ST_UID] = { .name = "ST_UID", .title = "UID", .description = "User ID of the process owner", .flags = 0, },
|
||||||
[PERCENT_CPU] = { .name = "PERCENT_CPU", .title = "CPU% ", .description = "Percentage of the CPU time the process used in the last sampling", .flags = 0, .defaultSortDesc = true, },
|
[PERCENT_CPU] = { .name = "PERCENT_CPU", .title = "CPU% ", .description = "Percentage of the CPU time the process used in the last sampling", .flags = 0, .defaultSortDesc = true, .autoWidth = true, },
|
||||||
[PERCENT_NORM_CPU] = { .name = "PERCENT_NORM_CPU", .title = "NCPU%", .description = "Normalized percentage of the CPU time the process used in the last sampling (normalized by cpu count)", .flags = 0, .defaultSortDesc = true, },
|
[PERCENT_NORM_CPU] = { .name = "PERCENT_NORM_CPU", .title = "NCPU%", .description = "Normalized percentage of the CPU time the process used in the last sampling (normalized by cpu count)", .flags = 0, .defaultSortDesc = true, .autoWidth = true, },
|
||||||
[PERCENT_MEM] = { .name = "PERCENT_MEM", .title = "MEM% ", .description = "Percentage of the memory the process is using, based on resident memory size", .flags = 0, .defaultSortDesc = true, },
|
[PERCENT_MEM] = { .name = "PERCENT_MEM", .title = "MEM% ", .description = "Percentage of the memory the process is using, based on resident memory size", .flags = 0, .defaultSortDesc = true, },
|
||||||
[USER] = { .name = "USER", .title = "USER ", .description = "Username of the process owner (or user ID if name cannot be determined)", .flags = 0, },
|
[USER] = { .name = "USER", .title = "USER ", .description = "Username of the process owner (or user ID if name cannot be determined)", .flags = 0, },
|
||||||
[TIME] = { .name = "TIME", .title = " TIME+ ", .description = "Total time the process has spent in user and system time", .flags = 0, .defaultSortDesc = true, },
|
[TIME] = { .name = "TIME", .title = " TIME+ ", .description = "Total time the process has spent in user and system time", .flags = 0, .defaultSortDesc = true, },
|
||||||
|
@ -270,9 +270,9 @@ static void LinuxProcess_writeField(const Process* this, RichString* str, Proces
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#ifdef HAVE_DELAYACCT
|
#ifdef HAVE_DELAYACCT
|
||||||
case PERCENT_CPU_DELAY: Process_printPercentage(lp->cpu_delay_percent, buffer, n, &attr); break;
|
case PERCENT_CPU_DELAY: Process_printPercentage(lp->cpu_delay_percent, buffer, n, 4, &attr); break;
|
||||||
case PERCENT_IO_DELAY: Process_printPercentage(lp->blkio_delay_percent, buffer, n, &attr); break;
|
case PERCENT_IO_DELAY: Process_printPercentage(lp->blkio_delay_percent, buffer, n, 4, &attr); break;
|
||||||
case PERCENT_SWAP_DELAY: Process_printPercentage(lp->swapin_delay_percent, buffer, n, &attr); break;
|
case PERCENT_SWAP_DELAY: Process_printPercentage(lp->swapin_delay_percent, buffer, n, 4, &attr); break;
|
||||||
#endif
|
#endif
|
||||||
case CTXT:
|
case CTXT:
|
||||||
if (lp->ctxt_diff > 1000) {
|
if (lp->ctxt_diff > 1000) {
|
||||||
|
|
|
@ -1548,6 +1548,7 @@ static bool LinuxProcessList_recurseProcTree(LinuxProcessList* this, openat_arg_
|
||||||
float percent_cpu = (period < 1E-6) ? 0.0F : ((lp->utime + lp->stime - lasttimes) / period * 100.0);
|
float percent_cpu = (period < 1E-6) ? 0.0F : ((lp->utime + lp->stime - lasttimes) / period * 100.0);
|
||||||
proc->percent_cpu = CLAMP(percent_cpu, 0.0F, activeCPUs * 100.0F);
|
proc->percent_cpu = CLAMP(percent_cpu, 0.0F, activeCPUs * 100.0F);
|
||||||
proc->percent_mem = proc->m_resident / (double)(pl->totalMem) * 100.0;
|
proc->percent_mem = proc->m_resident / (double)(pl->totalMem) * 100.0;
|
||||||
|
Process_updateCPUFieldWidths(proc->percent_cpu);
|
||||||
|
|
||||||
if (! LinuxProcessList_updateUser(pl, proc, procFd))
|
if (! LinuxProcessList_updateUser(pl, proc, procFd))
|
||||||
goto errorReadingProcess;
|
goto errorReadingProcess;
|
||||||
|
|
|
@ -148,6 +148,7 @@ const ProcessFieldData Process_fields[LAST_PROCESSFIELD] = {
|
||||||
.description = "Percentage of the CPU time the process used in the last sampling",
|
.description = "Percentage of the CPU time the process used in the last sampling",
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
.defaultSortDesc = true,
|
.defaultSortDesc = true,
|
||||||
|
.autoWidth = true,
|
||||||
},
|
},
|
||||||
[PERCENT_NORM_CPU] = {
|
[PERCENT_NORM_CPU] = {
|
||||||
.name = "PERCENT_NORM_CPU",
|
.name = "PERCENT_NORM_CPU",
|
||||||
|
@ -155,6 +156,7 @@ const ProcessFieldData Process_fields[LAST_PROCESSFIELD] = {
|
||||||
.description = "Normalized percentage of the CPU time the process used in the last sampling (normalized by cpu count)",
|
.description = "Normalized percentage of the CPU time the process used in the last sampling (normalized by cpu count)",
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
.defaultSortDesc = true,
|
.defaultSortDesc = true,
|
||||||
|
.autoWidth = true,
|
||||||
},
|
},
|
||||||
[PERCENT_MEM] = {
|
[PERCENT_MEM] = {
|
||||||
.name = "PERCENT_MEM",
|
.name = "PERCENT_MEM",
|
||||||
|
|
|
@ -318,8 +318,11 @@ static void NetBSDProcessList_scanProcs(NetBSDProcessList* this) {
|
||||||
|
|
||||||
proc->m_virt = kproc->p_vm_vsize;
|
proc->m_virt = kproc->p_vm_vsize;
|
||||||
proc->m_resident = kproc->p_vm_rssize;
|
proc->m_resident = kproc->p_vm_rssize;
|
||||||
|
|
||||||
proc->percent_mem = (proc->m_resident * pageSizeKB) / (double)(this->super.totalMem) * 100.0;
|
proc->percent_mem = (proc->m_resident * pageSizeKB) / (double)(this->super.totalMem) * 100.0;
|
||||||
proc->percent_cpu = CLAMP(getpcpu(kproc), 0.0, this->super.activeCPUs * 100.0);
|
proc->percent_cpu = CLAMP(getpcpu(kproc), 0.0, this->super.activeCPUs * 100.0);
|
||||||
|
Process_updateCPUFieldWidths(proc->percent_cpu);
|
||||||
|
|
||||||
proc->nlwp = kproc->p_nlwps;
|
proc->nlwp = kproc->p_nlwps;
|
||||||
proc->nice = kproc->p_nice - 20;
|
proc->nice = kproc->p_nice - 20;
|
||||||
proc->time = 100 * (kproc->p_rtime_sec + ((kproc->p_rtime_usec + 500000) / 1000000));
|
proc->time = 100 * (kproc->p_rtime_sec + ((kproc->p_rtime_usec + 500000) / 1000000));
|
||||||
|
|
|
@ -146,6 +146,7 @@ const ProcessFieldData Process_fields[LAST_PROCESSFIELD] = {
|
||||||
.description = "Percentage of the CPU time the process used in the last sampling",
|
.description = "Percentage of the CPU time the process used in the last sampling",
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
.defaultSortDesc = true,
|
.defaultSortDesc = true,
|
||||||
|
.autoWidth = true,
|
||||||
},
|
},
|
||||||
[PERCENT_NORM_CPU] = {
|
[PERCENT_NORM_CPU] = {
|
||||||
.name = "PERCENT_NORM_CPU",
|
.name = "PERCENT_NORM_CPU",
|
||||||
|
@ -153,6 +154,7 @@ const ProcessFieldData Process_fields[LAST_PROCESSFIELD] = {
|
||||||
.description = "Normalized percentage of the CPU time the process used in the last sampling (normalized by cpu count)",
|
.description = "Normalized percentage of the CPU time the process used in the last sampling (normalized by cpu count)",
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
.defaultSortDesc = true,
|
.defaultSortDesc = true,
|
||||||
|
.autoWidth = true,
|
||||||
},
|
},
|
||||||
[PERCENT_MEM] = {
|
[PERCENT_MEM] = {
|
||||||
.name = "PERCENT_MEM",
|
.name = "PERCENT_MEM",
|
||||||
|
|
|
@ -330,8 +330,11 @@ static void OpenBSDProcessList_scanProcs(OpenBSDProcessList* this) {
|
||||||
fp->addr = kproc->p_addr;
|
fp->addr = kproc->p_addr;
|
||||||
proc->m_virt = kproc->p_vm_dsize * pageSizeKB;
|
proc->m_virt = kproc->p_vm_dsize * pageSizeKB;
|
||||||
proc->m_resident = kproc->p_vm_rssize * pageSizeKB;
|
proc->m_resident = kproc->p_vm_rssize * pageSizeKB;
|
||||||
|
|
||||||
proc->percent_mem = proc->m_resident / (float)this->super.totalMem * 100.0F;
|
proc->percent_mem = proc->m_resident / (float)this->super.totalMem * 100.0F;
|
||||||
proc->percent_cpu = CLAMP(getpcpu(kproc), 0.0F, this->super.activeCPUs * 100.0F);
|
proc->percent_cpu = CLAMP(getpcpu(kproc), 0.0F, this->super.activeCPUs * 100.0F);
|
||||||
|
Process_updateCPUFieldWidths(proc->percent_cpu);
|
||||||
|
|
||||||
proc->nice = kproc->p_nice - 20;
|
proc->nice = kproc->p_nice - 20;
|
||||||
proc->time = 100 * (kproc->p_rtime_sec + ((kproc->p_rtime_usec + 500000) / 1000000));
|
proc->time = 100 * (kproc->p_rtime_sec + ((kproc->p_rtime_usec + 500000) / 1000000));
|
||||||
proc->priority = kproc->p_priority - PZERO;
|
proc->priority = kproc->p_priority - PZERO;
|
||||||
|
|
|
@ -54,8 +54,8 @@ const ProcessFieldData Process_fields[] = {
|
||||||
[M_LRS] = { .name = "M_LRS", .title = " LIB ", .description = "The library size of the process (unused since Linux 2.6; always 0)", .flags = 0, .defaultSortDesc = true, },
|
[M_LRS] = { .name = "M_LRS", .title = " LIB ", .description = "The library size of the process (unused since Linux 2.6; always 0)", .flags = 0, .defaultSortDesc = true, },
|
||||||
[M_DT] = { .name = "M_DT", .title = " DIRTY ", .description = "Size of the dirty pages of the process (unused since Linux 2.6; always 0)", .flags = 0, .defaultSortDesc = true, },
|
[M_DT] = { .name = "M_DT", .title = " DIRTY ", .description = "Size of the dirty pages of the process (unused since Linux 2.6; always 0)", .flags = 0, .defaultSortDesc = true, },
|
||||||
[ST_UID] = { .name = "ST_UID", .title = "UID", .description = "User ID of the process owner", .flags = 0, },
|
[ST_UID] = { .name = "ST_UID", .title = "UID", .description = "User ID of the process owner", .flags = 0, },
|
||||||
[PERCENT_CPU] = { .name = "PERCENT_CPU", .title = "CPU% ", .description = "Percentage of the CPU time the process used in the last sampling", .flags = 0, .defaultSortDesc = true, },
|
[PERCENT_CPU] = { .name = "PERCENT_CPU", .title = "CPU% ", .description = "Percentage of the CPU time the process used in the last sampling", .flags = 0, .defaultSortDesc = true, .autoWidth = true, },
|
||||||
[PERCENT_NORM_CPU] = { .name = "PERCENT_NORM_CPU", .title = "NCPU%", .description = "Normalized percentage of the CPU time the process used in the last sampling (normalized by cpu count)", .flags = 0, .defaultSortDesc = true, },
|
[PERCENT_NORM_CPU] = { .name = "PERCENT_NORM_CPU", .title = "NCPU%", .description = "Normalized percentage of the CPU time the process used in the last sampling (normalized by cpu count)", .flags = 0, .defaultSortDesc = true, .autoWidth = true, },
|
||||||
[PERCENT_MEM] = { .name = "PERCENT_MEM", .title = "MEM% ", .description = "Percentage of the memory the process is using, based on resident memory size", .flags = 0, .defaultSortDesc = true, },
|
[PERCENT_MEM] = { .name = "PERCENT_MEM", .title = "MEM% ", .description = "Percentage of the memory the process is using, based on resident memory size", .flags = 0, .defaultSortDesc = true, },
|
||||||
[USER] = { .name = "USER", .title = "USER ", .description = "Username of the process owner (or user ID if name cannot be determined)", .flags = 0, },
|
[USER] = { .name = "USER", .title = "USER ", .description = "Username of the process owner (or user ID if name cannot be determined)", .flags = 0, },
|
||||||
[TIME] = { .name = "TIME", .title = " TIME+ ", .description = "Total time the process has spent in user and system time", .flags = 0, .defaultSortDesc = true, },
|
[TIME] = { .name = "TIME", .title = " TIME+ ", .description = "Total time the process has spent in user and system time", .flags = 0, .defaultSortDesc = true, },
|
||||||
|
|
|
@ -408,6 +408,7 @@ static bool PCPProcessList_updateProcesses(PCPProcessList* this, double period,
|
||||||
proc->percent_cpu = isnan(percent_cpu) ?
|
proc->percent_cpu = isnan(percent_cpu) ?
|
||||||
0.0 : CLAMP(percent_cpu, 0.0, pl->activeCPUs * 100.0);
|
0.0 : CLAMP(percent_cpu, 0.0, pl->activeCPUs * 100.0);
|
||||||
proc->percent_mem = proc->m_resident / (double)pl->totalMem * 100.0;
|
proc->percent_mem = proc->m_resident / (double)pl->totalMem * 100.0;
|
||||||
|
Process_updateCPUFieldWidths(proc->percent_cpu);
|
||||||
|
|
||||||
PCPProcessList_updateUsername(proc, pid, offset, pl->usersTable);
|
PCPProcessList_updateUsername(proc, pid, offset, pl->usersTable);
|
||||||
|
|
||||||
|
|
|
@ -40,8 +40,8 @@ const ProcessFieldData Process_fields[LAST_PROCESSFIELD] = {
|
||||||
[M_VIRT] = { .name = "M_VIRT", .title = " VIRT ", .description = "Total program size in virtual memory", .flags = 0, .defaultSortDesc = true, },
|
[M_VIRT] = { .name = "M_VIRT", .title = " VIRT ", .description = "Total program size in virtual memory", .flags = 0, .defaultSortDesc = true, },
|
||||||
[M_RESIDENT] = { .name = "M_RESIDENT", .title = " RES ", .description = "Resident set size, size of the text and data sections, plus stack usage", .flags = 0, .defaultSortDesc = true, },
|
[M_RESIDENT] = { .name = "M_RESIDENT", .title = " RES ", .description = "Resident set size, size of the text and data sections, plus stack usage", .flags = 0, .defaultSortDesc = true, },
|
||||||
[ST_UID] = { .name = "ST_UID", .title = "UID", .description = "User ID of the process owner", .flags = 0, },
|
[ST_UID] = { .name = "ST_UID", .title = "UID", .description = "User ID of the process owner", .flags = 0, },
|
||||||
[PERCENT_CPU] = { .name = "PERCENT_CPU", .title = "CPU% ", .description = "Percentage of the CPU time the process used in the last sampling", .flags = 0, .defaultSortDesc = true, },
|
[PERCENT_CPU] = { .name = "PERCENT_CPU", .title = "CPU% ", .description = "Percentage of the CPU time the process used in the last sampling", .flags = 0, .defaultSortDesc = true, .autoWidth = true, },
|
||||||
[PERCENT_NORM_CPU] = { .name = "PERCENT_NORM_CPU", .title = "NCPU%", .description = "Normalized percentage of the CPU time the process used in the last sampling (normalized by cpu count)", .flags = 0, .defaultSortDesc = true, },
|
[PERCENT_NORM_CPU] = { .name = "PERCENT_NORM_CPU", .title = "NCPU%", .description = "Normalized percentage of the CPU time the process used in the last sampling (normalized by cpu count)", .flags = 0, .defaultSortDesc = true, .autoWidth = true, },
|
||||||
[PERCENT_MEM] = { .name = "PERCENT_MEM", .title = "MEM% ", .description = "Percentage of the memory the process is using, based on resident memory size", .flags = 0, .defaultSortDesc = true, },
|
[PERCENT_MEM] = { .name = "PERCENT_MEM", .title = "MEM% ", .description = "Percentage of the memory the process is using, based on resident memory size", .flags = 0, .defaultSortDesc = true, },
|
||||||
[USER] = { .name = "USER", .title = "USER ", .description = "Username of the process owner (or user ID if name cannot be determined)", .flags = 0, },
|
[USER] = { .name = "USER", .title = "USER ", .description = "Username of the process owner (or user ID if name cannot be determined)", .flags = 0, },
|
||||||
[TIME] = { .name = "TIME", .title = " TIME+ ", .description = "Total time the process has spent in user and system time", .flags = 0, .defaultSortDesc = true, },
|
[TIME] = { .name = "TIME", .title = " TIME+ ", .description = "Total time the process has spent in user and system time", .flags = 0, .defaultSortDesc = true, },
|
||||||
|
|
|
@ -463,8 +463,11 @@ static int SolarisProcessList_walkproc(psinfo_t* _psinfo, lwpsinfo_t* _lwpsinfo,
|
||||||
proc->tgid = (_psinfo->pr_ppid * 1024);
|
proc->tgid = (_psinfo->pr_ppid * 1024);
|
||||||
sproc->realppid = _psinfo->pr_ppid;
|
sproc->realppid = _psinfo->pr_ppid;
|
||||||
sproc->realtgid = _psinfo->pr_ppid;
|
sproc->realtgid = _psinfo->pr_ppid;
|
||||||
|
|
||||||
// See note above (in common section) about this BINARY FRACTION
|
// See note above (in common section) about this BINARY FRACTION
|
||||||
proc->percent_cpu = ((uint16_t)_psinfo->pr_pctcpu / (double)32768) * (double)100.0;
|
proc->percent_cpu = ((uint16_t)_psinfo->pr_pctcpu / (double)32768) * (double)100.0;
|
||||||
|
Process_updateCPUFieldWidths(proc->percent_cpu);
|
||||||
|
|
||||||
proc->time = _psinfo->pr_time.tv_sec;
|
proc->time = _psinfo->pr_time.tv_sec;
|
||||||
if (!preExisting) { // Tasks done only for NEW processes
|
if (!preExisting) { // Tasks done only for NEW processes
|
||||||
proc->isUserlandThread = false;
|
proc->isUserlandThread = false;
|
||||||
|
@ -492,6 +495,8 @@ static int SolarisProcessList_walkproc(psinfo_t* _psinfo, lwpsinfo_t* _lwpsinfo,
|
||||||
proc->show = !(pl->settings->hideKernelThreads && proc->isKernelThread);
|
proc->show = !(pl->settings->hideKernelThreads && proc->isKernelThread);
|
||||||
} else { // We are not in the master LWP, so jump to the LWP handling code
|
} else { // We are not in the master LWP, so jump to the LWP handling code
|
||||||
proc->percent_cpu = ((uint16_t)_lwpsinfo->pr_pctcpu / (double)32768) * (double)100.0;
|
proc->percent_cpu = ((uint16_t)_lwpsinfo->pr_pctcpu / (double)32768) * (double)100.0;
|
||||||
|
Process_updateCPUFieldWidths(proc->percent_cpu);
|
||||||
|
|
||||||
proc->time = _lwpsinfo->pr_time.tv_sec;
|
proc->time = _lwpsinfo->pr_time.tv_sec;
|
||||||
if (!preExisting) { // Tasks done only for NEW LWPs
|
if (!preExisting) { // Tasks done only for NEW LWPs
|
||||||
proc->isUserlandThread = true;
|
proc->isUserlandThread = true;
|
||||||
|
|
|
@ -35,8 +35,8 @@ const ProcessFieldData Process_fields[LAST_PROCESSFIELD] = {
|
||||||
[M_VIRT] = { .name = "M_VIRT", .title = " VIRT ", .description = "Total program size in virtual memory", .flags = 0, .defaultSortDesc = true, },
|
[M_VIRT] = { .name = "M_VIRT", .title = " VIRT ", .description = "Total program size in virtual memory", .flags = 0, .defaultSortDesc = true, },
|
||||||
[M_RESIDENT] = { .name = "M_RESIDENT", .title = " RES ", .description = "Resident set size, size of the text and data sections, plus stack usage", .flags = 0, .defaultSortDesc = true, },
|
[M_RESIDENT] = { .name = "M_RESIDENT", .title = " RES ", .description = "Resident set size, size of the text and data sections, plus stack usage", .flags = 0, .defaultSortDesc = true, },
|
||||||
[ST_UID] = { .name = "ST_UID", .title = "UID", .description = "User ID of the process owner", .flags = 0, },
|
[ST_UID] = { .name = "ST_UID", .title = "UID", .description = "User ID of the process owner", .flags = 0, },
|
||||||
[PERCENT_CPU] = { .name = "PERCENT_CPU", .title = "CPU% ", .description = "Percentage of the CPU time the process used in the last sampling", .flags = 0, .defaultSortDesc = true, },
|
[PERCENT_CPU] = { .name = "PERCENT_CPU", .title = "CPU% ", .description = "Percentage of the CPU time the process used in the last sampling", .flags = 0, .defaultSortDesc = true, .autoWidth = true, },
|
||||||
[PERCENT_NORM_CPU] = { .name = "PERCENT_NORM_CPU", .title = "NCPU%", .description = "Normalized percentage of the CPU time the process used in the last sampling (normalized by cpu count)", .flags = 0, .defaultSortDesc = true, },
|
[PERCENT_NORM_CPU] = { .name = "PERCENT_NORM_CPU", .title = "NCPU%", .description = "Normalized percentage of the CPU time the process used in the last sampling (normalized by cpu count)", .flags = 0, .defaultSortDesc = true, .autoWidth = true, },
|
||||||
[PERCENT_MEM] = { .name = "PERCENT_MEM", .title = "MEM% ", .description = "Percentage of the memory the process is using, based on resident memory size", .flags = 0, .defaultSortDesc = true, },
|
[PERCENT_MEM] = { .name = "PERCENT_MEM", .title = "MEM% ", .description = "Percentage of the memory the process is using, based on resident memory size", .flags = 0, .defaultSortDesc = true, },
|
||||||
[USER] = { .name = "USER", .title = "USER ", .description = "Username of the process owner (or user ID if name cannot be determined)", .flags = 0, },
|
[USER] = { .name = "USER", .title = "USER ", .description = "Username of the process owner (or user ID if name cannot be determined)", .flags = 0, },
|
||||||
[TIME] = { .name = "TIME", .title = " TIME+ ", .description = "Total time the process has spent in user and system time", .flags = 0, .defaultSortDesc = true, },
|
[TIME] = { .name = "TIME", .title = " TIME+ ", .description = "Total time the process has spent in user and system time", .flags = 0, .defaultSortDesc = true, },
|
||||||
|
|
|
@ -70,6 +70,7 @@ void ProcessList_goThroughEntries(ProcessList* super, bool pauseProcessUpdate) {
|
||||||
|
|
||||||
proc->percent_cpu = 2.5;
|
proc->percent_cpu = 2.5;
|
||||||
proc->percent_mem = 2.5;
|
proc->percent_mem = 2.5;
|
||||||
|
Process_updateCPUFieldWidths(proc->percent_cpu);
|
||||||
|
|
||||||
proc->st_uid = 0;
|
proc->st_uid = 0;
|
||||||
proc->user = "nobody"; /* Update whenever proc->st_uid is changed */
|
proc->user = "nobody"; /* Update whenever proc->st_uid is changed */
|
||||||
|
|
Loading…
Reference in New Issue