BUG/MINOR: fd/threads: properly lock the FD before adding it to the fd cache.
It was believed that it was useless to lock the "prev" field when adding a
FD. However, if there's only one element in the FD cache, and that element
removes itself from the fd cache, and another FD is added before the first
add completed, there's a risk of losing elements. To prevent that, lock the
"prev" field, so that such a removal will wait until the add completed.
diff --git a/src/fd.c b/src/fd.c
index d6c140c..1af64e5 100644
--- a/src/fd.c
+++ b/src/fd.c
@@ -198,7 +198,7 @@
last = list->last;
old = -1;
- fdtab[fd].cache.prev = last;
+ fdtab[fd].cache.prev = -2;
/* Make sure the "prev" store is visible before we update the last entry */
__ha_barrier_store();
@@ -224,6 +224,7 @@
/* since we're alone at the end of the list and still locked(-2),
* we know noone tried to add past us. Mark the end of list.
*/
+ fdtab[fd].cache.prev = last;
fdtab[fd].cache.next = -1;
__ha_barrier_store();
done: