mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-11-28 22:31:06 +01:00
MINOR: lists: add a LIST_DEL_INIT() macro
It turns out that we call LIST_DEL+LIST_INIT very frequently and that the compiler doesn't know what pointers get modified in the e->n->p and e->p->n dance, so when LIST_INIT() is called, it reloads these pointers, which is quite a bit of a mess in terms of performance. This patch adds LIST_DEL_INIT() to perform the two operations at once using local temporary variables so that the compiler knows these pointers are left unaffected.
This commit is contained in:
parent
47e4e13c01
commit
c5bd311b2a
@ -89,6 +89,18 @@ struct cond_wordlist {
|
||||
/* removes an element from a list and returns it */
|
||||
#define LIST_DEL(el) ({ typeof(el) __ret = (el); (el)->n->p = (el)->p; (el)->p->n = (el)->n; (__ret); })
|
||||
|
||||
/* removes an element from a list, initializes it and returns it.
|
||||
* This is faster than LIST_DEL+LIST_INIT as we avoid reloading the pointers.
|
||||
*/
|
||||
#define LIST_DEL_INIT(el) ({ \
|
||||
typeof(el) __ret = (el); \
|
||||
typeof(__ret->n) __n = __ret->n; \
|
||||
typeof(__ret->p) __p = __ret->p; \
|
||||
__n->p = __p; __p->n = __n; \
|
||||
__ret->n = __ret->p = __ret; \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
/* returns a pointer of type <pt> to a structure containing a list head called
|
||||
* <el> at address <lh>. Note that <lh> can be the result of a function or macro
|
||||
* since it's used only once.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user