Add list_for_each_entry_safe.
authorMichael Brown <mcb30@etherboot.org>
Tue, 16 May 2006 14:14:31 +0000 (14:14 +0000)
committerMichael Brown <mcb30@etherboot.org>
Tue, 16 May 2006 14:14:31 +0000 (14:14 +0000)
src/include/gpxe/list.h

index 7c6042b..0e65901 100644 (file)
@@ -138,8 +138,23 @@ static inline int list_empty ( const struct list_head *head ) {
  * @v member   The name of the list_struct within the struct
  */
 #define list_for_each_entry( pos, head, member )                             \
  * @v member   The name of the list_struct within the struct
  */
 #define list_for_each_entry( pos, head, member )                             \
-       for ( pos = list_entry ( (head)->next, typeof ( *pos ), member);      \
+       for ( pos = list_entry ( (head)->next, typeof ( *pos ), member );     \
              &pos->member != (head);                                         \
              pos = list_entry ( pos->member.next, typeof ( *pos ), member ) )
 
              &pos->member != (head);                                         \
              pos = list_entry ( pos->member.next, typeof ( *pos ), member ) )
 
+/**
+ * Iterate over entries in a list, safe against deletion of entries
+ *
+ * @v pos      The type * to use as a loop counter
+ * @v tmp      Another type * to use for temporary storage
+ * @v head     The head for your list
+ * @v member   The name of the list_struct within the struct
+ */
+#define list_for_each_entry_safe( pos, tmp, head, member )                   \
+       for ( pos = list_entry ( (head)->next, typeof ( *pos ), member ),     \
+             tmp = list_entry ( pos->member.next, typeof ( *tmp ), member ); \
+             &pos->member != (head);                                         \
+             pos = tmp,                                                      \
+             tmp = list_entry ( tmp->member.next, typeof ( *tmp ), member ) )
+
 #endif /* _GPXE_LIST_H */
 #endif /* _GPXE_LIST_H */