summaryrefslogtreecommitdiffstats
path: root/dragonflybsd
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 /dragonflybsd
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 'dragonflybsd')
-rw-r--r--dragonflybsd/DragonFlyBSDProcess.c24
-rw-r--r--dragonflybsd/DragonFlyBSDProcessList.c25
2 files changed, 29 insertions, 20 deletions
diff --git a/dragonflybsd/DragonFlyBSDProcess.c b/dragonflybsd/DragonFlyBSDProcess.c
index 7cfc71be..a85b6efb 100644
--- a/dragonflybsd/DragonFlyBSDProcess.c
+++ b/dragonflybsd/DragonFlyBSDProcess.c
@@ -66,16 +66,17 @@ void Process_delete(Object* cast) {
free(this);
}
-static void DragonFlyBSDProcess_writeField(const Process* this, RichString* str, ProcessField field) {
+static void DragonFlyBSDProcess_rowWriteField(const Row* super, RichString* str, ProcessField field) {
+ const Process* this = (const Process*) super;
const DragonFlyBSDProcess* fp = (const DragonFlyBSDProcess*) this;
char buffer[256]; buffer[255] = '\0';
int attr = CRT_colors[DEFAULT_COLOR];
size_t n = sizeof(buffer) - 1;
switch (field) {
// add Platform-specific fields here
- case PID: xSnprintf(buffer, n, "%*d ", Process_pidDigits, Process_isKernelThread(this) ? -1 : this->pid); break;
+ case PID: xSnprintf(buffer, n, "%*d ", Process_pidDigits, Process_isKernelThread(this) ? -1 : Process_getPid(this)); break;
case JID: xSnprintf(buffer, n, "%*d ", Process_pidDigits, fp->jid); break;
- case JAIL: Process_printLeftAlignedField(str, attr, fp->jname, 11); return;
+ case JAIL: Row_printLeftAlignedField(str, attr, fp->jname, 11); return;
default:
Process_writeField(this, str, field);
return;
@@ -100,11 +101,18 @@ static int DragonFlyBSDProcess_compareByKey(const Process* v1, const Process* v2
const ProcessClass DragonFlyBSDProcess_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 = DragonFlyBSDProcess_rowWriteField
},
- .writeField = DragonFlyBSDProcess_writeField,
.compareByKey = DragonFlyBSDProcess_compareByKey
};
diff --git a/dragonflybsd/DragonFlyBSDProcessList.c b/dragonflybsd/DragonFlyBSDProcessList.c
index 4ff17932..6330e911 100644
--- a/dragonflybsd/DragonFlyBSDProcessList.c
+++ b/dragonflybsd/DragonFlyBSDProcessList.c
@@ -28,16 +28,17 @@ in the source distribution for its full text.
ProcessList* ProcessList_new(Machine* host, Hashtable* pidMatchList) {
DragonFlyBSDProcessList* this = xCalloc(1, sizeof(DragonFlyBSDProcessList));
- ProcessList* super = (ProcessList*) this;
+ Object_setClass(this, Class(ProcessList));
+ ProcessList* super = (ProcessList*) this;
ProcessList_init(super, Class(DragonFlyBSDProcess), host, pidMatchList);
return super;
}
-void ProcessList_delete(ProcessList* super) {
- const DragonFlyBSDProcessList* this = (DragonFlyBSDProcessList*) super;
- ProcessList_done(super);
+void ProcessList_delete(Object* cast) {
+ const DragonFlyBSDProcessList* this = (DragonFlyBSDProcessList*) cast;
+ ProcessList_done(&this->super);
free(this);
}
@@ -153,17 +154,17 @@ void ProcessList_goThroughEntries(ProcessList* super) {
dfp->jid = kproc->kp_jailid;
if (kproc->kp_ktaddr && kproc->kp_flags & P_SYSTEM) {
// dfb kernel threads all have the same pid, so we misuse the kernel thread address to give them a unique identifier
- proc->pid = (pid_t)kproc->kp_ktaddr;
+ Process_setPid(proc, (pid_t)kproc->kp_ktaddr);
proc->isKernelThread = true;
} else {
- proc->pid = kproc->kp_pid; // process ID
+ Process_setPid(proc, kproc->kp_pid); // process ID
proc->isKernelThread = false;
}
proc->isUserlandThread = kproc->kp_nthreads > 1;
- proc->ppid = kproc->kp_ppid; // parent process id
+ Process_setParent(proc, kproc->kp_ppid); // parent process id
proc->tpgid = kproc->kp_tpgid; // tty process group id
- //proc->tgid = kproc->kp_lwp.kl_tid; // thread group id
- proc->tgid = kproc->kp_pid; // thread group id
+ //Process_setThreadGroup(proc, kproc->kp_lwp.kl_tid); // thread group id
+ Process_setThreadGroup(proc, kproc->kp_pid);
proc->pgrp = kproc->kp_pgid; // process group id
proc->session = kproc->kp_sid;
proc->st_uid = kproc->kp_uid; // user ID
@@ -199,7 +200,7 @@ void ProcessList_goThroughEntries(ProcessList* super) {
dfp->jname = DragonFlyBSDMachine_readJailName(dhost, kproc->kp_jailid);
}
// if there are reapers in the system, process can get reparented anytime
- proc->ppid = kproc->kp_ppid;
+ Process_setParent(proc, kproc->kp_ppid);
if (proc->st_uid != kproc->kp_uid) { // some processes change users (eg. to lower privs)
proc->st_uid = kproc->kp_uid;
proc->user = UsersTable_getRef(host->usersTable, proc->st_uid);
@@ -303,7 +304,7 @@ void ProcessList_goThroughEntries(ProcessList* super) {
if (proc->state == RUNNING)
super->runningTasks++;
- proc->show = ! ((hideKernelThreads && Process_isKernelThread(proc)) || (hideUserlandThreads && Process_isUserlandThread(proc)));
- proc->updated = true;
+ proc->super.show = ! ((hideKernelThreads && Process_isKernelThread(proc)) || (hideUserlandThreads && Process_isUserlandThread(proc)));
+ proc->super.updated = true;
}
}

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