summaryrefslogtreecommitdiffstats
path: root/pcp
diff options
context:
space:
mode:
authorNathan Scott <nathans@redhat.com>2021-09-03 12:11:31 +1000
committerBenBE <BenBE@geshi.org>2021-09-03 09:47:01 +0200
commitc0c2bb98a23b649c55e5d8a55395073fdaa8d6fa (patch)
tree5d568468338201447d1396843e761d33c6729b37 /pcp
parent9b30870eeca0e2fd29602451205834d753ed5905 (diff)
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
Diffstat (limited to 'pcp')
-rw-r--r--pcp/PCPDynamicColumn.c12
-rw-r--r--pcp/PCPDynamicColumn.h2
-rw-r--r--pcp/PCPDynamicMeter.c16
-rw-r--r--pcp/PCPDynamicMeter.h2
-rw-r--r--pcp/Platform.c8
-rw-r--r--pcp/Platform.h4
6 files changed, 44 insertions, 0 deletions
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);

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