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.
#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)
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)))