summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeels Hofmeyr <nhofmeyr@sysmocom.de>2017-03-14 22:48:02 +0100
committerHarald Welte <laforge@gnumonks.org>2017-03-15 12:58:00 +0000
commit4cb0c8b45e0b4022adc63155ff44d9967d8f79d4 (patch)
treedb94a002e9c97ebabaf2ddf23088db5ab8663707
parent45e778d397a525956e377567d5f9af6318a5343e (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.h30
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