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.
This commit is contained in:
Willy Tarreau 2018-02-05 19:43:30 +01:00
parent 4cc67a2782
commit abeaff2d54

View File

@ -281,7 +281,7 @@ lock_self:
#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 @@ lock_self_next:
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)))