diff --git a/src/detect-engine-loader.c b/src/detect-engine-loader.c index 1f5363c6f8..9073c1e9c2 100644 --- a/src/detect-engine-loader.c +++ b/src/detect-engine-loader.c @@ -469,6 +469,12 @@ int DetectLoadersSync(void) done = true; } SCMutexUnlock(&loader->m); + if (!done) { + /* nudge thread in case it's sleeping */ + SCCtrlMutexLock(loader->tv->ctrl_mutex); + pthread_cond_broadcast(loader->tv->ctrl_cond); + SCCtrlMutexUnlock(loader->tv->ctrl_mutex); + } } SCMutexLock(&loader->m); if (loader->result != 0) { @@ -524,7 +530,9 @@ static void TmThreadWakeupDetectLoaderThreads(void) while (tv != NULL) { if (strncmp(tv->name,"DL#",3) == 0) { BUG_ON(tv->ctrl_cond == NULL); + SCCtrlMutexLock(tv->ctrl_mutex); pthread_cond_broadcast(tv->ctrl_cond); + SCCtrlMutexUnlock(tv->ctrl_mutex); } tv = tv->next; } @@ -568,6 +576,11 @@ static TmEcode DetectLoaderThreadInit(ThreadVars *t, const void *initdata, void /* pass thread data back to caller */ *data = ftd; + DetectLoaderControl *loader = &loaders[ftd->instance]; + SCMutexLock(&loader->m); + loader->tv = t; + SCMutexUnlock(&loader->m); + return TM_ECODE_OK; } diff --git a/src/detect-engine-loader.h b/src/detect-engine-loader.h index 7ffb8c8648..8a6f7b8f17 100644 --- a/src/detect-engine-loader.h +++ b/src/detect-engine-loader.h @@ -44,6 +44,7 @@ typedef struct DetectLoaderTask_ { typedef struct DetectLoaderControl_ { int id; int result; /* 0 for ok, error otherwise */ + ThreadVars *tv; /* loader threads threadvars - for waking them up */ SCMutex m; TAILQ_HEAD(, DetectLoaderTask_) task_list; } DetectLoaderControl;