From 40fcf7e4489d8bfe75359bd82a6b633fa29ac83c Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Wed, 29 Nov 2023 10:40:02 -0500 Subject: [PATCH] MT#55283 use g_auto for stats_metrics Change-Id: Ica79c0dcd7254879a4a1f68d82188c7a1ee82754 --- daemon/cli.c | 8 ++++---- daemon/mqtt.c | 5 ++--- daemon/statistics.c | 34 ++++++++++++++++------------------ daemon/websocket.c | 4 ++-- include/statistics.h | 7 +++++-- t/test-stats.c | 8 ++++---- 6 files changed, 33 insertions(+), 33 deletions(-) diff --git a/daemon/cli.c b/daemon/cli.c index bee035970..56d10ed3a 100644 --- a/daemon/cli.c +++ b/daemon/cli.c @@ -464,9 +464,9 @@ static void cli_incoming_list_counters(str *instr, struct cli_writer *cw) { } static void cli_incoming_list_totals(str *instr, struct cli_writer *cw) { - AUTO_CLEANUP_INIT(GQueue *metrics, statistics_free_metrics, statistics_gather_metrics(NULL)); + g_autoptr(stats_metric_q) metrics = statistics_gather_metrics(NULL); - for (GList *l = metrics->head; l; l = l->next) { + for (__auto_type l = metrics->head; l; l = l->next) { stats_metric *m = l->data; if (!m->descr) continue; @@ -1703,9 +1703,9 @@ static void cli_incoming_list_interfaces(str *instr, struct cli_writer *cw) { } static void cli_incoming_list_jsonstats(str *instr, struct cli_writer *cw) { - AUTO_CLEANUP_INIT(GQueue *metrics, statistics_free_metrics, statistics_gather_metrics(NULL)); + g_autoptr(stats_metric_q) metrics = statistics_gather_metrics(NULL); - for (GList *l = metrics->head; l; l = l->next) { + for (__auto_type l = metrics->head; l; l = l->next) { stats_metric *m = l->data; if (!m->label) continue; diff --git a/daemon/mqtt.c b/daemon/mqtt.c index 3d070c318..6d929bd92 100644 --- a/daemon/mqtt.c +++ b/daemon/mqtt.c @@ -467,10 +467,9 @@ static void mqtt_full_call(struct call *call, JsonBuilder *json) { static void mqtt_global_stats(JsonBuilder *json) { - AUTO_CLEANUP_INIT(GQueue *metrics, statistics_free_metrics, - statistics_gather_metrics(&interface_rate_stats)); + g_autoptr(stats_metric_q) metrics = statistics_gather_metrics(&interface_rate_stats); - for (GList *l = metrics->head; l; l = l->next) { + for (__auto_type l = metrics->head; l; l = l->next) { stats_metric *m = l->data; if (!m->label) continue; diff --git a/daemon/statistics.c b/daemon/statistics.c index 382ed2bcb..c2102b274 100644 --- a/daemon/statistics.c +++ b/daemon/statistics.c @@ -197,26 +197,26 @@ found:; } -INLINE void prom_metric(GQueue *ret, const char *name, const char *type) { - stats_metric *last = g_queue_peek_tail(ret); +INLINE void prom_metric(stats_metric_q *ret, const char *name, const char *type) { + stats_metric *last = t_queue_peek_tail(ret); last->prom_name = name; last->prom_type = type; } -static void prom_label(GQueue *ret, const char *fmt, ...) { +static void prom_label(stats_metric_q *ret, const char *fmt, ...) { if (!fmt) return; va_list ap; va_start(ap, fmt); - stats_metric *last = g_queue_peek_tail(ret); + stats_metric *last = t_queue_peek_tail(ret); last->prom_label = g_strdup_vprintf(fmt, ap); va_end(ap); } #define PROM(name, type) prom_metric(ret, name, type) #define PROMLAB(fmt, ...) prom_label(ret, fmt, ##__VA_ARGS__) -INLINE void metric_push(GQueue *ret, stats_metric *m) { +INLINE void metric_push(stats_metric_q *ret, stats_metric *m) { stats_metric *last = NULL; - for (GList *l_last = ret->tail; l_last; l_last = l_last->prev) { + for (__auto_type l_last = ret->tail; l_last; l_last = l_last->prev) { last = l_last->data; if (last->label) break; @@ -228,9 +228,9 @@ INLINE void metric_push(GQueue *ret, stats_metric *m) { } else if (m->is_bracket && !m->is_close_bracket && last && last->is_close_bracket) m->is_follow_up = 1; - g_queue_push_tail(ret, m); + t_queue_push_tail(ret, m); } -static void add_metric(GQueue *ret, const char *label, const char *desc, const char *fmt1, const char *fmt2, ...) { +static void add_metric(stats_metric_q *ret, const char *label, const char *desc, const char *fmt1, const char *fmt2, ...) { va_list ap; stats_metric *m = g_slice_alloc0(sizeof(*m)); @@ -273,7 +273,7 @@ static void add_metric(GQueue *ret, const char *label, const char *desc, const c } metric_push(ret, m); } -static void add_header(GQueue *ret, const char *fmt1, const char *fmt2, ...) { +static void add_header(stats_metric_q *ret, const char *fmt1, const char *fmt2, ...) { va_list ap; stats_metric *m = g_slice_alloc0(sizeof(*m)); @@ -313,8 +313,8 @@ static void add_header(GQueue *ret, const char *fmt1, const char *fmt2, ...) { #define HEADERl(fmt2, ...) add_header(ret, NULL, fmt2, ##__VA_ARGS__) -GQueue *statistics_gather_metrics(struct interface_sampled_rate_stats *interface_rate_stats) { - GQueue *ret = g_queue_new(); +stats_metric_q *statistics_gather_metrics(struct interface_sampled_rate_stats *interface_rate_stats) { + stats_metric_q *ret = stats_metric_q_new(); double calls_dur_iv; uint64_t cur_sessions, num_sessions, min_sess_iv, max_sess_iv; @@ -914,8 +914,7 @@ GQueue *statistics_gather_metrics(struct interface_sampled_rate_stats *interface } #pragma GCC diagnostic warning "-Wformat-zero-length" -static void free_stats_metric(void *p) { - stats_metric *m = p; +static void free_stats_metric(stats_metric *m) { g_free(m->descr); g_free(m->label); g_free(m->value_long); @@ -925,9 +924,8 @@ static void free_stats_metric(void *p) { g_slice_free1(sizeof(*m), m); } -void statistics_free_metrics(GQueue **q) { - g_queue_free_full(*q, free_stats_metric); - *q = NULL; +void statistics_free_metrics(stats_metric_q *q) { + t_queue_free_full(q, free_stats_metric); } void statistics_free(void) { @@ -952,14 +950,14 @@ void statistics_init(void) { } const char *statistics_ng(bencode_item_t *input, bencode_item_t *output) { - AUTO_CLEANUP_INIT(GQueue *metrics, statistics_free_metrics, statistics_gather_metrics(NULL)); + g_autoptr(stats_metric_q) metrics = statistics_gather_metrics(NULL); g_auto(GQueue) bstack = G_QUEUE_INIT; bencode_item_t *dict = output; const char *sub_label = "statistics"; // top level bencode_buffer_t *buf = output->buffer; - for (GList *l = metrics->head; l; l = l->next) { + for (__auto_type l = metrics->head; l; l = l->next) { stats_metric *m = l->data; if (!m->label) continue; diff --git a/daemon/websocket.c b/daemon/websocket.c index fa0441e6f..e6d162534 100644 --- a/daemon/websocket.c +++ b/daemon/websocket.c @@ -384,11 +384,11 @@ static const char *websocket_http_ping(struct websocket_message *wm) { static const char *websocket_http_metrics(struct websocket_message *wm) { ilogs(http, LOG_DEBUG, "Respoding to GET /metrics"); - AUTO_CLEANUP_INIT(GQueue *metrics, statistics_free_metrics, statistics_gather_metrics(NULL)); + g_autoptr(stats_metric_q) metrics = statistics_gather_metrics(NULL); g_autoptr(GString) outp = g_string_new(""); g_autoptr(GHashTable) metric_types = g_hash_table_new(g_str_hash, g_str_equal); - for (GList *l = metrics->head; l; l = l->next) { + for (__auto_type l = metrics->head; l; l = l->next) { stats_metric *m = l->data; if (!m->label) continue; diff --git a/include/statistics.h b/include/statistics.h index 5c5624ddc..a9e1016da 100644 --- a/include/statistics.h +++ b/include/statistics.h @@ -120,6 +120,8 @@ struct stats_metric { char *prom_label; }; +TYPED_GQUEUE(stats_metric, stats_metric) + struct call_stats { time_t last_packet; @@ -195,8 +197,9 @@ void statistics_update_ip46_inc_dec(struct call *, int op); void statistics_update_foreignown_dec(struct call *); void statistics_update_foreignown_inc(struct call* c); -GQueue *statistics_gather_metrics(struct interface_sampled_rate_stats *); -void statistics_free_metrics(GQueue **); +stats_metric_q *statistics_gather_metrics(struct interface_sampled_rate_stats *); +void statistics_free_metrics(stats_metric_q *); +G_DEFINE_AUTOPTR_CLEANUP_FUNC(stats_metric_q, statistics_free_metrics) const char *statistics_ng(bencode_item_t *input, bencode_item_t *output); enum thread_looper_action call_rate_stats_updater(void); diff --git a/t/test-stats.c b/t/test-stats.c index 4f19c538b..b46793332 100644 --- a/t/test-stats.c +++ b/t/test-stats.c @@ -42,9 +42,9 @@ static void __assert_g_string_eq(GString *a, const char *b, unsigned int line) { } #define assert_g_string_eq(a, b) __assert_g_string_eq(a, b, __LINE__) -static void __assert_metrics_eq(GQueue *q, const char *b, unsigned int line) { +static void __assert_metrics_eq(stats_metric_q *q, const char *b, unsigned int line) { GString *a = g_string_new(""); - for (GList *l = q->head; l; l = l->next) { + for (__auto_type l = q->head; l; l = l->next) { struct stats_metric *m = l->data; #define APP_S(x) if (m->x) do { g_string_append(a, m->x); g_string_append_c(a, '\n'); } while (0) APP_S(descr); @@ -54,7 +54,7 @@ static void __assert_metrics_eq(GQueue *q, const char *b, unsigned int line) { APP_S(prom_label); } __assert_g_string_eq(a, b, line); - statistics_free_metrics(&q); + statistics_free_metrics(q); } #define assert_metrics_eq(a, b) __assert_metrics_eq(a, b, __LINE__) @@ -286,7 +286,7 @@ int main(void) { "timeout_sess 0 150\n" "reject_sess 0 150\n"); - GQueue *stats = statistics_gather_metrics(NULL); + stats_metric_q *stats = statistics_gather_metrics(NULL); assert_metrics_eq(stats, "\n" "{\n"