From d005fff7b9552de6203995b774ad64678357b381 Mon Sep 17 00:00:00 2001 From: Victor Julien Date: Wed, 22 Nov 2023 09:31:38 +0100 Subject: [PATCH] stats: improve sync signalling Make syncs more reliable by using a atomic "sync now" variable and signalling the conditions under lock. Ticket: #6569. --- src/counters.c | 16 +++++++--------- src/counters.h | 2 +- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/counters.c b/src/counters.c index 56332430d8..790f416ba0 100644 --- a/src/counters.c +++ b/src/counters.c @@ -130,7 +130,7 @@ static void StatsPublicThreadContextCleanup(StatsPublicThreadContext *t) SCMutexLock(&t->m); StatsReleaseCounters(t->head); t->head = NULL; - t->perf_flag = 0; + SC_ATOMIC_SET(t->sync_now, false); t->curr_id = 0; SCMutexUnlock(&t->m); SCMutexDestroy(&t->m); @@ -460,7 +460,7 @@ void StatsSyncCounters(ThreadVars *tv) void StatsSyncCountersIfSignalled(ThreadVars *tv) { - if (tv->perf_public_ctx.perf_flag == 1) { + if (SC_ATOMIC_GET(tv->perf_public_ctx.sync_now) == true) { StatsUpdateCounterArray(&tv->perf_private_ctx, &tv->perf_public_ctx); } } @@ -521,13 +521,13 @@ static void *StatsWakeupThread(void *arg) continue; } - /* assuming the assignment of an int to be atomic, and even if it's - * not, it should be okay */ - tv->perf_public_ctx.perf_flag = 1; + SC_ATOMIC_SET(tv->perf_public_ctx.sync_now, true); if (tv->inq != NULL) { PacketQueue *q = tv->inq->pq; + SCMutexLock(&q->mutex_q); SCCondSignal(&q->cond_q); + SCMutexUnlock(&q->mutex_q); } tv = tv->next; @@ -541,9 +541,7 @@ static void *StatsWakeupThread(void *arg) continue; } - /* assuming the assignment of an int to be atomic, and even if it's - * not, it should be okay */ - tv->perf_public_ctx.perf_flag = 1; + SC_ATOMIC_SET(tv->perf_public_ctx.sync_now, true); tv = tv->next; } @@ -1256,7 +1254,7 @@ int StatsUpdateCounterArray(StatsPrivateThreadContext *pca, StatsPublicThreadCon } SCMutexUnlock(&pctx->m); - pctx->perf_flag = 0; + SC_ATOMIC_SET(pctx->sync_now, false); return 1; } diff --git a/src/counters.h b/src/counters.h index 100fec94f7..b3ffddbd56 100644 --- a/src/counters.h +++ b/src/counters.h @@ -63,7 +63,7 @@ typedef struct StatsCounter_ { */ typedef struct StatsPublicThreadContext_ { /* flag set by the wakeup thread, to inform the client threads to sync */ - uint32_t perf_flag; + SC_ATOMIC_DECLARE(bool, sync_now); /* pointer to the head of a list of counters assigned under this context */ StatsCounter *head; -- 2.47.2