stats: improve sync signalling

Make syncs more reliable by using a atomic "sync now" variable and
signalling the conditions under lock.

Ticket: #6569.
pull/9882/head
Victor Julien 1 year ago committed by Victor Julien
parent 74bc27ecd5
commit d005fff7b9

@ -130,7 +130,7 @@ static void StatsPublicThreadContextCleanup(StatsPublicThreadContext *t)
SCMutexLock(&t->m); SCMutexLock(&t->m);
StatsReleaseCounters(t->head); StatsReleaseCounters(t->head);
t->head = NULL; t->head = NULL;
t->perf_flag = 0; SC_ATOMIC_SET(t->sync_now, false);
t->curr_id = 0; t->curr_id = 0;
SCMutexUnlock(&t->m); SCMutexUnlock(&t->m);
SCMutexDestroy(&t->m); SCMutexDestroy(&t->m);
@ -460,7 +460,7 @@ void StatsSyncCounters(ThreadVars *tv)
void StatsSyncCountersIfSignalled(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); StatsUpdateCounterArray(&tv->perf_private_ctx, &tv->perf_public_ctx);
} }
} }
@ -521,13 +521,13 @@ static void *StatsWakeupThread(void *arg)
continue; continue;
} }
/* assuming the assignment of an int to be atomic, and even if it's SC_ATOMIC_SET(tv->perf_public_ctx.sync_now, true);
* not, it should be okay */
tv->perf_public_ctx.perf_flag = 1;
if (tv->inq != NULL) { if (tv->inq != NULL) {
PacketQueue *q = tv->inq->pq; PacketQueue *q = tv->inq->pq;
SCMutexLock(&q->mutex_q);
SCCondSignal(&q->cond_q); SCCondSignal(&q->cond_q);
SCMutexUnlock(&q->mutex_q);
} }
tv = tv->next; tv = tv->next;
@ -541,9 +541,7 @@ static void *StatsWakeupThread(void *arg)
continue; continue;
} }
/* assuming the assignment of an int to be atomic, and even if it's SC_ATOMIC_SET(tv->perf_public_ctx.sync_now, true);
* not, it should be okay */
tv->perf_public_ctx.perf_flag = 1;
tv = tv->next; tv = tv->next;
} }
@ -1256,7 +1254,7 @@ int StatsUpdateCounterArray(StatsPrivateThreadContext *pca, StatsPublicThreadCon
} }
SCMutexUnlock(&pctx->m); SCMutexUnlock(&pctx->m);
pctx->perf_flag = 0; SC_ATOMIC_SET(pctx->sync_now, false);
return 1; return 1;
} }

@ -63,7 +63,7 @@ typedef struct StatsCounter_ {
*/ */
typedef struct StatsPublicThreadContext_ { typedef struct StatsPublicThreadContext_ {
/* flag set by the wakeup thread, to inform the client threads to sync */ /* 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 */ /* pointer to the head of a list of counters assigned under this context */
StatsCounter *head; StatsCounter *head;

Loading…
Cancel
Save