summaryrefslogtreecommitdiffstats
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
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.
-rw-r--r--Action.c104
-rw-r--r--Affinity.c34
-rw-r--r--Affinity.h6
-rw-r--r--AvailableColumnsPanel.c2
-rw-r--r--ColumnsPanel.c2
-rw-r--r--CommandLine.c17
-rw-r--r--CommandScreen.c2
-rw-r--r--DisplayOptionsPanel.c2
-rw-r--r--EnvScreen.c4
-rw-r--r--Machine.c52
-rw-r--r--Machine.h22
-rw-r--r--MainPanel.c63
-rw-r--r--MainPanel.h10
-rw-r--r--Makefile.am5
-rw-r--r--OpenFilesScreen.c6
-rw-r--r--Process.c578
-rw-r--r--Process.h198
-rw-r--r--ProcessList.c461
-rw-r--r--ProcessList.h40
-rw-r--r--ProcessLocksScreen.c4
-rw-r--r--Row.c486
-rw-r--r--Row.h179
-rw-r--r--RowField.h56
-rw-r--r--Scheduling.c12
-rw-r--r--Scheduling.h3
-rw-r--r--ScreenManager.c7
-rw-r--r--Settings.c14
-rw-r--r--Settings.h18
-rw-r--r--Table.c370
-rw-r--r--Table.h101
-rw-r--r--TasksMeter.c3
-rw-r--r--TraceScreen.c4
-rw-r--r--darwin/DarwinProcess.c41
-rw-r--r--darwin/DarwinProcessList.c10
-rw-r--r--dragonflybsd/DragonFlyBSDProcess.c24
-rw-r--r--dragonflybsd/DragonFlyBSDProcessList.c25
-rw-r--r--freebsd/FreeBSDProcess.c27
-rw-r--r--freebsd/FreeBSDProcessList.c21
-rw-r--r--linux/LinuxMachine.c3
-rw-r--r--linux/LinuxProcess.c111
-rw-r--r--linux/LinuxProcess.h6
-rw-r--r--linux/LinuxProcessList.c76
-rw-r--r--linux/Platform.c4
-rw-r--r--netbsd/NetBSDProcess.c20
-rw-r--r--netbsd/NetBSDProcessList.c23
-rw-r--r--openbsd/OpenBSDProcess.c22
-rw-r--r--openbsd/OpenBSDProcessList.c16
-rw-r--r--pcp/PCPDynamicColumn.c12
-rw-r--r--pcp/PCPProcess.c75
-rw-r--r--pcp/PCPProcessList.c29
-rw-r--r--solaris/SolarisProcess.c25
-rw-r--r--solaris/SolarisProcessList.c31
-rw-r--r--unsupported/UnsupportedProcess.c26
-rw-r--r--unsupported/UnsupportedProcessList.c21
54 files changed, 2053 insertions, 1460 deletions
diff --git a/Action.c b/Action.c
index 62308da7..f7fc4a43 100644
--- a/Action.c
+++ b/Action.c
@@ -56,22 +56,22 @@ Object* Action_pickFromVector(State* st, Panel* list, int x, bool follow) {
Panel* panelFocus;
int ch;
bool unfollow = false;
- int pid = follow ? MainPanel_selectedPid(mainPanel) : -1;
- if (follow && host->pl->following == -1) {
- host->pl->following = pid;
+ int row = follow ? MainPanel_selectedRow(mainPanel) : -1;
+ if (follow && host->activeTable->following == -1) {
+ host->activeTable->following = row;
unfollow = true;
}
ScreenManager_run(scr, &panelFocus, &ch, NULL);
if (unfollow) {
- host->pl->following = -1;
+ host->activeTable->following = -1;
}
ScreenManager_delete(scr);
Panel_move((Panel*)mainPanel, 0, y);
Panel_resize((Panel*)mainPanel, COLS, LINES - y - 1);
if (panelFocus == list && ch == 13) {
if (follow) {
- const Process* selected = (const Process*)Panel_getSelected((Panel*)mainPanel);
- if (selected && selected->pid == pid)
+ const Row* selected = (const Row*)Panel_getSelected((Panel*)mainPanel);
+ if (selected && selected->id == row)
return Panel_getSelected(list);
beep();
@@ -99,7 +99,7 @@ static void Action_runSetup(State* st) {
static bool changePriority(MainPanel* panel, int delta) {
bool anyTagged;
- bool ok = MainPanel_foreachProcess(panel, Process_changePriorityBy, (Arg) { .i = delta }, &anyTagged);
+ bool ok = MainPanel_foreachRow(panel, Process_rowChangePriorityBy, (Arg) { .i = delta }, &anyTagged);
if (!ok)
beep();
return anyTagged;
@@ -121,36 +121,36 @@ bool Action_setUserOnly(const char* userName, uid_t* userId) {
return false;
}
-static void tagAllChildren(Panel* panel, Process* parent) {
+static void tagAllChildren(Panel* panel, Row* parent) {
parent->tag = true;
- pid_t ppid = parent->pid;
+ int parent_id = parent->id;
for (int i = 0; i < Panel_size(panel); i++) {
- Process* p = (Process*) Panel_get(panel, i);
- if (!p->tag && Process_isChildOf(p, ppid)) {
- tagAllChildren(panel, p);
+ Row* row = (Row*) Panel_get(panel, i);
+ if (!row->tag && Row_isChildOf(row, parent_id)) {
+ tagAllChildren(panel, row);
}
}
}
static bool expandCollapse(Panel* panel) {
- Process* p = (Process*) Panel_getSelected(panel);
- if (!p)
+ Row* row = (Row*) Panel_getSelected(panel);
+ if (!row)
return false;
- p->showChildren = !p->showChildren;
+ row->showChildren = !row->showChildren;
return true;
}
static bool collapseIntoParent(Panel* panel) {
- const Process* p = (Process*) Panel_getSelected(panel);
- if (!p)
+ const Row* r = (Row*) Panel_getSelected(panel);
+ if (!r)
return false;
- pid_t ppid = Process_getParentPid(p);
+ int parent_id = Row_getGroupOrParent(r);
for (int i = 0; i < Panel_size(panel); i++) {
- Process* q = (Process*) Panel_get(panel, i);
- if (q->pid == ppid) {
- q->showChildren = false;
+ Row* row = (Row*) Panel_get(panel, i);
+ if (row->id == parent_id) {
+ row->showChildren = false;
Panel_setSelected(panel, i);
return true;
}
@@ -159,7 +159,7 @@ static bool collapseIntoParent(Panel* panel) {
}
Htop_Reaction Action_setSortKey(Settings* settings, ProcessField sortKey) {
- ScreenSettings_setSortKey(settings->ss, sortKey);
+ ScreenSettings_setSortKey(settings->ss, (RowField) sortKey);
return HTOP_REFRESH | HTOP_SAVE_SETTINGS | HTOP_UPDATE_PANELHDR | HTOP_KEEP_FOLLOWING;
}
@@ -171,11 +171,11 @@ static Htop_Reaction actionSetSortColumn(State* st) {
Panel_setHeader(sortPanel, "Sort by");
Machine* host = st->host;
Settings* settings = host->settings;
- const ProcessField* fields = settings->ss->fields;
+ const RowField* fields = settings->ss->fields;
Hashtable* dynamicColumns = settings->dynamicColumns;
for (int i = 0; fields[i]; i++) {
char* name = NULL;
- if (fields[i] >= LAST_PROCESSFIELD) {
+ if (fields[i] >= ROW_DYNAMIC_FIELDS) {
DynamicColumn* column = Hashtable_get(dynamicColumns, fields[i]);
if (!column)
continue;
@@ -195,7 +195,7 @@ static Htop_Reaction actionSetSortColumn(State* st) {
}
Object_delete(sortPanel);
- host->pl->needsSort = true;
+ host->activeTable->needsSort = true;
return reaction | HTOP_REFRESH | HTOP_REDRAW_BAR | HTOP_UPDATE_PANELHDR;
}
@@ -262,9 +262,9 @@ static Htop_Reaction actionToggleTreeView(State* st) {
ss->treeView = !ss->treeView;
if (!ss->allBranchesCollapsed)
- ProcessList_expandTree(host->pl);
+ Table_expandTree(host->activeTable);
- host->pl->needsSort = true;
+ host->activeTable->needsSort = true;
return HTOP_REFRESH | HTOP_SAVE_SETTINGS | HTOP_KEEP_FOLLOWING | HTOP_REDRAW_BAR | HTOP_UPDATE_PANELHDR;
}
@@ -282,9 +282,9 @@ static Htop_Reaction actionExpandOrCollapseAllBranches(State* st) {
}
ss->allBranchesCollapsed = !ss->allBranchesCollapsed;
if (ss->allBranchesCollapsed)
- ProcessList_collapseAllBranches(host->pl);
+ Table_collapseAllBranches(host->activeTable);
else
- ProcessList_expandTree(host->pl);
+ Table_expandTree(host->activeTable);
return HTOP_REFRESH | HTOP_SAVE_SETTINGS;
}
@@ -292,7 +292,7 @@ static Htop_Reaction actionIncFilter(State* st) {
Machine* host = st->host;
IncSet* inc = (st->mainPanel)->inc;
IncSet_activate(inc, INC_FILTER, (Panel*)st->mainPanel);
- host->pl->incFilter = IncSet_filter(inc);
+ host->activeTable->incFilter = IncSet_filter(inc);
return HTOP_REFRESH | HTOP_KEEP_FOLLOWING;
}
@@ -321,7 +321,7 @@ static Htop_Reaction actionLowerPriority(State* st) {
static Htop_Reaction actionInvertSortOrder(State* st) {
Machine* host = st->host;
ScreenSettings_invertSortOrder(host->settings->ss);
- host->pl->needsSort = true;
+ host->activeTable->needsSort = true;
return HTOP_REFRESH | HTOP_SAVE_SETTINGS | HTOP_KEEP_FOLLOWING | HTOP_UPDATE_PANELHDR;
}
@@ -397,11 +397,11 @@ static Htop_Reaction actionSetAffinity(State* st) {
return HTOP_OK;
#if (defined(HAVE_LIBHWLOC) || defined(HAVE_AFFINITY))
- const Process* p = (const Process*) Panel_getSelected((Panel*)st->mainPanel);
- if (!p)
+ const Row* row = (const Row*) Panel_getSelected((Panel*)st->mainPanel);
+ if (!row)
return HTOP_OK;
- Affinity* affinity1 = Affinity_get(p, host);
+ Affinity* affinity1 = Affinity_rowGet(row, host);
if (!affinity1)
return HTOP_OK;
@@ -412,7 +412,7 @@ static Htop_Reaction actionSetAffinity(State* st) {
const void* set = Action_pickFromVector(st, affinityPanel, width, true);
if (set) {
Affinity* affinity2 = AffinityPanel_getAffinity(affinityPanel, host);
- bool ok = MainPanel_foreachProcess(st->mainPanel, Affinity_set, (Arg) { .v = affinity2 }, NULL);
+ bool ok = MainPanel_foreachRow(st->mainPanel, Affinity_rowSet, (Arg) { .v = affinity2 }, NULL);
if (!ok)
beep();
Affinity_delete(affinity2);
@@ -422,7 +422,6 @@ static Htop_Reaction actionSetAffinity(State* st) {
#else
return HTOP_OK;
#endif
-
}
#ifdef SCHEDULER_SUPPORT
@@ -459,7 +458,7 @@ static Htop_Reaction actionSetSchedPolicy(State* st) {
SchedulingArg v = { .policy = preSelectedPolicy, .priority = preSelectedPriority };
- bool ok = MainPanel_foreachProcess(st->mainPanel, Scheduling_setPolicy, (Arg) { .v = &v }, NULL);
+ bool ok = MainPanel_foreachRow(st->mainPanel, Scheduling_rowSetPolicy, (Arg) { .v = &v }, NULL);
if (!ok)
beep();
}
@@ -483,7 +482,7 @@ static Htop_Reaction actionKill(State* st) {
Panel_setHeader((Panel*)st->mainPanel, "Sending...");
Panel_draw((Panel*)st->mainPanel, false, true, true, State_hideFunctionBar(st));
refresh();
- MainPanel_foreachProcess(st->mainPanel, Process_sendSignal, (Arg) { .i = sgn->key }, NULL);
+ MainPanel_foreachRow(st->mainPanel, Process_rowSendSignal, (Arg) { .i = sgn->key }, NULL);
napms(500);
}
Panel_delete((Object*)signalsPanel);
@@ -511,7 +510,7 @@ static Htop_Reaction actionFilterByUser(State* st) {
}
Htop_Reaction Action_follow(State* st) {
- st->host->pl->following = MainPanel_selectedPid(st->mainPanel);
+ st->host->activeTable->following = MainPanel_selectedRow(st->mainPanel);
Panel_setSelectionColor((Panel*)st->mainPanel, PANEL_SELECTION_FOLLOW);
return HTOP_KEEP_FOLLOWING;
}
@@ -529,6 +528,8 @@ static Htop_Reaction actionLsof(State* st) {
if (!p)
return HTOP_OK;
+ assert(Object_isA((const Object*) p, (const ObjectClass*) &Process_class));
+
OpenFilesScreen* ofs = OpenFilesScreen_new(p);
InfoScreen_run((InfoScreen*)ofs);
OpenFilesScreen_delete((Object*)ofs);
@@ -541,6 +542,9 @@ static Htop_Reaction actionShowLocks(State* st) {
const Process* p = (Process*) Panel_getSelected((Panel*)st->mainPanel);
if (!p)
return HTOP_OK;
+
+ assert(Object_isA((const Object*) p, (const ObjectClass*) &Process_class));
+
ProcessLocksScreen* pls = ProcessLocksScreen_new(p);
InfoScreen_run((InfoScreen*)pls);
ProcessLocksScreen_delete((Object*)pls);
@@ -557,6 +561,8 @@ static Htop_Reaction actionStrace(State* st) {
if (!p)
return HTOP_OK;
+ assert(Object_isA((const Object*) p, (const ObjectClass*) &Process_class));
+
TraceScreen* ts = TraceScreen_new(p);
bool ok = TraceScreen_forkTracer(ts);
if (ok) {
@@ -569,11 +575,11 @@ static Htop_Reaction actionStrace(State* st) {
}
static Htop_Reaction actionTag(State* st) {
- Process* p = (Process*) Panel_getSelected((Panel*)st->mainPanel);
- if (!p)
+ Row* r = (Row*) Panel_getSelected((Panel*)st->mainPanel);
+ if (!r)
return HTOP_OK;
- Process_toggleTag(p);
+ Row_toggleTag(r);
Panel_onKey((Panel*)st->mainPanel, KEY_DOWN);
return HTOP_OK;
}
@@ -783,18 +789,18 @@ static Htop_Reaction actionHelp(State* st) {
static Htop_Reaction actionUntagAll(State* st) {
for (int i = 0; i < Panel_size((Panel*)st->mainPanel); i++) {
- Process* p = (Process*) Panel_get((Panel*)st->mainPanel, i);
- p->tag = false;
+ Row* row = (Row*) Panel_get((Panel*)st->mainPanel, i);
+ row->tag = false;
}
return HTOP_REFRESH;
}
static Htop_Reaction actionTagAllChildren(State* st) {
- Process* p = (Process*) Panel_getSelected((Panel*)st->mainPanel);
- if (!p)
+ Row* row = (Row*) Panel_getSelected((Panel*)st->mainPanel);
+ if (!row)
return HTOP_OK;
- tagAllChildren((Panel*)st->mainPanel, p);
+ tagAllChildren((Panel*)st->mainPanel, row);
return HTOP_OK;
}
@@ -803,6 +809,8 @@ static Htop_Reaction actionShowEnvScreen(State* st) {
if (!p)
return HTOP_OK;
+ assert(Object_isA((const Object*) p, (const ObjectClass*) &Process_class));
+
EnvScreen* es = EnvScreen_new(p);
InfoScreen_run((InfoScreen*)es);
EnvScreen_delete((Object*)es);
@@ -816,6 +824,8 @@ static Htop_Reaction actionShowCommandScreen(State* st) {
if (!p)
return HTOP_OK;
+ assert(Object_isA((const Object*) p, (const ObjectClass*) &Process_class));
+
CommandScreen* cmdScr = CommandScreen_new(p);
InfoScreen_run((InfoScreen*)cmdScr);
CommandScreen_delete((Object*)cmdScr);
diff --git a/Affinity.c b/Affinity.c
index f7c597bf..546975d5 100644
--- a/Affinity.c
+++ b/Affinity.c
@@ -12,6 +12,7 @@ in the source distribution for its full text.
#include <stdlib.h>
+#include "Process.h"
#include "XUtils.h"
#if defined(HAVE_LIBHWLOC)
@@ -49,12 +50,11 @@ void Affinity_add(Affinity* this, unsigned int id) {
this->used++;
}
-
#if defined(HAVE_LIBHWLOC)
-Affinity* Affinity_get(const Process* proc, Machine* host) {
+static Affinity* Affinity_get(const Process* p, Machine* host) {
hwloc_cpuset_t cpuset = hwloc_bitmap_alloc();
- bool ok = (hwloc_get_proc_cpubind(host->topology, proc->pid, cpuset, HTOP_HWLOC_CPUBIND_FLAG) == 0);
+ bool ok = (hwloc_get_proc_cpubind(host->topology, Process_getPid(p), cpuset, HTOP_HWLOC_CPUBIND_FLAG) == 0);
Affinity* affinity = NULL;
if (ok) {
affinity = Affinity_new(host);
@@ -73,22 +73,22 @@ Affinity* Affinity_get(const Process* proc, Machine* host) {
return affinity;
}
-bool Affinity_set(Process* proc, Arg arg) {
+static bool Affinity_set(Process* p, Arg arg) {
Affinity* this = arg.v;
hwloc_cpuset_t cpuset = hwloc_bitmap_alloc();
for (unsigned int i = 0; i < this->used; i++) {
hwloc_bitmap_set(cpuset, this->cpus[i]);
}
- bool ok = (hwloc_set_proc_cpubind(this->host->topology, proc->pid, cpuset, HTOP_HWLOC_CPUBIND_FLAG) == 0);
+ bool ok = (hwloc_set_proc_cpubind(this->host->topology, Process_getPid(p), cpuset, HTOP_HWLOC_CPUBIND_FLAG) == 0);
hwloc_bitmap_free(cpuset);
return ok;
}
#elif defined(HAVE_AFFINITY)
-Affinity* Affinity_get(const Process* proc, Machine* host) {
+static Affinity* Affinity_get(const Process* p, Machine* host) {
cpu_set_t cpuset;
- bool ok = (sched_getaffinity(proc->pid, sizeof(cpu_set_t), &cpuset) == 0);
+ bool ok = (sched_getaffinity(Process_getPid(p), sizeof(cpu_set_t), &cpuset) == 0);
if (!ok)
return NULL;
@@ -101,15 +101,31 @@ Affinity* Affinity_get(const Process* proc, Machine* host) {
return affinity;
}
-bool Affinity_set(Process* proc, Arg arg) {
+static bool Affinity_set(Process* p, Arg arg) {
Affinity* this = arg.v;
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
for (unsigned int i = 0; i < this->used; i++) {
CPU_SET(this->cpus[i], &cpuset);
}
- bool ok = (sched_setaffinity(proc->pid, sizeof(unsigned long), &cpuset) == 0);
+ bool ok = (sched_setaffinity(Process_getPid(p), sizeof(unsigned long), &cpuset) == 0);
return ok;
}
#endif
+
+#if defined(HAVE_LIBHWLOC) || defined(HAVE_AFFINITY)
+
+bool Affinity_rowSet(Row* row, Arg arg) {
+ Process* p = (Process*) row;
+ assert(Object_isA((const Object*) p, (const ObjectClass*) &Process_class));
+ return Affinity_set(p, arg);
+}
+
+Affinity* Affinity_rowGet(const Row* row, Machine* host) {
+ const Process* p = (const Process*) row;
+ assert(Object_isA((const Object*) p, (const ObjectClass*) &Process_class));
+ return Affinity_get(p, host);
+}
+
+#endif /* HAVE_LIBHWLOC || HAVE_AFFINITY */
diff --git a/Affinity.h b/Affinity.h
index 58d9bd73..341b0c04 100644
--- a/Affinity.h
+++ b/Affinity.h
@@ -16,7 +16,7 @@ in the source distribution for its full text.
#include <stdbool.h>
#include "Object.h"
-#include "Process.h"
+#include "Row.h"
#endif
@@ -40,9 +40,9 @@ void Affinity_add(Affinity* this, unsigned int id);
#if defined(HAVE_LIBHWLOC) || defined(HAVE_AFFINITY)
-Affinity* Affinity_get(const Process* proc, Machine* host);
+Affinity* Affinity_rowGet(const Row* row, Machine* host);
-bool Affinity_set(Process* proc, Arg arg);
+bool Affinity_rowSet(Row* row, Arg arg);
#endif /* HAVE_LIBHWLOC || HAVE_AFFINITY */
diff --git a/AvailableColumnsPanel.c b/AvailableColumnsPanel.c
index b8c09c74..f3c40843 100644
--- a/AvailableColumnsPanel.c
+++ b/AvailableColumnsPanel.c
@@ -34,7 +34,7 @@ static void AvailableColumnsPanel_delete(Object* object) {
static void AvailableColumnsPanel_insert(AvailableColumnsPanel* this, int at, int key) {
const char* name;
- if (key >= LAST_PROCESSFIELD)
+ if (key >= ROW_DYNAMIC_FIELDS)
name = DynamicColumn_init(key);
else
name = Process_fields[key].name;
diff --git a/ColumnsPanel.c b/ColumnsPanel.c
index d53fff25..ecae36f7 100644
--- a/ColumnsPanel.c
+++ b/ColumnsPanel.c
@@ -141,7 +141,7 @@ static void ColumnsPanel_add(Panel* super, unsigned int key, Hashtable* columns)
void ColumnsPanel_fill(ColumnsPanel* this, ScreenSettings* ss, Hashtable* columns) {
Panel* super = (Panel*) this;
Panel_prune(super);
- for (const ProcessField* fields = ss->fields; *fields; fields++)
+ for (const RowField* fields = ss->fields; *fields; fields++)
ColumnsPanel_add(super, *fields, columns);
this->ss = ss;
}
diff --git a/CommandLine.c b/CommandLine.c
index 3d1f953f..848c7ae7 100644
--- a/CommandLine.c
+++ b/CommandLine.c
@@ -303,11 +303,11 @@ static void CommandLine_delay(Machine* host, unsigned long millisec) {
}
static void setCommFilter(State* state, char** commFilter) {
- ProcessList* pl = state->host->pl;
+ Table* table = state->host->activeTable;
IncSet* inc = state->mainPanel->inc;
IncSet_setFilter(inc, *commFilter);
- pl->incFilter = IncSet_filter(inc);
+ table->incFilter = IncSet_filter(inc);
free(*commFilter);
*commFilter = NULL;
@@ -334,8 +334,6 @@ int CommandLine_run(int argc, char** argv) {
if (!Platform_init())
return 1;
- Process_setupColumnWidths();
-
UsersTable* ut = UsersTable_new();
Hashtable* dm = DynamicMeters_new();
Hashtable* dc = DynamicColumns_new();
@@ -347,7 +345,7 @@ int CommandLine_run(int argc, char** argv) {
Settings* settings = Settings_new(host->activeCPUs, dm, dc);
host->settings = settings;
- Machine_addList(host, pl);
+ Machine_addTable(host, &pl->super, true);
Header* header = Header_new(host, 2);
Header_populateFromSettings(header);
@@ -379,7 +377,7 @@ int CommandLine_run(int argc, char** argv) {
CRT_init(settings, flags.allowUnicode, flags.iterationsRemaining != -1);
MainPanel* panel = MainPanel_new();
- ProcessList_setPanel(pl, (Panel*) panel);
+ Table_setPanel(&pl->super, (Panel*) panel);
MainPanel_updateLabels(panel, settings->ss->treeView, flags.commFilter);
@@ -400,13 +398,13 @@ int CommandLine_run(int argc, char** argv) {
ScreenManager_add(scr, (Panel*) panel, -1);
Machine_scan(host);
- ProcessList_scan(pl);
+ Machine_scanTables(host);
CommandLine_delay(host, 75);
Machine_scan(host);
- ProcessList_scan(pl);
+ Machine_scanTables(host);
if (settings->ss->allBranchesCollapsed)
- ProcessList_collapseAllBranches(pl);
+ Table_collapseAllBranches(&pl->super);
ScreenManager_run(scr, NULL, NULL, NULL);
@@ -421,7 +419,6 @@ int CommandLine_run(int argc, char** argv) {
}
Header_delete(header);
- ProcessList_delete(pl);
Machine_delete(host);
ScreenManager_delete(scr);
diff --git a/CommandScreen.c b/CommandScreen.c
index 6a87d137..ecd823bd 100644
--- a/CommandScreen.c
+++ b/CommandScreen.c
@@ -46,7 +46,7 @@ static void CommandScreen_scan(InfoScreen* this) {
}
static void CommandScreen_draw(InfoScreen* this) {
- InfoScreen_drawTitled(this, "Command of process %d - %s", this->process->pid, Process_getCommand(this->process));
+ InfoScreen_drawTitled(this, "Command of process %d - %s", Process_getPid(this->process), Process_getCommand(this->process));
}
const InfoScreenClass CommandScreen_class = {
diff --git a/DisplayOptionsPanel.c b/DisplayOptionsPanel.c
index f9fa9b12..326d33b1 100644
--- a/DisplayOptionsPanel.c
+++ b/DisplayOptionsPanel.c
@@ -109,7 +109,7 @@ DisplayOptionsPanel* DisplayOptionsPanel_new(Settings* settings, ScreenManager*
#undef TABMSG
Panel_add(super, (Object*) CheckItem_newByRef("Tree view", &(settings->ss->treeView)));
- Panel_add(super, (Object*) CheckItem_newByRef("- Tree view is always sorted by PID (htop 2 behavior)", &(settings->ss->treeViewAlwaysByPID)));
+ Panel_add(super, (Object*) CheckItem_newByRef("- Tree view is always sorted by ID (htop 2 behavior)", &(settings->ss->treeViewAlwaysByID)));
Panel_add(super, (Object*) CheckItem_newByRef("- Tree view is collapsed by default", &(settings->ss->allBranchesCollapsed)));
Panel_add(super, (Object*) TextItem_new("Global options:"));
Panel_add(super, (Object*) CheckItem_newByRef("Show tabs for screens", &(settings->screenTabs)));
diff --git a/EnvScreen.c b/EnvScreen.c
index 0fcee83a..b27155e6 100644
--- a/EnvScreen.c
+++ b/EnvScreen.c
@@ -24,7 +24,7 @@ void EnvScreen_delete(Object* this) {
}
static void EnvScreen_draw(InfoScreen* this) {
- InfoScreen_drawTitled(this, "Environment of process %d - %s", this->process->pid, Process_getCommand(this->process));
+ InfoScreen_drawTitled(this, "Environment of process %d - %s", Process_getPid(this->process), Process_getCommand(this->process));
}
static void EnvScreen_scan(InfoScreen* this) {
@@ -33,7 +33,7 @@ static void EnvScreen_scan(InfoScreen* this) {
Panel_prune(panel);
- char* env = Platform_getProcessEnv(this->process->pid);
+ char* env = Platform_getProcessEnv(Process_getPid(this->process));
if (env) {
for (const char* p = env; *p; p = strrchr(p, 0) + 1)
InfoScreen_addLine(this, p);
diff --git a/Machine.c b/Machine.c
index 63a996ef..8846aed7 100644
--- a/Machine.c
+++ b/Machine.c
@@ -15,6 +15,7 @@ in the source distribution for its full text.
#include "Hashtable.h"
#include "Macros.h"
#include "Platform.h"
+#include "Row.h"
#include "XUtils.h"
@@ -22,6 +23,11 @@ void Machine_init(Machine* this, UsersTable* usersTable, uid_t userId) {
this->usersTable = usersTable;
this->userId = userId;
+ this->htopUserId = getuid();
+
+ // discover fixed column width limits
+ Row_setPidColumnWidth(Platform_getMaxPid());
+
// always maintain valid realtime timestamps
Platform_gettime_realtime(&this->realtime, &this->realtimeMs);
@@ -49,12 +55,48 @@ void Machine_done(Machine* this) {
if (this->topologyOk) {
hwloc_topology_destroy(this->topology);
}
-#else
- (void)this;
#endif
+ for (size_t i = 0; i < this->tableCount; i++) {
+ Object_delete(&this->tables[i]->super);
+ }
}
-void Machine_addList(Machine* this, struct ProcessList_ *pl) {
- // currently only process lists are supported
- this->pl = pl;
+void Machine_addTable(Machine* this, Table* table, bool processes) {
+ if (processes)
+ this->processTable = table;
+ this->activeTable = table;
+
+ size_t nmemb = this->tableCount + 1;
+ Table** tables = xReallocArray(this->tables, nmemb, sizeof(Table*));
+ tables[nmemb - 1] = table;
+ this->tables = tables;
+ this->tableCount++;