diff options
author | Neels Hofmeyr <nhofmeyr@sysmocom.de> | 2017-03-14 22:48:02 +0100 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2017-03-15 12:58:00 +0000 |
commit | 4cb0c8b45e0b4022adc63155ff44d9967d8f79d4 (patch) | |
tree | db94a002e9c97ebabaf2ddf23088db5ab8663707 | |
parent | 45e778d397a525956e377567d5f9af6318a5343e (diff) |
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
-rw-r--r-- | include/osmocom/core/linuxlist.h | 30 |
1 files changed, 30 insertions, 0 deletions
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 |