From 799640f9066f14e806e36abff078053ab8b18172 Mon Sep 17 00:00:00 2001 From: Victor Julien Date: Sat, 23 May 2015 12:56:16 +0200 Subject: [PATCH] counters: make threadvars::perf_private_ctx static Update SCPerfGetAllCountersArray and add a UT workaround. --- src/counters.c | 101 +++++++++++++++++++++------------------------ src/counters.h | 12 +++--- src/detect.c | 2 +- src/threadvars.h | 2 +- src/tm-threads.c | 6 +-- src/unix-manager.c | 2 +- 6 files changed, 60 insertions(+), 65 deletions(-) diff --git a/src/counters.c b/src/counters.c index adf5660a69..c9e3075855 100644 --- a/src/counters.c +++ b/src/counters.c @@ -81,12 +81,11 @@ void SCPerfOutputCounters(ThreadVars *tv) */ void SCPerfCounterAddUI64(ThreadVars *tv, uint16_t id, uint64_t x) { - SCPerfPrivateContext *pca = tv->perf_private_ctx; - - if (!pca) { - SCLogDebug("counterarray is NULL"); + SCPerfPrivateContext *pca = &tv->perf_private_ctx; +#ifdef UNITTESTS + if (pca->initialized == 0) return; - } +#endif #ifdef DEBUG BUG_ON ((id < 1) || (id > pca->size)); #endif @@ -103,17 +102,14 @@ void SCPerfCounterAddUI64(ThreadVars *tv, uint16_t id, uint64_t x) */ void SCPerfCounterIncr(ThreadVars *tv, uint16_t id) { - SCPerfPrivateContext *pca = tv->perf_private_ctx; - - if (pca == NULL) { - SCLogDebug("counterarray is NULL"); + SCPerfPrivateContext *pca = &tv->perf_private_ctx; +#ifdef UNITTESTS + if (pca->initialized == 0) return; - } - +#endif #ifdef DEBUG BUG_ON ((id < 1) || (id > pca->size)); #endif - pca->head[id].ui64_cnt++; pca->head[id].syncs++; return; @@ -128,13 +124,11 @@ void SCPerfCounterIncr(ThreadVars *tv, uint16_t id) */ void SCPerfCounterSetUI64(ThreadVars *tv, uint16_t id, uint64_t x) { - SCPerfPrivateContext *pca = tv->perf_private_ctx; - - if (!pca) { - SCLogDebug("counterarray is NULL"); + SCPerfPrivateContext *pca = &tv->perf_private_ctx; +#ifdef UNITTESTS + if (pca->initialized == 0) return; - } - +#endif #ifdef DEBUG BUG_ON ((id < 1) || (id > pca->size)); #endif @@ -1153,35 +1147,30 @@ int SCPerfAddToClubbedTMTable(char *tm_name, SCPerfPublicContext *pctx) * * \retval a counter-array in this(s_id-e_id) range for this TM instance */ -SCPerfPrivateContext *SCPerfGetCounterArrayRange(uint16_t s_id, uint16_t e_id, - SCPerfPublicContext *pctx) +static int SCPerfGetCounterArrayRange(uint16_t s_id, uint16_t e_id, + SCPerfPublicContext *pctx, + SCPerfPrivateContext *pca) { SCPerfCounter *pc = NULL; - SCPerfPrivateContext *pca = NULL; uint32_t i = 0; - if (pctx == NULL) { - SCLogDebug("pctx is NULL"); - return NULL; + if (pctx == NULL || pca == NULL) { + SCLogDebug("pctx/pca is NULL"); + return -1; } if (s_id < 1 || e_id < 1 || s_id > e_id) { SCLogDebug("error with the counter ids"); - return NULL; + return -1; } if (e_id > pctx->curr_id) { SCLogDebug("end id is greater than the max id for this tv"); - return NULL; + return -1; } - if ( (pca = SCMalloc(sizeof(SCPerfPrivateContext))) == NULL) - return NULL; - memset(pca, 0, sizeof(SCPerfPrivateContext)); - if ( (pca->head = SCMalloc(sizeof(SCPCAElem) * (e_id - s_id + 2))) == NULL) { - SCFree(pca); - return NULL; + return -1; } memset(pca->head, 0, sizeof(SCPCAElem) * (e_id - s_id + 2)); @@ -1198,7 +1187,8 @@ SCPerfPrivateContext *SCPerfGetCounterArrayRange(uint16_t s_id, uint16_t e_id, } pca->size = i - 1; - return pca; + pca->initialized = 1; + return 0; } /** @@ -1210,13 +1200,12 @@ SCPerfPrivateContext *SCPerfGetCounterArrayRange(uint16_t s_id, uint16_t e_id, * \retval pca Pointer to a counter-array for all counter of this tm instance * on success; NULL on failure */ -SCPerfPrivateContext *SCPerfGetAllCountersArray(SCPerfPublicContext *pctx) +int SCPerfGetAllCountersArray(SCPerfPublicContext *pctx, SCPerfPrivateContext *private) { - SCPerfPrivateContext *pca = ((pctx)? - SCPerfGetCounterArrayRange(1, pctx->curr_id, pctx): - NULL); + if (pctx == NULL || private == NULL) + return -1; - return pca; + return SCPerfGetCounterArrayRange(1, pctx->curr_id, pctx, private); } /** @@ -1276,9 +1265,8 @@ int SCPerfUpdateCounterArray(SCPerfPrivateContext *pca, SCPerfPublicContext *pct */ uint64_t SCPerfGetLocalCounterValue(ThreadVars *tv, uint16_t id) { - SCPerfPrivateContext *pca = tv->perf_private_ctx; + SCPerfPrivateContext *pca = &tv->perf_private_ctx; #ifdef DEBUG - BUG_ON (pca == NULL); BUG_ON ((id < 1) || (id > pca->size)); #endif return pca->head[id].ui64_cnt; @@ -1322,10 +1310,11 @@ void SCPerfReleasePerfCounterS(SCPerfCounter *head) void SCPerfReleasePCA(SCPerfPrivateContext *pca) { if (pca != NULL) { - if (pca->head != NULL) + if (pca->head != NULL) { SCFree(pca->head); - - SCFree(pca); + pca->head = NULL; + } + pca->initialized = 0; } return; @@ -1398,9 +1387,8 @@ static int SCPerfTestGetCntArray05() return 0; } - tv.perf_private_ctx = SCPerfGetAllCountersArray(NULL); - - return (!tv.perf_private_ctx)?1:0; + int r = SCPerfGetAllCountersArray(NULL, &tv.perf_private_ctx); + return (r == -1) ? 1 : 0; } static int SCPerfTestGetCntArray06() @@ -1416,12 +1404,12 @@ static int SCPerfTestGetCntArray06() if (id != 1) return 0; - tv.perf_private_ctx = SCPerfGetAllCountersArray(&tv.perf_public_ctx); + int r = SCPerfGetAllCountersArray(&tv.perf_public_ctx, &tv.perf_private_ctx); - result = (tv.perf_private_ctx)?1:0; + result = (r == 0) ? 1 : 0; SCPerfReleasePerfCounterS(tv.perf_public_ctx.head); - SCPerfReleasePCA(tv.perf_private_ctx); + SCPerfReleasePCA(&tv.perf_private_ctx); return result; } @@ -1441,7 +1429,8 @@ static int SCPerfTestCntArraySize07() SCPerfRegisterCounter("t2", "c2", SC_PERF_TYPE_UINT64, NULL, &tv.perf_public_ctx); - pca = tv.perf_private_ctx = SCPerfGetAllCountersArray(&tv.perf_public_ctx); + SCPerfGetAllCountersArray(&tv.perf_public_ctx, &tv.perf_private_ctx); + pca = &tv.perf_private_ctx; SCPerfCounterIncr(&tv, 1); SCPerfCounterIncr(&tv, 2); @@ -1466,7 +1455,8 @@ static int SCPerfTestUpdateCounter08() id = SCPerfRegisterCounter("t1", "c1", SC_PERF_TYPE_UINT64, NULL, &tv.perf_public_ctx); - pca = tv.perf_private_ctx = SCPerfGetAllCountersArray(&tv.perf_public_ctx); + SCPerfGetAllCountersArray(&tv.perf_public_ctx, &tv.perf_private_ctx); + pca = &tv.perf_private_ctx; SCPerfCounterIncr(&tv, id); SCPerfCounterAddUI64(&tv, id, 100); @@ -1499,7 +1489,8 @@ static int SCPerfTestUpdateCounter09() id2 = SCPerfRegisterCounter("t5", "c5", SC_PERF_TYPE_UINT64, NULL, &tv.perf_public_ctx); - pca = tv.perf_private_ctx = SCPerfGetAllCountersArray(&tv.perf_public_ctx); + SCPerfGetAllCountersArray(&tv.perf_public_ctx, &tv.perf_private_ctx); + pca = &tv.perf_private_ctx; SCPerfCounterIncr(&tv, id2); SCPerfCounterAddUI64(&tv, id2, 100); @@ -1529,7 +1520,8 @@ static int SCPerfTestUpdateGlobalCounter10() id3 = SCPerfRegisterCounter("t3", "c3", SC_PERF_TYPE_UINT64, NULL, &tv.perf_public_ctx); - pca = tv.perf_private_ctx = SCPerfGetAllCountersArray(&tv.perf_public_ctx); + SCPerfGetAllCountersArray(&tv.perf_public_ctx, &tv.perf_private_ctx); + pca = &tv.perf_private_ctx; SCPerfCounterIncr(&tv, id1); SCPerfCounterAddUI64(&tv, id2, 100); @@ -1567,7 +1559,8 @@ static int SCPerfTestCounterValues11() id4 = SCPerfRegisterCounter("t4", "c4", SC_PERF_TYPE_UINT64, NULL, &tv.perf_public_ctx); - pca = tv.perf_private_ctx = SCPerfGetAllCountersArray(&tv.perf_public_ctx); + SCPerfGetAllCountersArray(&tv.perf_public_ctx, &tv.perf_private_ctx); + pca = &tv.perf_private_ctx; SCPerfCounterIncr(&tv, id1); SCPerfCounterAddUI64(&tv, id2, 256); diff --git a/src/counters.h b/src/counters.h index de8780b4d7..e930019a05 100644 --- a/src/counters.h +++ b/src/counters.h @@ -121,6 +121,8 @@ typedef struct SCPerfPrivateContext_ { /* no of PCAElems in head */ uint32_t size; + + int initialized; } SCPerfPrivateContext; /** @@ -160,8 +162,7 @@ uint16_t SCPerfRegisterMaxCounter(char *, char *, int, char *, SCPerfPublicConte /* utility functions */ int SCPerfAddToClubbedTMTable(char *, SCPerfPublicContext *); -SCPerfPrivateContext *SCPerfGetCounterArrayRange(uint16_t, uint16_t, SCPerfPublicContext *); -SCPerfPrivateContext * SCPerfGetAllCountersArray(SCPerfPublicContext *); +int SCPerfGetAllCountersArray(SCPerfPublicContext *, SCPerfPrivateContext *); int SCPerfUpdateCounterArray(SCPerfPrivateContext *, SCPerfPublicContext *); uint64_t SCPerfGetLocalCounterValue(struct ThreadVars_ *, uint16_t); @@ -180,12 +181,13 @@ void SCPerfRegisterTests(void); void SCPerfCounterAddUI64(struct ThreadVars_ *, uint16_t, uint64_t); #define SCPerfSyncCounters(tv) \ - SCPerfUpdateCounterArray((tv)->perf_private_ctx, &(tv)->perf_public_ctx); \ + SCPerfUpdateCounterArray(&(tv)->perf_private_ctx, &(tv)->perf_public_ctx); \ #define SCPerfSyncCountersIfSignalled(tv) \ do { \ - if ((tv)->perf_public_ctx.perf_flag == 1) { \ - SCPerfUpdateCounterArray((tv)->perf_private_ctx, &(tv)->perf_public_ctx); \ + if ((tv)->perf_public_ctx.perf_flag == 1) { \ + SCPerfUpdateCounterArray(&(tv)->perf_private_ctx, \ + &(tv)->perf_public_ctx); \ } \ } while (0) diff --git a/src/detect.c b/src/detect.c index 3d51866e07..6823ed9125 100644 --- a/src/detect.c +++ b/src/detect.c @@ -11263,7 +11263,7 @@ static int SigTestDetectAlertCounter(void) DetectEngineThreadCtxInit(&tv, de_ctx, (void *)&det_ctx); /* init counters */ - tv.perf_private_ctx = SCPerfGetAllCountersArray(&tv.perf_public_ctx); + SCPerfGetAllCountersArray(&tv.perf_public_ctx, &tv.perf_private_ctx); SCPerfAddToClubbedTMTable((tv.thread_group_name != NULL) ? tv.thread_group_name : tv.name, &tv.perf_public_ctx); diff --git a/src/threadvars.h b/src/threadvars.h index 0148359133..b5702cfc70 100644 --- a/src/threadvars.h +++ b/src/threadvars.h @@ -107,7 +107,7 @@ typedef struct ThreadVars_ { SCPerfPublicContext perf_public_ctx; /** private counter store: counter updates modify this */ - SCPerfPrivateContext *perf_private_ctx; + SCPerfPrivateContext perf_private_ctx; SCCtrlMutex *ctrl_mutex; SCCtrlCondT *ctrl_cond; diff --git a/src/tm-threads.c b/src/tm-threads.c index 50ec19fbf0..32076874e3 100644 --- a/src/tm-threads.c +++ b/src/tm-threads.c @@ -322,7 +322,7 @@ void *TmThreadsSlotPktAcqLoop(void *td) } } - tv->perf_private_ctx = SCPerfGetAllCountersArray(&tv->perf_public_ctx); + SCPerfGetAllCountersArray(&tv->perf_public_ctx, &tv->perf_private_ctx); SCPerfAddToClubbedTMTable((tv->thread_group_name != NULL) ? tv->thread_group_name : tv->name, &tv->perf_public_ctx); @@ -455,7 +455,7 @@ void *TmThreadsSlotVar(void *td) } } - tv->perf_private_ctx = SCPerfGetAllCountersArray(&tv->perf_public_ctx); + SCPerfGetAllCountersArray(&tv->perf_public_ctx, &tv->perf_private_ctx); SCPerfAddToClubbedTMTable((tv->thread_group_name != NULL) ? tv->thread_group_name : tv->name, &tv->perf_public_ctx); @@ -597,7 +597,7 @@ static void *TmThreadsManagement(void *td) memset(&s->slot_pre_pq, 0, sizeof(PacketQueue)); memset(&s->slot_post_pq, 0, sizeof(PacketQueue)); - tv->perf_private_ctx = SCPerfGetAllCountersArray(&tv->perf_public_ctx); + SCPerfGetAllCountersArray(&tv->perf_public_ctx, &tv->perf_private_ctx); SCPerfAddToClubbedTMTable((tv->thread_group_name != NULL) ? tv->thread_group_name : tv->name, &tv->perf_public_ctx); diff --git a/src/unix-manager.c b/src/unix-manager.c index ce6ae64fe0..266f78a305 100644 --- a/src/unix-manager.c +++ b/src/unix-manager.c @@ -868,7 +868,7 @@ static TmEcode UnixManager(ThreadVars *th_v, void *thread_data) /* set the thread name */ SCLogDebug("%s started...", th_v->name); - th_v->perf_private_ctx = SCPerfGetAllCountersArray(&th_v->perf_public_ctx); + SCPerfGetAllCountersArray(&th_v->perf_public_ctx, &th_v->perf_private_ctx); SCPerfAddToClubbedTMTable(th_v->name, &th_v->perf_public_ctx); if (UnixNew(&command) == 0) {