]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/queue.h
Merge pull request #3485 from dslicenc/frr-reload-delete-vrf
[mirror_frr.git] / lib / queue.h
index 29b67a26e65639b993757e84983a2aadc8c66278..11e28b4c912554caf2c9cae8adebb407a46ce0fb 100644 (file)
@@ -40,8 +40,7 @@
        (SIMPLEQ_EMPTY((head))                                                 \
                 ? NULL                                                        \
                 : ((struct type *)(void *)((char *)((head)->sqh_last)         \
-                                           - offsetof(struct type,            \
-                                                        field))))
+                                           - offsetof(struct type, field))))
 #define STAILQ_NEXT(elm, field)                                SIMPLEQ_NEXT(elm, field)
 #define STAILQ_REMOVE(head, elm, type, field)                                  \
        do {                                                                   \
 #include "freebsd-queue.h"
 #endif /* defined(__OpenBSD__) && !defined(STAILQ_HEAD) */
 
+#ifndef TAILQ_POP_FIRST
+#define TAILQ_POP_FIRST(head, field)                                           \
+       ({  typeof((head)->tqh_first) _elm = TAILQ_FIRST(head);                \
+           if (_elm) {                                                        \
+               if ((TAILQ_NEXT((_elm), field)) != NULL)                       \
+                       TAILQ_NEXT((_elm), field)->field.tqe_prev =            \
+                               &TAILQ_FIRST(head);                            \
+               else                                                           \
+                       (head)->tqh_last = &TAILQ_FIRST(head);                 \
+               TAILQ_FIRST(head) = TAILQ_NEXT((_elm), field);                 \
+       }; _elm; })
+#endif
+
 #endif /* _FRR_QUEUE_H */