mirror of
https://github.com/xzeldon/htop.git
synced 2025-07-13 04:34:35 +03:00
Add completion handling for dynamic meters and columns
Be sure to free dynamic memory allocated for meters and columns strings, no-op on platforms other than pcp. Closes #774
This commit is contained in:
@ -226,6 +226,18 @@ void PCPDynamicColumns_init(PCPDynamicColumns* columns) {
|
||||
free(path);
|
||||
}
|
||||
|
||||
static void PCPDynamicColumns_free(ATTR_UNUSED ht_key_t key, void* value, ATTR_UNUSED void* data) {
|
||||
PCPDynamicColumn* column = (PCPDynamicColumn*) value;
|
||||
free(column->metricName);
|
||||
free(column->super.heading);
|
||||
free(column->super.caption);
|
||||
free(column->super.description);
|
||||
}
|
||||
|
||||
void PCPDynamicColumns_done(Hashtable* table) {
|
||||
Hashtable_foreach(table, PCPDynamicColumns_free, NULL);
|
||||
}
|
||||
|
||||
void PCPDynamicColumn_writeField(PCPDynamicColumn* this, const Process* proc, RichString* str) {
|
||||
const PCPProcess* pp = (const PCPProcess*) proc;
|
||||
unsigned int type = PCPMetric_type(this->id);
|
||||
|
@ -26,6 +26,8 @@ typedef struct PCPDynamicColumns_ {
|
||||
|
||||
void PCPDynamicColumns_init(PCPDynamicColumns* columns);
|
||||
|
||||
void PCPDynamicColumns_done(Hashtable* table);
|
||||
|
||||
void PCPDynamicColumn_writeField(PCPDynamicColumn* this, const Process* proc, RichString* str);
|
||||
|
||||
int PCPDynamicColumn_compareByKey(const PCPProcess* p1, const PCPProcess* p2, ProcessField key);
|
||||
|
@ -283,6 +283,22 @@ void PCPDynamicMeters_init(PCPDynamicMeters* meters) {
|
||||
free(path);
|
||||
}
|
||||
|
||||
static void PCPDynamicMeter_free(ATTR_UNUSED ht_key_t key, void* value, ATTR_UNUSED void* data) {
|
||||
PCPDynamicMeter* meter = (PCPDynamicMeter*) value;
|
||||
for (size_t i = 0; i < meter->totalMetrics; i++) {
|
||||
free(meter->metrics[i].name);
|
||||
free(meter->metrics[i].label);
|
||||
free(meter->metrics[i].suffix);
|
||||
}
|
||||
free(meter->metrics);
|
||||
free(meter->super.caption);
|
||||
free(meter->super.description);
|
||||
}
|
||||
|
||||
void PCPDynamicMeters_done(Hashtable* table) {
|
||||
Hashtable_foreach(table, PCPDynamicMeter_free, NULL);
|
||||
}
|
||||
|
||||
void PCPDynamicMeter_enable(PCPDynamicMeter* this) {
|
||||
for (size_t i = 0; i < this->totalMetrics; i++)
|
||||
PCPMetric_enable(this->metrics[i].id, true);
|
||||
|
@ -33,6 +33,8 @@ typedef struct PCPDynamicMeters_ {
|
||||
|
||||
void PCPDynamicMeters_init(PCPDynamicMeters* meters);
|
||||
|
||||
void PCPDynamicMeters_done(Hashtable* table);
|
||||
|
||||
void PCPDynamicMeter_enable(PCPDynamicMeter* this);
|
||||
|
||||
void PCPDynamicMeter_updateValues(PCPDynamicMeter* this, Meter* meter);
|
||||
|
@ -363,6 +363,14 @@ void Platform_init(void) {
|
||||
Platform_getMaxPid();
|
||||
}
|
||||
|
||||
void Platform_dynamicColumnsDone(Hashtable* columns) {
|
||||
PCPDynamicColumns_done(columns);
|
||||
}
|
||||
|
||||
void Platform_dynamicMetersDone(Hashtable* meters) {
|
||||
PCPDynamicMeters_done(meters);
|
||||
}
|
||||
|
||||
void Platform_done(void) {
|
||||
pmDestroyContext(pcp->context);
|
||||
if (pcp->result)
|
||||
|
@ -138,6 +138,8 @@ void Platform_gettime_monotonic(uint64_t* msec);
|
||||
|
||||
Hashtable* Platform_dynamicMeters(void);
|
||||
|
||||
void Platform_dynamicMetersDone(Hashtable* meters);
|
||||
|
||||
void Platform_dynamicMeterInit(Meter* meter);
|
||||
|
||||
void Platform_dynamicMeterUpdateValues(Meter* meter);
|
||||
@ -146,6 +148,8 @@ void Platform_dynamicMeterDisplay(const Meter* meter, RichString* out);
|
||||
|
||||
Hashtable* Platform_dynamicColumns(void);
|
||||
|
||||
void Platform_dynamicColumnsDone(Hashtable* columns);
|
||||
|
||||
const char* Platform_dynamicColumnInit(unsigned int key);
|
||||
|
||||
bool Platform_dynamicColumnWriteField(const Process* proc, RichString* str, unsigned int key);
|
||||
|
Reference in New Issue
Block a user