linuxlist.h: add llist_first/last_entry macros

Copy list_first_entry, list_first_entry_or_null and list_last_entry from
current linux kernel's tools/include/linux/list.h and rename to llist_*.
Slightly adjust API doc but stay as close to the source as possible.

This can replace similar implementations in osmo-bts-octphy's l1_if.c,
in openbsc's gtphub.c and in osmo-hlr's gsup_server.c.

Change-Id: I4eac5be0c0b2cede04464c4c3a0873102d952453
This commit is contained in:
Neels Hofmeyr 2017-03-14 22:48:02 +01:00 committed by Harald Welte
parent 45e778d397
commit 4cb0c8b45e
1 changed files with 30 additions and 0 deletions

View File

@ -215,6 +215,36 @@ static inline void llist_splice_init(struct llist_head *llist,
#define llist_entry(ptr, type, member) \
container_of(ptr, type, member)
/*! \brief Get the first element from a list
* \param ptr the list head to take the element from.
* \param type the type of the struct this is embedded in.
* \param member the name of the list_head within the struct.
*
* Note, that list is expected to be not empty.
*/
#define llist_first_entry(ptr, type, member) \
llist_entry((ptr)->next, type, member)
/*! \brief Get the last element from a list
* \param ptr the list head to take the element from.
* \param type the type of the struct this is embedded in.
* \param member the name of the llist_head within the struct.
*
* Note, that list is expected to be not empty.
*/
#define llist_last_entry(ptr, type, member) \
llist_entry((ptr)->prev, type, member)
/*! \brief Get the first element from a list, or NULL
* \param ptr the list head to take the element from.
* \param type the type of the struct this is embedded in.
* \param member the name of the list_head within the struct.
*
* Note that if the list is empty, it returns NULL.
*/
#define llist_first_entry_or_null(ptr, type, member) \
(!llist_empty(ptr) ? llist_first_entry(ptr, type, member) : NULL)
/*! \brief Iterate over a linked list
* \param pos The \ref llist_head to use as a loop counter
* \param head The head of the list over which to iterate