Flow: fix flow reference cnt issues

FlowReference stores the flow in the destination pointer and increases
the flow reference counter (use_cnt). This should only be called once
per destination pointer. The reference counter is decremented when
FlowDereference is called. Multiple FlowReference calls would lead to
multiple use_cnt bumps, while there would be only one FlowRereference.
This lead to a use_cnt that would never become 0, meaning the flow
would stay in the hash for the entire lifetime of the process.

The fix here is to check if the destination pointer is already set to
the flow. If so, we don't increase the reference counter.

As this is really a bug, this condition will lead to a BUG_ON if the
DEBUG_VALIDATION checking is enabled.
pull/836/merge
Victor Julien 12 years ago
parent fdca557e01
commit 85760a7044

@ -521,8 +521,17 @@ static inline void FlowDecrUsecnt(Flow *f)
(void) SC_ATOMIC_SUB(f->use_cnt, 1);
}
/** \brief Reference the flow, bumping the flows use_cnt
* \note This should only be called once for a destination
* pointer */
static inline void FlowReference(Flow **d, Flow *f) {
if (likely(f != NULL)) {
#ifdef DEBUG_VALIDATION
BUG_ON(*d == f);
#else
if (*d == f)
return;
#endif
FlowIncrUsecnt(f);
*d = f;
}

Loading…
Cancel
Save