[lxc-devel] [PATCH] Add concise explanations
Stéphane Graber
stgraber at ubuntu.com
Fri Dec 11 06:17:16 UTC 2015
On Thu, Dec 10, 2015 at 05:26:18AM +0100, Christian Brauner wrote:
> - explain functions in list.h
> - let lxc_list_len() return size_t instead of int
>
> Signed-off-by: Christian Brauner <christian.brauner at mailbox.org>
Acked-by: Stéphane Graber <stgraber at ubuntu.com>
> ---
> I'm working on some stuff that employs struct lxc_list. I already previously
> found that list.h lacked some short documentation so here it is. Adding this
> documentation might be considered tmi but I think that it really eases
> transitioning into a codebase a lot to have a few lines and common idioms even
> for quite simple stuff such as circular linked lists here.
>
> src/lxc/list.h | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
> 1 file changed, 59 insertions(+), 2 deletions(-)
>
> diff --git a/src/lxc/list.h b/src/lxc/list.h
> index 2d8a2a8..3458b86 100644
> --- a/src/lxc/list.h
> +++ b/src/lxc/list.h
> @@ -32,42 +32,71 @@ struct lxc_list {
>
> #define lxc_init_list(l) { .next = l, .prev = l }
>
> +/*
> + * Iterate through an lxc list. An example for an idiom would be:
> + *
> + * struct lxc_list *iterator;
> + * type *tmp; // where "type" can be an int, char * etc.
> + * lxc_list_for_each(iterator, list) {
> + * tmp = iterator->elem;
> + * // Do stuff with tmp.
> + * }
> + * free(iterator);
> + */
> #define lxc_list_for_each(__iterator, __list) \
> for (__iterator = (__list)->next; \
> __iterator != __list; \
> __iterator = __iterator->next)
>
> +/*
> + * Iterate safely through an lxc list. An example for an appropriate use case
> + * would be:
> + *
> + * struct lxc_list *iterator;
> + * lxc_list_for_each_safe(iterator, list, list->next) {
> + * tmp = iterator->elem;
> + * // Do stuff with tmp.
> + * }
> + * free(iterator);
> + */
> #define lxc_list_for_each_safe(__iterator, __list, __next) \
> for (__iterator = (__list)->next, __next = __iterator->next; \
> __iterator != __list; \
> __iterator = __next, __next = __next->next)
>
> +/* Initalize list. */
> static inline void lxc_list_init(struct lxc_list *list)
> {
> list->elem = NULL;
> list->next = list->prev = list;
> }
>
> +/* Add an element to a list. See lxc_list_add() and lxc_list_add_tail() for an
> + * idiom. */
> static inline void lxc_list_add_elem(struct lxc_list *list, void *elem)
> {
> list->elem = elem;
> }
>
> +/* Retrieve first element of list. */
> static inline void *lxc_list_first_elem(struct lxc_list *list)
> {
> return list->next->elem;
> }
>
> +/* Retrieve last element of list. */
> static inline void *lxc_list_last_elem(struct lxc_list *list)
> {
> return list->prev->elem;
> }
>
> +/* Determine if list is empty. */
> static inline int lxc_list_empty(struct lxc_list *list)
> {
> return list == list->next;
> }
>
> +/* Workhorse to be called from lxc_list_add() and lxc_list_add_tail(). */
> static inline void __lxc_list_add(struct lxc_list *new,
> struct lxc_list *prev,
> struct lxc_list *next)
> @@ -78,17 +107,44 @@ static inline void __lxc_list_add(struct lxc_list *new,
> prev->next = new;
> }
>
> +/*
> + * Idiom to add an element to the beginning of an lxc list:
> + *
> + * struct lxc_list *tmp = malloc(sizeof(*tmp));
> + * if (tmp == NULL)
> + * return 1;
> + * lxc_list_add_elem(tmp, elem);
> + * lxc_list_add(list, tmp);
> + */
> static inline void lxc_list_add(struct lxc_list *head, struct lxc_list *list)
> {
> __lxc_list_add(list, head, head->next);
> }
>
> +/*
> + * Idiom to add an element to the end of an lxc list:
> + *
> + * struct lxc_list *tmp = malloc(sizeof(*tmp));
> + * if (tmp == NULL)
> + * return 1;
> + * lxc_list_add_elem(tmp, elem);
> + * lxc_list_add_tail(list, tmp);
> + */
> static inline void lxc_list_add_tail(struct lxc_list *head,
> struct lxc_list *list)
> {
> __lxc_list_add(list, head->prev, head);
> }
>
> +/*
> + * Idiom to free an lxc list:
> + *
> + * lxc_list_for_each_safe(iterator, list, list->next) {
> + * lxc_list_del(iterator);
> + * free(iterator);
> + * }
> + * free(iterator);
> + */
> static inline void lxc_list_del(struct lxc_list *list)
> {
> struct lxc_list *next, *prev;
> @@ -99,9 +155,10 @@ static inline void lxc_list_del(struct lxc_list *list)
> prev->next = next;
> }
>
> -static inline int lxc_list_len(struct lxc_list *list)
> +/* Return length of the list. */
> +static inline size_t lxc_list_len(struct lxc_list *list)
> {
> - int i = 0;
> + size_t i = 0;
> struct lxc_list *iter;
> lxc_list_for_each(iter, list) {
> i++;
> --
> 2.6.3
>
> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel
--
Stéphane Graber
Ubuntu developer
http://www.ubuntu.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20151211/cb6f6132/attachment-0001.sig>
More information about the lxc-devel
mailing list