summaryrefslogtreecommitdiffstats
path: root/solaris
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 /solaris
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 'solaris')
-rw-r--r--solaris/SolarisProcess.c25
-rw-r--r--solaris/SolarisProcessList.c31
2 files changed, 32 insertions, 24 deletions
diff --git a/solaris/SolarisProcess.c b/solaris/SolarisProcess.c
index 3b5ea1ae..2ec3c1d5 100644
--- a/solaris/SolarisProcess.c
+++ b/solaris/SolarisProcess.c
@@ -73,8 +73,8 @@ void Process_delete(Object* cast) {
free(sp);
}
-static void SolarisProcess_writeField(const Process* this, RichString* str, ProcessField field) {
- const SolarisProcess* sp = (const SolarisProcess*) this;
+static void SolarisProcess_rowWriteField(const Row* super, RichString* str, ProcessField field) {
+ const SolarisProcess* sp = (const SolarisProcess*) super;
char buffer[256]; buffer[255] = '\0';
int attr = CRT_colors[DEFAULT_COLOR];
int n = sizeof(buffer) - 1;
@@ -85,13 +85,13 @@ static void SolarisProcess_writeField(const Process* this, RichString* str, Proc
case TASKID: xSnprintf(buffer, n, "%*d ", Process_pidDigits, sp->taskid); break;
case POOLID: xSnprintf(buffer, n, "%*d ", Process_pidDigits, sp->poolid); break;
case CONTID: xSnprintf(buffer, n, "%*d ", Process_pidDigits, sp->contid); break;
- case ZONE: Process_printLeftAlignedField(str, attr, sp->zname ? sp->zname : "global", ZONENAME_MAX/4); return;
+ case ZONE: Row_printLeftAlignedField(str, attr, sp->zname ? sp->zname : "global", ZONENAME_MAX/4); return;
case PID: xSnprintf(buffer, n, "%*d ", Process_pidDigits, sp->realpid); break;
case PPID: xSnprintf(buffer, n, "%*d ", Process_pidDigits, sp->realppid); break;
case TGID: xSnprintf(buffer, n, "%*d ", Process_pidDigits, sp->realtgid); break;
case LWPID: xSnprintf(buffer, n, "%*d ", Process_pidDigits, sp->lwpid); break;
default:
- Process_writeField(this, str, field);
+ Process_writeField(&sp->super, str, field);
return;
}
RichString_appendWide(str, attr, buffer);
@@ -127,11 +127,18 @@ static int SolarisProcess_compareByKey(const Process* v1, const Process* v2, Pro
const ProcessClass SolarisProcess_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 = SolarisProcess_rowWriteField
},
- .writeField = SolarisProcess_writeField,
.compareByKey = SolarisProcess_compareByKey
};
diff --git a/solaris/SolarisProcessList.c b/solaris/SolarisProcessList.c
index e759b187..46067a7b 100644
--- a/solaris/SolarisProcessList.c
+++ b/solaris/SolarisProcessList.c
@@ -45,18 +45,19 @@ static char* SolarisProcessList_readZoneName(kstat_ctl_t* kd, SolarisProcess* sp
}
ProcessList* ProcessList_new(Machine* host, Hashtable* pidMatchList) {
- SolarisProcessList* spl = xCalloc(1, sizeof(SolarisProcessList));
- ProcessList* pl = (ProcessList*) spl;
+ SolarisProcessList* this = xCalloc(1, sizeof(SolarisProcessList));
+ Object_setClass(this, Class(ProcessList));
- ProcessList_init(pl, Class(SolarisProcess), host, pidMatchList);
+ ProcessList* super = &this->super;
+ ProcessList_init(super, Class(SolarisProcess), host, pidMatchList);
- return pl;
+ return super;
}
-void ProcessList_delete(ProcessList* pl) {
- SolarisProcessList* spl = (SolarisProcessList*) pl;
- ProcessList_done(pl);
- free(spl);
+void ProcessList_delete(Object* cast) {
+ SolarisProcessList* this = (SolarisProcessList*) cast;
+ ProcessList_done(&this->super);
+ free(this);
}
static void SolarisProcessList_updateExe(pid_t pid, Process* proc) {
@@ -183,8 +184,8 @@ static int SolarisProcessList_walkproc(psinfo_t* _psinfo, lwpsinfo_t* _lwpsinfo,
// End common code pass 1
if (onMasterLWP) { // Are we on the representative LWP?
- proc->ppid = (_psinfo->pr_ppid * 1024);
- proc->tgid = (_psinfo->pr_ppid * 1024);
+ Process_setParent(proc, (_psinfo->pr_ppid * 1024));
+ Process_setThreadGroup(proc, (_psinfo->pr_ppid * 1024));
sproc->realppid = _psinfo->pr_ppid;
sproc->realtgid = _psinfo->pr_ppid;
@@ -224,8 +225,8 @@ static int SolarisProcessList_walkproc(psinfo_t* _psinfo, lwpsinfo_t* _lwpsinfo,
proc->time = _lwpsinfo->pr_time.tv_sec * 100 + _lwpsinfo->pr_time.tv_nsec / 10000000;
if (!preExisting) { // Tasks done only for NEW LWPs
proc->isUserlandThread = true;
- proc->ppid = _psinfo->pr_pid * 1024;
- proc->tgid = _psinfo->pr_pid * 1024;
+ Process_setParent(proc, _psinfo->pr_pid * 1024);
+ Process_setThreadGroup(proc, _psinfo->pr_pid * 1024);
sproc->realppid = _psinfo->pr_pid;
sproc->realtgid = _psinfo->pr_pid;
proc->starttime_ctime = _lwpsinfo->pr_start.tv_sec;
@@ -233,10 +234,10 @@ static int SolarisProcessList_walkproc(psinfo_t* _psinfo, lwpsinfo_t* _lwpsinfo,
// Top-level process only gets this for the representative LWP
if (proc->isKernelThread && !settings->hideKernelThreads) {
- proc->show = true;
+ proc->super.show = true;
}
if (!proc->isKernelThread && !settings->hideUserlandThreads) {
- proc->show = true;
+ proc->super.show = true;
}
} // Top-level LWP or subordinate LWP
@@ -253,7 +254,7 @@ static int SolarisProcessList_walkproc(psinfo_t* _psinfo, lwpsinfo_t* _lwpsinfo,
ProcessList_add(pl, proc);
}
- proc->updated = true;
+ proc->super.updated = true;
// End common code pass 2

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