mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-12-11 04:31:01 +01:00
BUG/MEDIUM: mt_lists: Avoid el->prev = el->next = el
Avoid setting both el->prev and el->next on the same line. The goal is to set both el->prev and el->next to el, but a naive compiler, such as when we're using -O0, will set el->next first, then will set el->prev to the value of el->next, but if we're unlucky, el->next will have been set to something else by another thread. So explicitely set both to what we want. This should be backported up to 2.8.
This commit is contained in:
parent
d0f9515e5c
commit
f40f5401b9
@ -264,7 +264,8 @@ static inline __attribute__((always_inline)) unsigned long mt_list_cpu_relax(uns
|
||||
*/
|
||||
static inline struct mt_list *mt_list_init(struct mt_list *el)
|
||||
{
|
||||
el->next = el->prev = el;
|
||||
el->next = el;
|
||||
el->prev = el;
|
||||
return el;
|
||||
}
|
||||
|
||||
@ -490,7 +491,8 @@ static MT_INLINE struct mt_list *mt_list_behead(struct mt_list *lh)
|
||||
break;
|
||||
}
|
||||
|
||||
lh->next = lh->prev = lh;
|
||||
lh->next = lh;
|
||||
lh->prev = lh;
|
||||
__atomic_thread_fence(__ATOMIC_RELEASE);
|
||||
|
||||
n->prev = p;
|
||||
@ -643,7 +645,8 @@ static MT_INLINE long mt_list_delete(struct mt_list *el)
|
||||
* somebody may be using it already.
|
||||
*/
|
||||
if (el != n) {
|
||||
el->prev = el->next = el;
|
||||
el->prev = el;
|
||||
el->next = el;
|
||||
__atomic_thread_fence(__ATOMIC_RELEASE);
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user