]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
counters: call global counters funcs
authorVictor Julien <victor@inliniac.net>
Mon, 25 May 2015 09:42:41 +0000 (11:42 +0200)
committerVictor Julien <victor@inliniac.net>
Tue, 26 May 2015 20:05:45 +0000 (22:05 +0200)
src/counters.c

index ad11c3c7af12cdbb633338fa843be0edf1039eaa..8304eb4034f4ff55cba8aafea08944917afdfd28 100644 (file)
@@ -99,6 +99,7 @@ static uint32_t sc_counter_tts = SC_PERF_MGMTT_TTS;
 static char sc_counter_enabled = TRUE;
 
 static int SCPerfOutputCounterFileIface(ThreadVars *tv);
+static int StatsThreadRegister(const char *thread_name, SCPerfPublicContext *);
 
 /** stats table is filled each interval and passed to the
  *  loggers. Initialized at first use. */
@@ -509,8 +510,8 @@ static uint16_t SCPerfRegisterQualifiedCounter(char *cname, char *tm_name,
     SCPerfCounter *prev = NULL;
     SCPerfCounter *pc = NULL;
 
-    if (cname == NULL || tm_name == NULL || pctx == NULL) {
-        SCLogDebug("Counter name, tm name null or SCPerfPublicContext NULL");
+    if (cname == NULL || pctx == NULL) {
+        SCLogDebug("Counter name, SCPerfPublicContext NULL");
         return 0;
     }
 
@@ -550,6 +551,7 @@ static uint16_t SCPerfRegisterQualifiedCounter(char *cname, char *tm_name,
     pc->id = ++(pctx->curr_id);
 
     pc->type = type_q;
+    pc->Func = Func;
 
     /* we now add the counter to the list */
     if (prev == NULL)
@@ -605,6 +607,8 @@ static int SCPerfOutputCounterFileIface(ThreadVars *tv)
     void *td = stats_thread_data;
 
     if (stats_table.nstats == 0) {
+        StatsThreadRegister("Globals", &sc_perf_op_ctx->global_counter_ctx);
+
         uint32_t nstats = counters_global_id;
 
         stats_table.nstats = nstats;
@@ -629,6 +633,9 @@ static int SCPerfOutputCounterFileIface(ThreadVars *tv)
            counters_global_id * sizeof(struct CountersMergeTable));
 
     StatsRecord *table = stats_table.stats;
+
+    /* Loop through the thread counter stores. The global counters
+     * are in a separate store inside this list. */
     pctmi = sc_perf_op_ctx->pctmi;
     SCLogDebug("pctmi %p", pctmi);
     while (pctmi != NULL) {
@@ -646,15 +653,21 @@ static int SCPerfOutputCounterFileIface(ThreadVars *tv)
                 case STATS_TYPE_MAXIMUM:
                     if (pc->value > merge_table[pc->gid].value)
                         merge_table[pc->gid].value = pc->value;
+                    table[pc->gid].tm_name = "Total";
+                    break;
+                case STATS_TYPE_FUNC:
+                    if (pc->Func != NULL)
+                        merge_table[pc->gid].value = pc->Func();
+                    table[pc->gid].tm_name = "Global";
                     break;
                 default:
                     merge_table[pc->gid].value += pc->value;
+                    table[pc->gid].tm_name = "Total";
                     break;
             }
             merge_table[pc->gid].updates += pc->updates;
 
             table[pc->gid].name = pc->cname;
-            table[pc->gid].tm_name = pctmi->tm_name;
 
             pc = pc->next;
         }
@@ -938,6 +951,12 @@ uint16_t SCPerfTVRegisterMaxCounter(char *cname, struct ThreadVars_ *tv,
  */
 uint16_t SCPerfTVRegisterGlobalCounter(char *cname, uint64_t (*Func)(void))
 {
+#ifdef UNITTESTS
+    if (sc_perf_op_ctx == NULL)
+        return 0;
+#else
+    BUG_ON(sc_perf_op_ctx == NULL);
+#endif
     uint16_t id = SCPerfRegisterQualifiedCounter(cname, NULL,
                                                  SC_PERF_TYPE_UINT64,
                                                  &(sc_perf_op_ctx->global_counter_ctx),
@@ -1082,7 +1101,7 @@ static int StatsThreadRegister(const char *thread_name, SCPerfPublicContext *pct
 
     temp->next = sc_perf_op_ctx->pctmi;
     sc_perf_op_ctx->pctmi = temp;
-    SCLogInfo("sc_perf_op_ctx->pctmi %p", sc_perf_op_ctx->pctmi);
+    SCLogDebug("sc_perf_op_ctx->pctmi %p", sc_perf_op_ctx->pctmi);
 
     SCMutexUnlock(&sc_perf_op_ctx->pctmi_lock);
     return 1;