summaryrefslogtreecommitdiffstats
path: root/pcp
diff options
context:
space:
mode:
authorNathan Scott <nathans@redhat.com>2023-08-22 16:11:05 +1000
committerNathan Scott <nathans@redhat.com>2023-08-30 13:11:57 +1000
commit0f751e991d399769fb8d7800f7c4bccec2ca7f60 (patch)
tree34cd7838f7ebf51049816f9acb6a63cea175af06 /pcp
parent68f4f10f012d11bd57bb725fe4113b2af937fc1d (diff)
Introduce Row and Table classes for screens beyond top-processes
This commit refactors the Process and ProcessList structures such they each have a new parent - Row and Table, respectively. These new classes handle screen updates relating to anything that could be represented in tabular format, e.g. cgroups, filesystems, etc, without us having to reimplement the display logic repeatedly for each new entity.
Diffstat (limited to 'pcp')
-rw-r--r--pcp/PCPDynamicColumn.c12
-rw-r--r--pcp/PCPProcess.c75
-rw-r--r--pcp/PCPProcessList.c29
3 files changed, 63 insertions, 53 deletions
diff --git a/pcp/PCPDynamicColumn.c b/pcp/PCPDynamicColumn.c
index 2481d81d..88b4dbd5 100644
--- a/pcp/PCPDynamicColumn.c
+++ b/pcp/PCPDynamicColumn.c
@@ -250,7 +250,7 @@ void PCPDynamicColumn_writeField(PCPDynamicColumn* this, const Process* proc, Ri
unsigned int type = PCPMetric_type(this->id);
pmAtomValue atom;
- if (!PCPMetric_instance(this->id, proc->pid, pp->offset, &atom, type)) {
+ if (!PCPMetric_instance(this->id, Process_getPid(proc), pp->offset, &atom, type)) {
RichString_appendAscii(str, CRT_colors[METER_VALUE_ERROR], "no data");
return;
}
@@ -269,7 +269,7 @@ void PCPDynamicColumn_writeField(PCPDynamicColumn* this, const Process* proc, Ri
switch (type) {
case PM_TYPE_STRING:
attr = CRT_colors[PROCESS_SHADOW];
- Process_printLeftAlignedField(str, attr, atom.cp, abswidth);
+ Row_printLeftAlignedField(str, attr, atom.cp, abswidth);
free(atom.cp);
break;
case PM_TYPE_32:
@@ -304,7 +304,9 @@ void PCPDynamicColumn_writeField(PCPDynamicColumn* this, const Process* proc, Ri
}
int PCPDynamicColumn_compareByKey(const PCPProcess* p1, const PCPProcess* p2, ProcessField key) {
- const PCPDynamicColumn* column = Hashtable_get(p1->super.host->settings->dynamicColumns, key);
+ const Process* proc = &p1->super;
+ const Settings* settings = proc->super.host->settings;
+ const PCPDynamicColumn* column = Hashtable_get(settings->dynamicColumns, key);
if (!column)
return -1;
@@ -313,8 +315,8 @@ int PCPDynamicColumn_compareByKey(const PCPProcess* p1, const PCPProcess* p2, Pr
unsigned int type = PCPMetric_type(metric);
pmAtomValue atom1 = {0}, atom2 = {0};
- if (!PCPMetric_instance(metric, p1->super.pid, p1->offset, &atom1, type) ||
- !PCPMetric_instance(metric, p2->super.pid, p2->offset, &atom2, type)) {
+ if (!PCPMetric_instance(metric, Process_getPid(&p1->super), p1->offset, &atom1, type) ||
+ !PCPMetric_instance(metric, Process_getPid(&p2->super), p2->offset, &atom2, type)) {
if (type == PM_TYPE_STRING) {
free(atom1.cp);
free(atom2.cp);
diff --git a/pcp/PCPProcess.c b/pcp/PCPProcess.c
index eadc9eb4..b5483476 100644
--- a/pcp/PCPProcess.c
+++ b/pcp/PCPProcess.c
@@ -124,37 +124,37 @@ static double PCPProcess_totalIORate(const PCPProcess* pp) {
return totalRate;
}
-static void PCPProcess_writeField(const Process* this, RichString* str, ProcessField field) {
- const PCPProcess* pp = (const PCPProcess*) this;
- bool coloring = this->host->settings->highlightMegabytes;
+static void PCPProcess_rowWriteField(const Row* super, RichString* str, ProcessField field) {
+ const PCPProcess* pp = (const PCPProcess*) super;
+ bool coloring = super->host->settings->highlightMegabytes;
char buffer[256]; buffer[255] = '\0';
int attr = CRT_colors[DEFAULT_COLOR];
size_t n = sizeof(buffer) - 1;
switch ((int)field) {
- case CMINFLT: Process_printCount(str, pp->cminflt, coloring); return;
- case CMAJFLT: Process_printCount(str, pp->cmajflt, coloring); return;
- case M_DRS: Process_printBytes(str, pp->m_drs, coloring); return;
- case M_DT: Process_printBytes(str, pp->m_dt, coloring); return;
- case M_LRS: Process_printBytes(str, pp->m_lrs, coloring); return;
- case M_TRS: Process_printBytes(str, pp->m_trs, coloring); return;
- case M_SHARE: Process_printBytes(str, pp->m_share, coloring); return;
- case M_PSS: Process_printKBytes(str, pp->m_pss, coloring); return;
- case M_SWAP: Process_printKBytes(str, pp->m_swap, coloring); return;
- case M_PSSWP: Process_printKBytes(str, pp->m_psswp, coloring); return;
- case UTIME: Process_printTime(str, pp->utime, coloring); return;
- case STIME: Process_printTime(str, pp->stime, coloring); return;
- case CUTIME: Process_printTime(str, pp->cutime, coloring); return;
- case CSTIME: Process_printTime(str, pp->cstime, coloring); return;
- case RCHAR: Process_printBytes(str, pp->io_rchar, coloring); return;
- case WCHAR: Process_printBytes(str, pp->io_wchar, coloring); return;
- case SYSCR: Process_printCount(str, pp->io_syscr, coloring); return;
- case SYSCW: Process_printCount(str, pp->io_syscw, coloring); return;
- case RBYTES: Process_printBytes(str, pp->io_read_bytes, coloring); return;
- case WBYTES: Process_printBytes(str, pp->io_write_bytes, coloring); return;
- case CNCLWB: Process_printBytes(str, pp->io_cancelled_write_bytes, coloring); return;
- case IO_READ_RATE: Process_printRate(str, pp->io_rate_read_bps, coloring); return;
- case IO_WRITE_RATE: Process_printRate(str, pp->io_rate_write_bps, coloring); return;
- case IO_RATE: Process_printRate(str, PCPProcess_totalIORate(pp), coloring); return;
+ case CMINFLT: Row_printCount(str, pp->cminflt, coloring); return;
+ case CMAJFLT: Row_printCount(str, pp->cmajflt, coloring); return;
+ case M_DRS: Row_printBytes(str, pp->m_drs, coloring); return;
+ case M_DT: Row_printBytes(str, pp->m_dt, coloring); return;
+ case M_LRS: Row_printBytes(str, pp->m_lrs, coloring); return;
+ case M_TRS: Row_printBytes(str, pp->m_trs, coloring); return;
+ case M_SHARE: Row_printBytes(str, pp->m_share, coloring); return;
+ case M_PSS: Row_printKBytes(str, pp->m_pss, coloring); return;
+ case M_SWAP: Row_printKBytes(str, pp->m_swap, coloring); return;
+ case M_PSSWP: Row_printKBytes(str, pp->m_psswp, coloring); return;
+ case UTIME: Row_printTime(str, pp->utime, coloring); return;
+ case STIME: Row_printTime(str, pp->stime, coloring); return;
+ case CUTIME: Row_printTime(str, pp->cutime, coloring); return;
+ case CSTIME: Row_printTime(str, pp->cstime, coloring); return;
+ case RCHAR: Row_printBytes(str, pp->io_rchar, coloring); return;
+ case WCHAR: Row_printBytes(str, pp->io_wchar, coloring); return;
+ case SYSCR: Row_printCount(str, pp->io_syscr, coloring); return;
+ case SYSCW: Row_printCount(str, pp->io_syscw, coloring); return;
+ case RBYTES: Row_printBytes(str, pp->io_read_bytes, coloring); return;
+ case WBYTES: Row_printBytes(str, pp->io_write_bytes, coloring); return;
+ case CNCLWB: Row_printBytes(str, pp->io_cancelled_write_bytes, coloring); return;
+ case IO_READ_RATE: Row_printRate(str, pp->io_rate_read_bps, coloring); return;
+ case IO_WRITE_RATE: Row_printRate(str, pp->io_rate_write_bps, coloring); return;
+ case IO_RATE: Row_printRate(str, PCPProcess_totalIORate(pp), coloring); return;
case CGROUP: xSnprintf(buffer, n, "%-10s ", pp->cgroup ? pp->cgroup : ""); break;
case OOM: xSnprintf(buffer, n, "%4u ", pp->oom); break;
case PERCENT_CPU_DELAY:
@@ -193,7 +193,7 @@ static void PCPProcess_writeField(const Process* this, RichString* str, ProcessF
}
break;
default:
- Process_writeField(this, str, field);
+ Process_writeField(&pp->super, str, field);
return;
}
RichString_appendWide(str, attr, buffer);
@@ -275,11 +275,18 @@ static int PCPProcess_compareByKey(const Process* v1, const Process* v2, Process
const ProcessClass PCPProcess_class = {
.super = {
- .extends = Class(Process),
- .display = Process_display,
- .delete = Process_delete,
- .compare = Process_compare
+ .super = {
+ .extends = Class(Process),
+ .display = Row_display,
+ .delete = Process_delete,
+ .compare = Process_compare
+ },
+ .isHighlighted = Process_rowIsHighlighted,
+ .isVisible = Process_rowIsVisible,
+ .matchesFilter = Process_rowMatchesFilter,
+ .compareByParent = Process_compareByParent,
+ .sortKeyString = Process_rowGetSortKey,
+ .writeField = PCPProcess_rowWriteField,
},
- .writeField = PCPProcess_writeField,
- .compareByKey = PCPProcess_compareByKey
+ .compareByKey = PCPProcess_compareByKey,
};
diff --git a/pcp/PCPProcessList.c b/pcp/PCPProcessList.c
index 1a2d89ed..f320ba61 100644
--- a/pcp/PCPProcessList.c
+++ b/pcp/PCPProcessList.c
@@ -33,16 +33,17 @@ in the source distribution for its full text.
ProcessList* ProcessList_new(Machine* host, Hashtable* pidMatchList) {
PCPProcessList* this = xCalloc(1, sizeof(PCPProcessList));
- ProcessList* super = &(this->super);
+ Object_setClass(this, Class(ProcessList));
+ ProcessList* super = &this->super;
ProcessList_init(super, Class(PCPProcess), host, pidMatchList);
return super;
}
-void ProcessList_delete(ProcessList* super) {
- PCPProcessList* this = (PCPProcessList*) super;
- ProcessList_done(super);
+void ProcessList_delete(Object* cast) {
+ PCPProcessList* this = (PCPProcessList*) cast;
+ ProcessList_done(&this->super);
free(this);
}
@@ -129,8 +130,8 @@ static inline ProcessState PCPProcessList_getProcessState(char state) {
}
static void PCPProcessList_updateID(Process* process, int pid, int offset) {
- process->tgid = Metric_instance_u32(PCP_PROC_TGID, pid, offset, 1);
- process->ppid = Metric_instance_u32(PCP_PROC_PPID, pid, offset, 1);
+ Process_setThreadGroup(process, Metric_instance_u32(PCP_PROC_TGID, pid, offset, 1));
+ Process_setParent(process, Metric_instance_u32(PCP_PROC_PPID, pid, offset, 1));
process->state = PCPProcessList_getProcessState(Metric_instance_char(PCP_PROC_STATE, pid, offset, '?'));
}
@@ -310,7 +311,7 @@ static void PCPProcessList_updateCmdline(Process* process, int pid, int offset,
static bool PCPProcessList_updateProcesses(PCPProcessList* this) {
ProcessList* pl = (ProcessList*) this;
- Machine* host = pl->host;
+ Machine* host = pl->super.host;
PCPMachine* phost = (PCPMachine*) host;
const Settings* settings = host->settings;
@@ -328,7 +329,7 @@ static bool PCPProcessList_updateProcesses(PCPProcessList* this) {
Process* proc = ProcessList_getProcess(pl, pid, &preExisting, PCPProcess_new);
PCPProcess* pp = (PCPProcess*) proc;
PCPProcessList_updateID(proc, pid, offset);
- proc->isUserlandThread = proc->pid != proc->tgid;
+ proc->isUserlandThread = Process_getPid(proc) != Process_getThreadGroup(proc);
pp->offset = offset >= 0 ? offset : 0;
/*
@@ -338,8 +339,8 @@ static bool PCPProcessList_updateProcesses(PCPProcessList* this) {
* But it will short-circuit subsequent scans.
*/
if (preExisting && hideKernelThreads && Process_isKernelThread(proc)) {
- proc->updated = true;
- proc->show = false;
+ proc->super.updated = true;
+ proc->super.show = false;
if (proc->state == RUNNING)
pl->runningTasks++;
pl->kernelThreads++;
@@ -347,8 +348,8 @@ static bool PCPProcessList_updateProcesses(PCPProcessList* this) {
continue;
}
if (preExisting && hideUserlandThreads && Process_isUserlandThread(proc)) {
- proc->updated = true;
- proc->show = false;
+ proc->super.updated = true;
+ proc->super.show = false;
if (proc->state == RUNNING)
pl->runningTasks++;
pl->userlandThreads++;
@@ -427,13 +428,13 @@ static bool PCPProcessList_updateProcesses(PCPProcessList* this) {
}
/* Set at the end when we know if a new entry is a thread */
- proc->show = ! ((hideKernelThreads && Process_isKernelThread(proc)) ||
+ proc->super.show = ! ((hideKernelThreads && Process_isKernelThread(proc)) ||
(hideUserlandThreads && Process_isUserlandThread(proc)));
pl->totalTasks++;
if (proc->state == RUNNING)
pl->runningTasks++;
- proc->updated = true;
+ proc->super.updated = true;
}
return true;
}

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