f = FlowDequeue(&flow_spare_q);
if (f == NULL) {
/* If we reached the max memcap, we get a used flow */
- if ((SC_ATOMIC_GET(flow_memuse) + sizeof(Flow)) > flow_config.memcap) {
+ if (!(FLOW_CHECK_MEMCAP(sizeof(Flow)))) {
/* declare state of emergency */
if (!(SC_ATOMIC_GET(flow_flags) & FLOW_EMERGENCY)) {
SC_ATOMIC_OR(flow_flags, FLOW_EMERGENCY);
UTHBuildPacketOfFlows(ini, end, 0);
/* And now let's try to reach the memcap val */
- while (SC_ATOMIC_GET(flow_memuse) + sizeof(Flow) < flow_config.memcap) {
+ while (FLOW_CHECK_MEMCAP(sizeof(Flow))) {
ini = end + 1;
end = end + 2;
UTHBuildPacketOfFlows(ini, end, 0);
{
Flow *f;
- if ((SC_ATOMIC_GET(flow_memuse) + sizeof(Flow)) > flow_config.memcap) {
+ if (!(FLOW_CHECK_MEMCAP(sizeof(Flow)))) {
return NULL;
}
(f)->tag_list = NULL; \
} while(0)
+/** \brief check if a memory alloc would fit in the memcap
+ *
+ * \param size memory allocation size to check
+ *
+ * \retval 1 it fits
+ * \retval 0 no fit
+ */
+#define FLOW_CHECK_MEMCAP(size) \
+ ((((uint64_t)SC_ATOMIC_GET(flow_memuse) + (uint64_t)(size)) <= flow_config.memcap))
+
Flow *FlowAlloc(void);
Flow *FlowAllocDirect(void);
void FlowFree(Flow *);
/* pre allocate flows */
for (i = 0; i < flow_config.prealloc; i++) {
- if ((SC_ATOMIC_GET(flow_memuse) + sizeof(Flow)) > flow_config.memcap) {
- printf("ERROR: FlowAlloc failed (max flow memcap reached): %s\n", strerror(errno));
- exit(1);
+ if (!(FLOW_CHECK_MEMCAP(sizeof(Flow)))) {
+ SCLogError(SC_ERR_FLOW_INIT, "preallocating flows failed: "
+ "max flow memcap reached. Memcap %"PRIu64", "
+ "Memuse %"PRIu64".", flow_config.memcap,
+ ((uint64_t)SC_ATOMIC_GET(flow_memuse) + (uint64_t)sizeof(Flow)));
+ exit(EXIT_FAILURE);
}
Flow *f = FlowAlloc();
if (f == NULL) {
- printf("ERROR: FlowAlloc failed: %s\n", strerror(errno));
- exit(1);
+ SCLogError(SC_ERR_FLOW_INIT, "preallocating flow failed: %s", strerror(errno));
+ exit(EXIT_FAILURE);
}
+
FlowEnqueue(&flow_spare_q,f);
}
UTHBuildPacketOfFlows(ini, end, 0);
/* And now let's try to reach the memcap val */
- while (SC_ATOMIC_GET(flow_memuse) + sizeof(Flow) < flow_config.memcap) {
+ while (FLOW_CHECK_MEMCAP(sizeof(Flow))) {
ini = end + 1;
end = end + 2;
UTHBuildPacketOfFlows(ini, end, 0);
UTHBuildPacketOfFlows(ini, end, 0);
/* And now let's try to reach the memcap val */
- while (SC_ATOMIC_GET(flow_memuse) + sizeof(Flow) < flow_config.memcap) {
+ while (FLOW_CHECK_MEMCAP(sizeof(Flow))) {
ini = end + 1;
end = end + 2;
UTHBuildPacketOfFlows(ini, end, 0);
UTHBuildPacketOfFlows(ini, end, 0);
/* And now let's try to reach the memcap val */
- while (SC_ATOMIC_GET(flow_memuse) + sizeof(Flow) < flow_config.memcap) {
+ while (FLOW_CHECK_MEMCAP(sizeof(Flow))) {
ini = end + 1;
end = end + 2;
UTHBuildPacketOfFlows(ini, end, 0);
}
Host *HostAlloc(void) {
- if ((SC_ATOMIC_GET(host_memuse) + sizeof(Host)) > host_config.memcap) {
+ if (!(HOST_CHECK_MEMCAP(sizeof(Host)))) {
return NULL;
}
memset(&host_config, 0, sizeof(host_config));
//SC_ATOMIC_INIT(flow_flags);
+ SC_ATOMIC_INIT(host_counter);
SC_ATOMIC_INIT(host_memuse);
SC_ATOMIC_INIT(host_prune_idx);
HostQueueInit(&host_spare_q);
/* pre allocate hosts */
for (i = 0; i < host_config.prealloc; i++) {
- if ((SC_ATOMIC_GET(host_memuse) + sizeof(Host)) > host_config.memcap) {
- printf("ERROR: HostAlloc failed (max host memcap reached): %s\n", strerror(errno));
- exit(1);
+ if (!(HOST_CHECK_MEMCAP(sizeof(Host)))) {
+ SCLogError(SC_ERR_HOST_INIT, "preallocating hosts failed: "
+ "max host memcap reached. Memcap %"PRIu64", "
+ "Memuse %"PRIu64".", host_config.memcap,
+ ((uint64_t)SC_ATOMIC_GET(host_memuse) + (uint64_t)sizeof(Host)));
+ exit(EXIT_FAILURE);
}
Host *h = HostAlloc();
if (h == NULL) {
- printf("ERROR: HostAlloc failed: %s\n", strerror(errno));
- exit(1);
+ SCLogError(SC_ERR_HOST_INIT, "preallocating host failed: %s", strerror(errno));
+ exit(EXIT_FAILURE);
}
HostEnqueue(&host_spare_q,h);
}
SC_ATOMIC_DESTROY(host_prune_idx);
SC_ATOMIC_DESTROY(host_memuse);
+ SC_ATOMIC_DESTROY(host_counter);
//SC_ATOMIC_DESTROY(flow_flags);
return;
}
h = HostDequeue(&host_spare_q);
if (h == NULL) {
/* If we reached the max memcap, we get a used host */
- if ((SC_ATOMIC_GET(host_memuse) + sizeof(Host)) > host_config.memcap) {
+ if (!(HOST_CHECK_MEMCAP(sizeof(Host)))) {
/* declare state of emergency */
//if (!(SC_ATOMIC_GET(host_flags) & HOST_EMERGENCY)) {
// SC_ATOMIC_OR(host_flags, HOST_EMERGENCY);
(h)->use_cnt--
void HostInit(Host *h, Address *a) {
-// SCMutexLock(&h->m);
COPY_ADDRESS(a, &h->a);
HostIncrUsecnt(h);
}
uint32_t prealloc;
} HostConfig;
+/** \brief check if a memory alloc would fit in the memcap
+ *
+ * \param size memory allocation size to check
+ *
+ * \retval 1 it fits
+ * \retval 0 no fit
+ */
+#define HOST_CHECK_MEMCAP(size) \
+ ((((uint64_t)SC_ATOMIC_GET(host_memuse) + (uint64_t)(size)) <= host_config.memcap))
+
HostConfig host_config;
SC_ATOMIC_DECLARE(unsigned long long int,host_memuse);
SC_ATOMIC_DECLARE(unsigned int,host_counter);
CASE_CODE (SC_WARN_OUTDATED_LIBHTP);
CASE_CODE (SC_WARN_DEPRECATED);
CASE_CODE (SC_WARN_PROFILE);
+ CASE_CODE (SC_ERR_FLOW_INIT);
+ CASE_CODE (SC_ERR_HOST_INIT);
default:
return "UNKNOWN_ERROR";
SC_WARN_OUTDATED_LIBHTP,
SC_WARN_DEPRECATED,
SC_WARN_PROFILE,
+ SC_ERR_FLOW_INIT,
+ SC_ERR_HOST_INIT,
} SCError;
const char *SCErrorToString(SCError);