diff --git a/src/flow-hash.c b/src/flow-hash.c index 10b59ae2d412..70416aa53892 100644 --- a/src/flow-hash.c +++ b/src/flow-hash.c @@ -692,6 +692,7 @@ static inline void MoveToWorkQueue(ThreadVars *tv, FlowLookupStruct *fls, f->fb = NULL; f->next = NULL; FlowQueuePrivateAppendFlow(&fls->work_queue, f); + FLOWLOCK_UNLOCK(f); } else { /* implied: TCP but our thread does not own it. So set it * aside for the Flow Manager to pick it up. */ diff --git a/src/flow-manager.c b/src/flow-manager.c index b2a869ccd576..c1ece4931910 100644 --- a/src/flow-manager.c +++ b/src/flow-manager.c @@ -333,6 +333,7 @@ static uint32_t ProcessAsideQueue(FlowManagerTimeoutThread *td, FlowTimeoutCount FlowForceReassemblyNeedReassembly(f) == 1) { FlowForceReassemblyForFlow(f); + FLOWLOCK_UNLOCK(f); /* flow ownership is passed to the worker thread */ /* flow remains locked */ diff --git a/src/flow-timeout.c b/src/flow-timeout.c index 972b35076bdf..d6cca4900873 100644 --- a/src/flow-timeout.c +++ b/src/flow-timeout.c @@ -401,6 +401,7 @@ static inline void FlowForceReassemblyForHash(void) RemoveFromHash(f, prev_f); f->flow_end_flags |= FLOW_END_FLAG_SHUTDOWN; FlowForceReassemblyForFlow(f); + FLOWLOCK_UNLOCK(f); f = next_f; continue; } diff --git a/src/flow-worker.c b/src/flow-worker.c index 69dbb6ac575f..dccf3581dd5b 100644 --- a/src/flow-worker.c +++ b/src/flow-worker.c @@ -168,6 +168,7 @@ static void CheckWorkQueue(ThreadVars *tv, FlowWorkerThreadData *fw, { Flow *f; while ((f = FlowQueuePrivateGetFromTop(fq)) != NULL) { + FLOWLOCK_WRLOCK(f); f->flow_end_flags |= FLOW_END_FLAG_TIMEOUT; //TODO emerg const FlowStateType state = f->flow_state;