BUG/MINOR: fd/threads: properly dereference fdcache as volatile
In fd_rm_from_fd_list(), we have loops waiting for another change to
complete, in case we don't have support for a double CAS. But these
ones fail to place a compiler barrier or to dereference the fdcache
as a volatile, resulting in an endless loop on the first collision,
which is visible when run on MIPS32.
No backport needed.
diff --git a/src/fd.c b/src/fd.c
index 1082353..04ac335 100644
--- a/src/fd.c
+++ b/src/fd.c
@@ -281,7 +281,7 @@
#else
lock_self_next:
- next = fdtab[fd].cache.next;
+ next = pl_deref_int(&fdtab[fd].cache.next);
if (next == -2)
goto lock_self_next;
if (next <= -3)
@@ -289,7 +289,7 @@
if (unlikely(!HA_ATOMIC_CAS(&fdtab[fd].cache.next, &next, -2)))
goto lock_self_next;
lock_self_prev:
- prev = fdtab[fd].cache.prev;
+ prev = pl_deref_int(&fdtab[fd].cache.prev);
if (prev == -2)
goto lock_self_prev;
if (unlikely(!HA_ATOMIC_CAS(&fdtab[fd].cache.prev, &prev, -2)))