]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
counters: make threadvars::perf_private_ctx static
authorVictor Julien <victor@inliniac.net>
Sat, 23 May 2015 10:56:16 +0000 (12:56 +0200)
committerVictor Julien <victor@inliniac.net>
Tue, 26 May 2015 15:56:32 +0000 (17:56 +0200)
Update SCPerfGetAllCountersArray and add a UT workaround.

src/counters.c
src/counters.h
src/detect.c
src/threadvars.h
src/tm-threads.c
src/unix-manager.c

index adf5660a69d0ce4f78496ef29ab5ef4c4c7debea..c9e30758555050c9f105f4e4c7dedb7479d794a4 100644 (file)
@@ -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);
index de8780b4d7a2ba6dccc8866a94ee0d08ff36e977..e930019a05814ff0491271684ba364c94ae574d1 100644 (file)
@@ -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)
 
index 3d51866e07b6db3dbcec38bf33e046ce3cf1c60f..6823ed91253844ff494047f579331682641fcbc6 100644 (file)
@@ -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);
 
index 0148359133af447ead29ae885de4aac392e13935..b5702cfc70a3b4dcaf56ca4530e8dba494776023 100644 (file)
@@ -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;
index 50ec19fbf06d1af9142b4d5373b709483fe15960..32076874e3122d35c0c3c910b92e42ea7c372b6c 100644 (file)
@@ -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);
 
index ce6ae64fe05365bef8056bfb51e085d93258bf7b..266f78a305f3a92b9617040e0194447b164d3aa6 100644 (file)
@@ -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) {