counters: call global counters funcs

pull/1508/head
Victor Julien 11 years ago
parent 33756abd87
commit 60c5ad4649

@ -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;

Loading…
Cancel
Save