Bug #382 » 0001-Flow-use-condition-system-instead-of-short-sleep.patch
src/flow-hash.c | ||
---|---|---|
#include "flow-hash.h"
|
||
#include "flow-util.h"
|
||
#include "flow-private.h"
|
||
#include "flow-manager.h"
|
||
#include "app-layer-parser.h"
|
||
#include "util-time.h"
|
||
... | ... | |
static Flow *FlowGetNew(Packet *p) {
|
||
Flow *f = NULL;
|
||
if (FlowCreateCheck(p) == 0) {
|
||
return NULL;
|
||
}
|
||
... | ... | |
/* flow has been recycled before it went into the spare queue */
|
||
/* flow is initialized (recylced) but *unlocked* */
|
||
/* Important event for flow system, let's ask for a refresh to flow
|
||
manager */
|
||
SCCondSignal(&flow_manager_cond);
|
||
}
|
||
FlowIncrUsecnt(f);
|
src/flow-manager.c | ||
---|---|---|
/* Run mode selected at suricata.c */
|
||
extern int run_mode;
|
||
#define FLOW_UPDATE_DELAY 2
|
||
#define NEW_FLOW_COUNT_COND 10
|
||
/**
|
||
* \brief Used to kill flow manager thread(s).
|
||
*
|
||
... | ... | |
ThreadVars *tv = NULL;
|
||
int cnt = 0;
|
||
SCCondSignal(&flow_manager_cond);
|
||
SCMutexLock(&tv_root_lock);
|
||
/* flow manager thread(s) is/are a part of mgmt threads */
|
||
... | ... | |
int emerg = FALSE;
|
||
int prev_emerg = FALSE;
|
||
uint32_t last_sec = 0;
|
||
struct timespec cond_time;
|
||
int counter = 0;
|
||
uint16_t flow_mgr_closing_cnt = SCPerfTVRegisterCounter("flow_mgr.closed_pruned", th_v,
|
||
SC_PERF_TYPE_UINT64,
|
||
... | ... | |
{
|
||
TmThreadTestThreadUnPaused(th_v);
|
||
if (sleeping >= 100 || flow_flags & FLOW_EMERGENCY)
|
||
{
|
||
if ((counter > NEW_FLOW_COUNT_COND) || (flow_flags & FLOW_EMERGENCY)) {
|
||
counter = 0;
|
||
if (flow_flags & FLOW_EMERGENCY) {
|
||
emerg = TRUE;
|
||
... | ... | |
SCMutexUnlock(&flow_spare_q.mutex_q);
|
||
SCLogDebug("flow_sparse_q.len = %"PRIu32" prealloc: %"PRIu32
|
||
"flow_spare_q status: %"PRIu32"%% flows at the queue",
|
||
len, flow_config.prealloc, len * 100 / flow_config.prealloc);
|
||
"flow_spare_q status: %"PRIu32"%% flows at the queue",
|
||
len, flow_config.prealloc, len * 100 / flow_config.prealloc);
|
||
/* only if we have pruned this "emergency_recovery" percentage
|
||
* of flows, we will unset the emergency bit */
|
||
if (len * 100 / flow_config.prealloc > flow_config.emergency_recovery) {
|
||
... | ... | |
emerg = FALSE;
|
||
prev_emerg = FALSE;
|
||
SCLogInfo("Flow emergency mode over, back to normal... unsetting"
|
||
" FLOW_EMERGENCY bit (ts.tv_sec: %"PRIuMAX", "
|
||
"ts.tv_usec:%"PRIuMAX") flow_spare_q status(): %"PRIu32
|
||
"%% flows at the queue", (uintmax_t)ts.tv_sec,
|
||
(uintmax_t)ts.tv_usec, len * 100 / flow_config.prealloc);
|
||
" FLOW_EMERGENCY bit (ts.tv_sec: %"PRIuMAX", "
|
||
"ts.tv_usec:%"PRIuMAX") flow_spare_q status(): %"PRIu32
|
||
"%% flows at the queue", (uintmax_t)ts.tv_sec,
|
||
(uintmax_t)ts.tv_usec, len * 100 / flow_config.prealloc);
|
||
SCPerfCounterIncr(flow_emerg_mode_over, th_v->sc_perf_pca);
|
||
}
|
||
... | ... | |
break;
|
||
}
|
||
#if 0
|
||
if (run_mode != RUNMODE_PCAP_FILE) {
|
||
usleep(10);
|
||
sleeping += 10;
|
||
#endif
|
||
cond_time.tv_sec = time(NULL) + FLOW_UPDATE_DELAY;
|
||
cond_time.tv_nsec = 0;
|
||
SCMutexLock(&flow_manager_mutex);
|
||
if (SCCondTimedwait(&flow_manager_cond, &flow_manager_mutex, &cond_time) == ETIMEDOUT) {
|
||
counter = NEW_FLOW_COUNT_COND;
|
||
}
|
||
counter++;
|
||
SCMutexUnlock(&flow_manager_mutex);
|
||
#if 0
|
||
} else {
|
||
/* If we are reading a pcap, how long the pcap timestamps
|
||
* says that has passed */
|
||
... | ... | |
usleep(1);
|
||
}
|
||
}
|
||
#endif
|
||
SCPerfSyncCountersIfSignalled(th_v, 0);
|
||
}
|
||
... | ... | |
{
|
||
ThreadVars *tv_flowmgr = NULL;
|
||
SCCondInit(&flow_manager_cond, &flow_manager_mutex);
|
||
tv_flowmgr = TmThreadCreateMgmtThread("FlowManagerThread",
|
||
FlowManagerThread, 0);
|
||
src/flow-manager.h | ||
---|---|---|
#ifndef __FLOW_MANAGER_H__
|
||
#define __FLOW_MANAGER_H__
|
||
SCCondT flow_manager_cond;
|
||
SCMutex flow_manager_mutex;
|
||
void FlowManagerThreadSpawn(void);
|
||
void FlowKillFlowManagerThread(void);
|
||
src/flow-util.c | ||
---|---|---|
return FLOW_PROTO_UDP;
|
||
case IPPROTO_ICMP:
|
||
return FLOW_PROTO_ICMP;
|
||
case IPPROTO_SCTP:
|
||
case IPPROTO_SCTP:
|
||
return FLOW_PROTO_SCTP;
|
||
default:
|
||
return FLOW_PROTO_DEFAULT;
|
- « Previous
- 1
- 2
- Next »