MEDIUM: stick-table: free newly allocated stkess if it couldn't be inserted
In __stktable_get_entry() now we're planning for the possibility that the
call to __stktable_store() doesn't add the newly allocated entry and instead
finds a previously inserted one. At the moment this doesn't exist because
the lookup + insert passes are made under the same lock. But it will soon
change.
diff --git a/src/stick_table.c b/src/stick_table.c
index 6f5e6c8..95913b1 100644
--- a/src/stick_table.c
+++ b/src/stick_table.c
@@ -523,7 +523,7 @@
*/
struct stksess *__stktable_get_entry(struct stktable *table, struct stktable_key *key)
{
- struct stksess *ts;
+ struct stksess *ts, *ts2;
if (!key)
return NULL;
@@ -534,7 +534,14 @@
ts = __stksess_new(table, key);
if (!ts)
return NULL;
- __stktable_store(table, ts);
+ ts2 = __stktable_store(table, ts);
+ if (unlikely(ts2 != ts)) {
+ /* another entry was added in the mean time, let's
+ * switch to it.
+ */
+ __stksess_free(table, ts);
+ ts = ts2;
+ }
}
return ts;
}