counters: make threadvars::perf_private_ctx static

Update SCPerfGetAllCountersArray and add a UT workaround.
pull/1508/head
Victor Julien 11 years ago
parent 55cfab89e4
commit 799640f906

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

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

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

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

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

@ -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) {

Loading…
Cancel
Save