From c0c2bb98a23b649c55e5d8a55395073fdaa8d6fa Mon Sep 17 00:00:00 2001 From: Nathan Scott Date: Fri, 3 Sep 2021 12:11:31 +1000 Subject: 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 --- pcp/PCPDynamicColumn.c | 12 ++++++++++++ pcp/PCPDynamicColumn.h | 2 ++ pcp/PCPDynamicMeter.c | 16 ++++++++++++++++ pcp/PCPDynamicMeter.h | 2 ++ pcp/Platform.c | 8 ++++++++ pcp/Platform.h | 4 ++++ 6 files changed, 44 insertions(+) (limited to 'pcp') diff --git a/pcp/PCPDynamicColumn.c b/pcp/PCPDynamicColumn.c index 3c4e6797..29dc9f91 100644 --- a/pcp/PCPDynamicColumn.c +++ b/pcp/PCPDynamicColumn.c @@ -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); diff --git a/pcp/PCPDynamicColumn.h b/pcp/PCPDynamicColumn.h index 28f3d5ca..d0ffe719 100644 --- a/pcp/PCPDynamicColumn.h +++ b/pcp/PCPDynamicColumn.h @@ -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); diff --git a/pcp/PCPDynamicMeter.c b/pcp/PCPDynamicMeter.c index 430f41c9..ccea8134 100644 --- a/pcp/PCPDynamicMeter.c +++ b/pcp/PCPDynamicMeter.c @@ -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); diff --git a/pcp/PCPDynamicMeter.h b/pcp/PCPDynamicMeter.h index 3da7c35b..0e5ddd2b 100644 --- a/pcp/PCPDynamicMeter.h +++ b/pcp/PCPDynamicMeter.h @@ -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); diff --git a/pcp/Platform.c b/pcp/Platform.c index c2af2e4a..29055b99 100644 --- a/pcp/Platform.c +++ b/pcp/Platform.c @@ -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) diff --git a/pcp/Platform.h b/pcp/Platform.h index dcb8dc98..14e57469 100644 --- a/pcp/Platform.h +++ b/pcp/Platform.h @@ -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); -- cgit v1.2.3