From d5ec60bc0c2fa92a05e766463761b6e22d6d67b4 Mon Sep 17 00:00:00 2001 From: Gustavo Sverzut Barbieri Date: Fri, 16 Dec 2011 22:32:33 -0200 Subject: [PATCH] introduce kmod_list_last() This gets the last element in the list, that is, the previous element of the head. --- libkmod/libkmod-list.c | 20 ++++++++++++++++++++ libkmod/libkmod.h | 2 ++ libkmod/libkmod.sym | 1 + 3 files changed, 23 insertions(+) diff --git a/libkmod/libkmod-list.c b/libkmod/libkmod-list.c index 5ec33a2a..4b68b77e 100644 --- a/libkmod/libkmod-list.c +++ b/libkmod/libkmod-list.c @@ -310,3 +310,23 @@ KMOD_EXPORT struct kmod_list *kmod_list_next(const struct kmod_list *list, return container_of(curr->node.next, struct kmod_list, node); } + +/** + * kmod_list_last: + * @list: the head of the list + * + * Get the last element of the @list. As @list is a circular list, + * this is a cheap operation O(1) with the last element being the + * previous element. + * + * If the list has a single element it will return the list itself (as + * expected, and this is what differentiates from kmod_list_prev()). + * + * Returns: last node at @list or NULL if the list is empty. + */ +KMOD_EXPORT struct kmod_list *kmod_list_last(const struct kmod_list *list) +{ + if (list == NULL) + return NULL; + return container_of(list->node.prev, struct kmod_list, node); +} diff --git a/libkmod/libkmod.h b/libkmod/libkmod.h index 194946d1..37abbcc6 100644 --- a/libkmod/libkmod.h +++ b/libkmod/libkmod.h @@ -62,6 +62,8 @@ struct kmod_list *kmod_list_next(const struct kmod_list *first_entry, const struct kmod_list *list_entry); struct kmod_list *kmod_list_prev(const struct kmod_list *first_entry, const struct kmod_list *list_entry); +struct kmod_list *kmod_list_last(const struct kmod_list *first_entry); + #define kmod_list_foreach(list_entry, first_entry) \ for (list_entry = first_entry; \ list_entry != NULL; \ diff --git a/libkmod/libkmod.sym b/libkmod/libkmod.sym index 71b7ccc8..664fd6bb 100644 --- a/libkmod/libkmod.sym +++ b/libkmod/libkmod.sym @@ -11,6 +11,7 @@ global: kmod_unref; kmod_list_next; kmod_list_prev; + kmod_list_last; kmod_load_resources; kmod_unload_resources; -- 2.47.2