Changeset ef1603b in mainline


Ignore:
Timestamp:
2012-07-06T13:01:46Z (12 years ago)
Author:
Adam Hraska <adam.hraska+hos@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
46a5b37
Parents:
d70fc74
Message:

adt: list_foreach_safe() enables item removal while traversing a list.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/include/adt/list.h

    rd70fc74 ref1603b  
    7171            iterator != &(list).head; iterator = iterator->next)
    7272
     73/** Unlike list_foreach(), allows removing items while traversing a list.
     74 *
     75 * @code
     76 * list_t mylist;
     77 * typedef struct item {
     78 *     int value;
     79 *     link_t item_link;
     80 * } item_t;
     81 *
     82 * //..
     83 *
     84 * // Print each list element's value and remove the element from the list.
     85 * list_foreach_safe(mylist, cur_link, next_link) {
     86 *     item_t *cur_item = list_get_instance(cur_link, item_t, item_link);
     87 *     printf("%d\n", cur_item->value);
     88 *     list_remove(cur_link);
     89 * }
     90 * @endcode
     91 *
     92 * @param list List to traverse.
     93 * @param iterator Iterator to the current element of the list.
     94 *             The item this iterator points may be safely removed
     95 *             from the list.
     96 * @param next_iter Iterator to the next element of the list.
     97 */
     98#define list_foreach_safe(list, iterator, next_iter) \
     99        for (link_t *iterator = (list).head.next, \
     100                *next_iter = iterator->next; \
     101                iterator != &(list).head; \
     102                iterator = next_iter, next_iter = iterator->next)
     103
     104       
    73105#define assert_link_not_used(link) \
    74106        ASSERT(((link)->prev == NULL) && ((link)->next == NULL))
     
    85117        link->prev = NULL;
    86118        link->next = NULL;
     119}
     120
     121/** Returns true if the initialized link is already in use by any list.
     122 *
     123 * @param link Link to examine whether if belongs to a list or not.
     124 * @return 1 if the link is part of a list.
     125 * @return 0 otherwise.
     126 */
     127NO_TRACE static inline int link_used(const link_t *link)
     128{
     129        return link->prev != NULL || link->next != NULL;
    87130}
    88131
Note: See TracChangeset for help on using the changeset viewer.