Skip to content

Commit

Permalink
Refactor and consolidate dynamic meters/columns pointers
Browse files Browse the repository at this point in the history
This removes the duplication of dynamic meter/column hashtable
pointers that has come in between the Settings and ProcessList
structures - only one copy of these is needed. With the future
planned dynamic screens feature adding another pointer, let us
first clean this up before any further duplication happens.
  • Loading branch information
natoscott authored and BenBE committed Apr 5, 2023
1 parent c8a6185 commit e7f447b
Show file tree
Hide file tree
Showing 27 changed files with 78 additions and 72 deletions.
9 changes: 5 additions & 4 deletions AvailableMetersPanel.c
Original file line number Diff line number Diff line change
Expand Up @@ -128,10 +128,11 @@ static void AvailableMetersPanel_addDynamicMeter(ATTR_UNUSED ht_key_t key, void*
}

// Handle (&DynamicMeter_class) entries in the AvailableMetersPanel
static void AvailableMetersPanel_addDynamicMeters(Panel* super, const ProcessList* pl, unsigned int offset) {
static void AvailableMetersPanel_addDynamicMeters(Panel* super, const Settings* settings, unsigned int offset) {
DynamicIterator iter = { .super = super, .id = 1, .offset = offset };
assert(pl->dynamicMeters != NULL);
Hashtable_foreach(pl->dynamicMeters, AvailableMetersPanel_addDynamicMeter, &iter);
Hashtable* dynamicMeters = settings->dynamicColumns;
assert(dynamicMeters != NULL);
Hashtable_foreach(dynamicMeters, AvailableMetersPanel_addDynamicMeter, &iter);
}

// Handle remaining Platform Meter entries in the AvailableMetersPanel
Expand Down Expand Up @@ -161,7 +162,7 @@ AvailableMetersPanel* AvailableMetersPanel_new(Settings* settings, Header* heade
const MeterClass* type = Platform_meterTypes[i];
assert(type != &CPUMeter_class);
if (type == &DynamicMeter_class)
AvailableMetersPanel_addDynamicMeters(super, pl, i);
AvailableMetersPanel_addDynamicMeters(super, settings, i);
else
AvailableMetersPanel_addPlatformMeter(super, type, i);
}
Expand Down
6 changes: 3 additions & 3 deletions CommandLine.c
Original file line number Diff line number Diff line change
Expand Up @@ -322,14 +322,14 @@ int CommandLine_run(const char* name, int argc, char** argv) {
Process_setupColumnWidths();

UsersTable* ut = UsersTable_new();
Hashtable* dc = DynamicColumns_new();
Hashtable* dm = DynamicMeters_new();
Hashtable* dc = DynamicColumns_new();
if (!dc)
dc = Hashtable_new(0, true);

ProcessList* pl = ProcessList_new(ut, dm, dc, flags.pidMatchList, flags.userId);
ProcessList* pl = ProcessList_new(ut, flags.pidMatchList, flags.userId);

Settings* settings = Settings_new(pl->activeCPUs, dc);
Settings* settings = Settings_new(pl->activeCPUs, dm, dc);
pl->settings = settings;

Header* header = Header_new(pl, settings, 2);
Expand Down
8 changes: 4 additions & 4 deletions DynamicMeter.c
Original file line number Diff line number Diff line change
Expand Up @@ -88,16 +88,16 @@ static void DynamicMeter_display(const Object* cast, RichString* out) {
}

static const char* DynamicMeter_getCaption(const Meter* this) {
const ProcessList* pl = this->pl;
const DynamicMeter* meter = Hashtable_get(pl->dynamicMeters, this->param);
const Settings* settings = this->pl->settings;
const DynamicMeter* meter = Hashtable_get(settings->dynamicMeters, this->param);
if (meter)
return meter->caption ? meter->caption : meter->name;
return this->caption;
}

static void DynamicMeter_getUiName(const Meter* this, char* name, size_t length) {
const ProcessList* pl = this->pl;
const DynamicMeter* meter = Hashtable_get(pl->dynamicMeters, this->param);
const Settings* settings = this->pl->settings;
const DynamicMeter* meter = Hashtable_get(settings->dynamicMeters, this->param);
if (meter) {
const char* uiName = meter->caption;
if (uiName) {
Expand Down
9 changes: 5 additions & 4 deletions Header.c
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ static void Header_addMeterByName(Header* this, const char* name, MeterModeId mo
if ((end = strrchr(dynamic, ')')) == NULL)
return; // htoprc parse failure
*end = '\0';
if (!DynamicMeter_search(this->pl->dynamicMeters, dynamic, &param))
if (!DynamicMeter_search(this->settings->dynamicMeters, dynamic, &param))
return; // name lookup failure
} else {
param = 0;
Expand Down Expand Up @@ -130,10 +130,11 @@ void Header_populateFromSettings(Header* this) {
}

void Header_writeBackToSettings(const Header* this) {
Settings_setHeaderLayout(this->settings, this->headerLayout);
Settings* settings = this->settings;
Settings_setHeaderLayout(settings, this->headerLayout);

Header_forEachColumn(this, col) {
MeterColumnSetting* colSettings = &this->settings->hColumns[col];
MeterColumnSetting* colSettings = &settings->hColumns[col];

if (colSettings->names) {
for (size_t j = 0; j < colSettings->len; j++)
Expand All @@ -153,7 +154,7 @@ void Header_writeBackToSettings(const Header* this) {
const Meter* meter = (Meter*) Vector_get(vec, i);
char* name;
if (meter->param && As_Meter(meter) == &DynamicMeter_class) {
const char* dynamic = DynamicMeter_lookup(this->pl->dynamicMeters, meter->param);
const char* dynamic = DynamicMeter_lookup(settings->dynamicMeters, meter->param);
xAsprintf(&name, "%s(%s)", As_Meter(meter)->name, dynamic);
} else if (meter->param && As_Meter(meter) == &CPUMeter_class) {
xAsprintf(&name, "%s(%u)", As_Meter(meter)->name, meter->param);
Expand Down
47 changes: 26 additions & 21 deletions ProcessList.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ in the source distribution for its full text.
#include "XUtils.h"


ProcessList* ProcessList_init(ProcessList* this, const ObjectClass* klass, UsersTable* usersTable, Hashtable* dynamicMeters, Hashtable* dynamicColumns, Hashtable* pidMatchList, uid_t userId) {
ProcessList* ProcessList_init(ProcessList* this, const ObjectClass* klass, UsersTable* usersTable, Hashtable* pidMatchList, uid_t userId) {
this->processes = Vector_new(klass, true, DEFAULT_SIZE);
this->displayList = Vector_new(klass, false, DEFAULT_SIZE);

Expand All @@ -29,8 +29,6 @@ ProcessList* ProcessList_init(ProcessList* this, const ObjectClass* klass, Users

this->usersTable = usersTable;
this->pidMatchList = pidMatchList;
this->dynamicMeters = dynamicMeters;
this->dynamicColumns = dynamicColumns;

this->userId = userId;

Expand Down Expand Up @@ -82,8 +80,9 @@ void ProcessList_setPanel(ProcessList* this, Panel* panel) {
this->panel = panel;
}

static const char* alignedDynamicColumnTitle(const ProcessList* this, int key, char* titleBuffer, size_t titleBufferSize) {
const DynamicColumn* column = Hashtable_get(this->dynamicColumns, key);
// helper function to fill an aligned title string for a dynamic column
static const char* alignedTitleDynamicColumn(const Settings* settings, int key, char* titleBuffer, size_t titleBufferSize) {
const DynamicColumn* column = Hashtable_get(settings->dynamicColumns, key);
if (column == NULL)
return "- ";
int width = column->width;
Expand All @@ -93,40 +92,45 @@ static const char* alignedDynamicColumnTitle(const ProcessList* this, int key, c
return titleBuffer;
}

static const char* alignedProcessFieldTitle(const ProcessList* this, ProcessField field) {
static char titleBuffer[UINT8_MAX + sizeof(" ")];
assert(sizeof(titleBuffer) >= DYNAMIC_MAX_COLUMN_WIDTH + sizeof(" "));
assert(sizeof(titleBuffer) >= PROCESS_MAX_PID_DIGITS + sizeof(" "));
assert(sizeof(titleBuffer) >= PROCESS_MAX_UID_DIGITS + sizeof(" "));

if (field >= LAST_PROCESSFIELD)
return alignedDynamicColumnTitle(this, field, titleBuffer, sizeof(titleBuffer));

// helper function to fill an aligned title string for a process field
static const char* alignedTitleProcessField(ProcessField field, char* titleBuffer, size_t titleBufferSize) {
const char* title = Process_fields[field].title;
if (!title)
return "- ";

if (Process_fields[field].pidColumn) {
xSnprintf(titleBuffer, sizeof(titleBuffer), "%*s ", Process_pidDigits, title);
xSnprintf(titleBuffer, titleBufferSize, "%*s ", Process_pidDigits, title);
return titleBuffer;
}

if (field == ST_UID) {
xSnprintf(titleBuffer, sizeof(titleBuffer), "%*s ", Process_uidDigits, title);
xSnprintf(titleBuffer, titleBufferSize, "%*s ", Process_uidDigits, title);
return titleBuffer;
}

if (Process_fields[field].autoWidth) {
if (field == PERCENT_CPU)
xSnprintf(titleBuffer, sizeof(titleBuffer), "%*s ", Process_fieldWidths[field], title);
xSnprintf(titleBuffer, titleBufferSize, "%*s ", Process_fieldWidths[field], title);
else
xSnprintf(titleBuffer, sizeof(titleBuffer), "%-*.*s ", Process_fieldWidths[field], Process_fieldWidths[field], title);
xSnprintf(titleBuffer, titleBufferSize, "%-*.*s ", Process_fieldWidths[field], Process_fieldWidths[field], title);
return titleBuffer;
}

return title;
}

// helper function to create an aligned title string for a given field
static const char* ProcessField_alignedTitle(const Settings* settings, ProcessField field) {
static char titleBuffer[UINT8_MAX + sizeof(" ")];
assert(sizeof(titleBuffer) >= DYNAMIC_MAX_COLUMN_WIDTH + sizeof(" "));
assert(sizeof(titleBuffer) >= PROCESS_MAX_PID_DIGITS + sizeof(" "));
assert(sizeof(titleBuffer) >= PROCESS_MAX_UID_DIGITS + sizeof(" "));

if (field < LAST_PROCESSFIELD)
return alignedTitleProcessField(field, titleBuffer, sizeof(titleBuffer));
return alignedTitleDynamicColumn(settings, field, titleBuffer, sizeof(titleBuffer));
}

void ProcessList_printHeader(const ProcessList* this, RichString* header) {
RichString_rewind(header, RichString_size(header));

Expand All @@ -146,7 +150,7 @@ void ProcessList_printHeader(const ProcessList* this, RichString* header) {
color = CRT_colors[PANEL_HEADER_FOCUS];
}

RichString_appendWide(header, color, alignedProcessFieldTitle(this, fields[i]));
RichString_appendWide(header, color, ProcessField_alignedTitle(settings, fields[i]));
if (key == fields[i] && RichString_getCharVal(*header, RichString_size(header) - 1) == ' ') {
bool ascending = ScreenSettings_getActiveDirection(ss) == 1;
RichString_rewind(header, 1); // rewind to override space
Expand Down Expand Up @@ -337,10 +341,11 @@ void ProcessList_updateDisplayList(ProcessList* this) {

ProcessField ProcessList_keyAt(const ProcessList* this, int at) {
int x = 0;
const ProcessField* fields = this->settings->ss->fields;
const Settings* settings = this->settings;
const ProcessField* fields = settings->ss->fields;
ProcessField field;
for (int i = 0; (field = fields[i]); i++) {
int len = strlen(alignedProcessFieldTitle(this, field));
int len = strlen(ProcessField_alignedTitle(settings, field));
if (at >= x && at <= x + len) {
return field;
}
Expand Down
7 changes: 2 additions & 5 deletions ProcessList.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,6 @@ typedef struct ProcessList_ {

bool needsSort;

Hashtable* dynamicMeters; /* runtime-discovered meters */
Hashtable* dynamicColumns; /* runtime-discovered Columns */

struct timeval realtime; /* time of the current sample */
uint64_t realtimeMs; /* current time in milliseconds */
uint64_t monotonicMs; /* same, but from monotonic clock */
Expand Down Expand Up @@ -90,13 +87,13 @@ typedef struct ProcessList_ {
} ProcessList;

/* Implemented by platforms */
ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* dynamicMeters, Hashtable* dynamicColumns, Hashtable* pidMatchList, uid_t userId);
ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidMatchList, uid_t userId);
void ProcessList_delete(ProcessList* pl);
void ProcessList_goThroughEntries(ProcessList* super, bool pauseProcessUpdate);
bool ProcessList_isCPUonline(const ProcessList* super, unsigned int id);


ProcessList* ProcessList_init(ProcessList* this, const ObjectClass* klass, UsersTable* usersTable, Hashtable* dynamicMeters, Hashtable* dynamicColumns, Hashtable* pidMatchList, uid_t userId);
ProcessList* ProcessList_init(ProcessList* this, const ObjectClass* klass, UsersTable* usersTable, Hashtable* pidMatchList, uid_t userId);

void ProcessList_done(ProcessList* this);

Expand Down
3 changes: 2 additions & 1 deletion Settings.c
Original file line number Diff line number Diff line change
Expand Up @@ -667,10 +667,11 @@ int Settings_write(const Settings* this, bool onCrash) {
return r;
}

Settings* Settings_new(unsigned int initialCpuCount, Hashtable* dynamicColumns) {
Settings* Settings_new(unsigned int initialCpuCount, Hashtable* dynamicMeters, Hashtable* dynamicColumns) {
Settings* this = xCalloc(1, sizeof(Settings));

this->dynamicColumns = dynamicColumns;
this->dynamicMeters = dynamicMeters;
this->hLayout = HF_TWO_50_50;
this->hColumns = xCalloc(HeaderLayout_getColumns(this->hLayout), sizeof(MeterColumnSetting));

Expand Down
5 changes: 3 additions & 2 deletions Settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@ typedef struct Settings_ {
int config_version;
HeaderLayout hLayout;
MeterColumnSetting* hColumns;
Hashtable* dynamicColumns;
Hashtable* dynamicColumns; /* runtime-discovered columns */
Hashtable* dynamicMeters; /* runtime-discovered meters */

ScreenSettings** screens;
unsigned int nScreens;
Expand Down Expand Up @@ -117,7 +118,7 @@ void Settings_delete(Settings* this);

int Settings_write(const Settings* this, bool onCrash);

Settings* Settings_new(unsigned int initialCpuCount, Hashtable* dynamicColumns);
Settings* Settings_new(unsigned int initialCpuCount, Hashtable* dynamicMeters, Hashtable* dynamicColumns);

ScreenSettings* Settings_newScreen(Settings* this, const ScreenDefaults* defaults);

Expand Down
4 changes: 2 additions & 2 deletions darwin/DarwinProcessList.c
Original file line number Diff line number Diff line change
Expand Up @@ -89,10 +89,10 @@ static struct kinfo_proc* ProcessList_getKInfoProcs(size_t* count) {
CRT_fatalError("Unable to get kinfo_procs");
}

ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* dynamicMeters, Hashtable* dynamicColumns, Hashtable* pidMatchList, uid_t userId) {
ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidMatchList, uid_t userId) {
DarwinProcessList* this = xCalloc(1, sizeof(DarwinProcessList));

ProcessList_init(&this->super, Class(DarwinProcess), usersTable, dynamicMeters, dynamicColumns, pidMatchList, userId);
ProcessList_init(&this->super, Class(DarwinProcess), usersTable, pidMatchList, userId);

/* Initialize the CPU information */
this->super.activeCPUs = ProcessList_allocateCPULoadInfo(&this->prev_load);
Expand Down
2 changes: 1 addition & 1 deletion darwin/DarwinProcessList.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ typedef struct DarwinProcessList_ {
ZfsArcStats zfs;
} DarwinProcessList;

ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* dynamicMeters, Hashtable* dynamicColumns, Hashtable* pidMatchList, uid_t userId);
ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidMatchList, uid_t userId);

void ProcessList_delete(ProcessList* this);

Expand Down
4 changes: 2 additions & 2 deletions dragonflybsd/DragonFlyBSDProcessList.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,12 @@ static int MIB_kern_cp_time[2];
static int MIB_kern_cp_times[2];
static int kernelFScale;

ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* dynamicMeters, Hashtable* dynamicColumns, Hashtable* pidMatchList, uid_t userId) {
ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidMatchList, uid_t userId) {
size_t len;
char errbuf[_POSIX2_LINE_MAX];
DragonFlyBSDProcessList* dfpl = xCalloc(1, sizeof(DragonFlyBSDProcessList));
ProcessList* pl = (ProcessList*) dfpl;
ProcessList_init(pl, Class(DragonFlyBSDProcess), usersTable, dynamicMeters, dynamicColumns, pidMatchList, userId);
ProcessList_init(pl, Class(DragonFlyBSDProcess), usersTable, pidMatchList, userId);

// physical memory in system: hw.physmem
// physical page size: hw.pagesize
Expand Down
2 changes: 1 addition & 1 deletion dragonflybsd/DragonFlyBSDProcessList.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ typedef struct DragonFlyBSDProcessList_ {
Hashtable* jails;
} DragonFlyBSDProcessList;

ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* dynamicMeters, Hashtable* dynamicColumns, Hashtable* pidMatchList, uid_t userId);
ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidMatchList, uid_t userId);

void ProcessList_delete(ProcessList* this);

Expand Down
4 changes: 2 additions & 2 deletions freebsd/FreeBSDProcessList.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,12 +59,12 @@ static int MIB_kern_cp_time[2];
static int MIB_kern_cp_times[2];
static int kernelFScale;

ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* dynamicMeters, Hashtable* DynamicColumns, Hashtable* pidMatchList, uid_t userId) {
ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidMatchList, uid_t userId) {
size_t len;
char errbuf[_POSIX2_LINE_MAX];
FreeBSDProcessList* fpl = xCalloc(1, sizeof(FreeBSDProcessList));
ProcessList* pl = (ProcessList*) fpl;
ProcessList_init(pl, Class(FreeBSDProcess), usersTable, dynamicMeters, DynamicColumns, pidMatchList, userId);
ProcessList_init(pl, Class(FreeBSDProcess), usersTable, pidMatchList, userId);

// physical memory in system: hw.physmem
// physical page size: hw.pagesize
Expand Down
2 changes: 1 addition & 1 deletion freebsd/FreeBSDProcessList.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ typedef struct FreeBSDProcessList_ {

} FreeBSDProcessList;

ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* dynamicMeters, Hashtable* dynamicColumns, Hashtable* pidMatchList, uid_t userId);
ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidMatchList, uid_t userId);

void ProcessList_delete(ProcessList* this);

Expand Down
4 changes: 2 additions & 2 deletions linux/LinuxProcessList.c
Original file line number Diff line number Diff line change
Expand Up @@ -297,11 +297,11 @@ static void LinuxProcessList_updateCPUcount(ProcessList* super) {
super->existingCPUs = currExisting;
}

ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* dynamicMeters, Hashtable* dynamicColumns, Hashtable* pidMatchList, uid_t userId) {
ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidMatchList, uid_t userId) {
LinuxProcessList* this = xCalloc(1, sizeof(LinuxProcessList));
ProcessList* pl = &(this->super);

ProcessList_init(pl, Class(LinuxProcess), usersTable, dynamicMeters, dynamicColumns, pidMatchList, userId);
ProcessList_init(pl, Class(LinuxProcess), usersTable, pidMatchList, userId);
LinuxProcessList_initTtyDrivers(this);

// Initialize page size
Expand Down
2 changes: 1 addition & 1 deletion linux/LinuxProcessList.h
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ typedef struct LinuxProcessList_ {
#define PROC_LINE_LENGTH 4096
#endif

ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* dynamicMeters, Hashtable* dynamicColumns, Hashtable* pidMatchList, uid_t userId);
ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidMatchList, uid_t userId);

void ProcessList_delete(ProcessList* pl);

Expand Down
4 changes: 2 additions & 2 deletions netbsd/NetBSDProcessList.c
Original file line number Diff line number Diff line change
Expand Up @@ -106,14 +106,14 @@ static void NetBSDProcessList_updateCPUcount(ProcessList* super) {
}
}

ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* dynamicMeters, Hashtable* dynamicColumns, Hashtable* pidMatchList, uid_t userId) {
ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidMatchList, uid_t userId) {
const int fmib[] = { CTL_KERN, KERN_FSCALE };
size_t size;
char errbuf[_POSIX2_LINE_MAX];

NetBSDProcessList* npl = xCalloc(1, sizeof(NetBSDProcessList));
ProcessList* pl = (ProcessList*) npl;
ProcessList_init(pl, Class(NetBSDProcess), usersTable, dynamicMeters, dynamicColumns, pidMatchList, userId);
ProcessList_init(pl, Class(NetBSDProcess), usersTable, pidMatchList, userId);

NetBSDProcessList_updateCPUcount(pl);

Expand Down
2 changes: 1 addition & 1 deletion netbsd/NetBSDProcessList.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ typedef struct NetBSDProcessList_ {
} NetBSDProcessList;


ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* dynamicMeters, Hashtable* dynamicColumns, Hashtable* pidMatchList, uid_t userId);
ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidMatchList, uid_t userId);

void ProcessList_delete(ProcessList* this);

Expand Down
Loading

0 comments on commit e7f447b

Please sign in to comment.