Skip to content

Commit

Permalink
stats: improve sync signalling
Browse files Browse the repository at this point in the history
Make syncs more reliable by using a atomic "sync now" variable and
signalling the conditions under lock.

Ticket: #6569.
  • Loading branch information
victorjulien committed Nov 24, 2023
1 parent 74bc27e commit d005fff
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 10 deletions.
16 changes: 7 additions & 9 deletions src/counters.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
}
}
Expand Down Expand Up @@ -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;
Expand All @@ -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;
}
Expand Down Expand Up @@ -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;
}

Expand Down
2 changes: 1 addition & 1 deletion src/counters.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit d005fff

Please sign in to comment.