From 4cb0c8b45e0b4022adc63155ff44d9967d8f79d4 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Tue, 14 Mar 2017 22:48:02 +0100 Subject: 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 --- include/osmocom/core/linuxlist.h | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/include/osmocom/core/linuxlist.h b/include/osmocom/core/linuxlist.h index affa8273..7d850776 100644 --- a/include/osmocom/core/linuxlist.h +++ b/include/osmocom/core/linuxlist.h @@ -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 -- cgit v1.2.3