} DetectLoaderControl;
#define NLOADERS 4
-static DetectLoaderControl loaders[NLOADERS];
+static DetectLoaderControl *loaders = NULL;
static int cur_loader = 0;
void TmThreadWakeupDetectLoaderThreads(void);
+static int num_loaders = NLOADERS;
/** \param loader -1 for auto select
* \retval loader_id or negative in case of error */
if (loader_id == -1) {
loader_id = cur_loader;
cur_loader++;
- if (cur_loader >= NLOADERS)
+ if (cur_loader >= num_loaders)
cur_loader = 0;
}
- if (loader_id >= NLOADERS || loader_id < 0) {
+ if (loader_id >= num_loaders || loader_id < 0) {
return -ERANGE;
}
SCLogDebug("waiting");
int errors = 0;
int i;
- for (i = 0; i < NLOADERS; i++) {
+ for (i = 0; i < num_loaders; i++) {
int done = 0;
DetectLoaderControl *loader = &loaders[i];
while (!done) {
void DetectLoadersInit(void)
{
+ intmax_t setting = NLOADERS;
+ (void)ConfGetInt("multi-detect.loaders", &setting);
+
+ if (setting < 1 || setting > 1024) {
+ SCLogError(SC_ERR_INVALID_ARGUMENTS,
+ "invalid multi-detect.loaders setting %"PRIdMAX, setting);
+ exit(EXIT_FAILURE);
+ }
+ num_loaders = (int32_t)setting;
+
+ SCLogInfo("using %d detect loader threads", num_loaders);
+
+ BUG_ON(loaders != NULL);
+ loaders = SCCalloc(num_loaders, sizeof(DetectLoaderControl));
+ BUG_ON(loaders == NULL);
+
int i;
- for (i = 0; i < NLOADERS; i++) {
+ for (i = 0; i < num_loaders; i++) {
DetectLoaderInit(&loaders[i]);
}
}
/** \brief spawn the detect loader manager thread */
void DetectLoaderThreadSpawn()
{
- uint32_t u;
- for (u = 0; u < NLOADERS; u++) {
+ int i;
+ for (i = 0; i < num_loaders; i++) {
ThreadVars *tv_loader = NULL;
char name[32] = "";
- snprintf(name, sizeof(name), "DetectLoader%02u", u+1);
+ snprintf(name, sizeof(name), "DetectLoader%02d", i+1);
tv_loader = TmThreadCreateCmdThreadByName("DetectLoader",
"DetectLoader", 1);