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.
(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;
}