det_ctx->tv = tv;
det_ctx->de_ctx = DetectEngineGetCurrent();
if (det_ctx->de_ctx == NULL) {
+#ifdef UNITTESTS
+ if (RunmodeIsUnittests()) {
+ det_ctx->de_ctx = (DetectEngineCtx *)initdata;
+ } else {
+ DetectEngineThreadCtxDeinit(tv, det_ctx);
+ return TM_ECODE_FAILED;
+ }
+#else
DetectEngineThreadCtxDeinit(tv, det_ctx);
return TM_ECODE_FAILED;
+#endif
}
if (ThreadCtxDoInit(det_ctx->de_ctx, det_ctx) != TM_ECODE_OK) {
}
DetectEngineThreadCtxDeinitKeywords(det_ctx->de_ctx, det_ctx);
+#ifdef UNITTESTS
+ if (!RunmodeIsUnittests() || det_ctx->de_ctx->ref_cnt > 0)
+ DetectEngineDeReference(&det_ctx->de_ctx);
+#else
DetectEngineDeReference(&det_ctx->de_ctx);
+#endif
SCFree(det_ctx);
return TM_ECODE_OK;
}
SigGroupBuild(de_ctx);
- DetectEngineThreadCtxInit(&th_v, (void *)de_ctx, (void *)&det_ctx);
+ DetectEngineAddToMaster(de_ctx);
+ DetectEngineThreadCtxInit(&th_v, NULL, (void *)&det_ctx);
SigMatchSignatures(&th_v, de_ctx, det_ctx, p);
+ DetectEngineMoveToFreeList(de_ctx);
if (PacketAlertCheck(p, sid) != 1) {
SCLogDebug("replace: no alert on sig %d", sid);
end:
if (dtv.app_tctx != NULL)
AppLayerDestroyCtxThread(dtv.app_tctx);
- if (de_ctx != NULL)
- {
- SigGroupCleanup(de_ctx);
- SigCleanSignatures(de_ctx);
- if (det_ctx != NULL)
- DetectEngineThreadCtxDeinit(&th_v, (void *)det_ctx);
- DetectEngineCtxFree(de_ctx);
- }
+ if (det_ctx != NULL)
+ DetectEngineThreadCtxDeinit(&th_v, (void *)det_ctx);
+ DetectEnginePruneFreeList();
PACKET_RECYCLE(p);
FlowShutdown();
SCFree(p);