dns_config.state_memcap = value;
}
-SC_ATOMIC_DECLARE(uint64_t, dns_memuse);
+SC_ATOMIC_DECLARE(uint64_t, dns_memuse); /**< byte counter of current memuse */
+SC_ATOMIC_DECLARE(uint64_t, dns_memcap_state); /**< counts number of 'rejects' */
+SC_ATOMIC_DECLARE(uint64_t, dns_memcap_global); /**< counts number of 'rejects' */
+
void DNSConfigSetGlobalMemcap(uint64_t value) {
dns_config.global_memcap = value;
+
SC_ATOMIC_INIT(dns_memuse);
+ SC_ATOMIC_INIT(dns_memcap_state);
+ SC_ATOMIC_INIT(dns_memcap_global);
}
void DNSIncrMemcap(uint32_t size, DNSState *state) {
int DNSCheckMemcap(uint32_t want, DNSState *state) {
if (state != NULL) {
- if (state->memuse + want > dns_config.state_memcap)
+ if (state->memuse + want > dns_config.state_memcap) {
+ SC_ATOMIC_ADD(dns_memcap_state, 1);
return -1;
+ }
}
- if (SC_ATOMIC_GET(dns_memuse) + (uint64_t)want > dns_config.global_memcap)
+ if (SC_ATOMIC_GET(dns_memuse) + (uint64_t)want > dns_config.global_memcap) {
+ SC_ATOMIC_ADD(dns_memcap_global, 1);
return -2;
+ }
return 0;
}
/* App layer parser thread context, from AppLayerParserThreadCtxAlloc(). */
AppLayerParserThreadCtx *alp_tctx;
+ uint16_t counter_dns_memuse;
+ uint16_t counter_dns_memcap_state;
+ uint16_t counter_dns_memcap_global;
+
#ifdef PROFILING
uint64_t ticks_start;
uint64_t ticks_end;
if ((app_tctx->alp_tctx = AppLayerParserThreadCtxAlloc()) == NULL)
goto error;
+ /* tv is allowed to be NULL in unittests */
+ if (tv != NULL) {
+ app_tctx->counter_dns_memuse = SCPerfTVRegisterCounter("dns.memuse", tv,
+ SC_PERF_TYPE_UINT64, "NULL");
+ app_tctx->counter_dns_memcap_state = SCPerfTVRegisterCounter("dns.memcap_state", tv,
+ SC_PERF_TYPE_UINT64, "NULL");
+ app_tctx->counter_dns_memcap_global = SCPerfTVRegisterCounter("dns.memcap_global", tv,
+ SC_PERF_TYPE_UINT64, "NULL");
+ }
+
goto done;
error:
AppLayerDestroyCtxThread(app_tctx);