From 1a2a2e12cdb4712f85c929c054abed14b39d3836 Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Wed, 14 Feb 2024 19:44:31 -0500 Subject: kernel: queue: Keep track of element count Signed-off-by: Ian Moffett --- sys/include/sys/queue.h | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'sys') diff --git a/sys/include/sys/queue.h b/sys/include/sys/queue.h index 963e695..ee5c96b 100644 --- a/sys/include/sys/queue.h +++ b/sys/include/sys/queue.h @@ -27,6 +27,8 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include + #define _Q_INVALIDATE(a) /* @@ -36,6 +38,7 @@ struct name { \ struct type *tqh_first; /* first element */ \ struct type **tqh_last; /* addr of last next element */ \ + size_t nelem; /* Number of elements */ \ } #define TAILQ_HEAD_INITIALIZER(head) \ @@ -50,6 +53,7 @@ struct { \ /* * Tail queue access methods. */ +#define TAILQ_NELEM(head) ((head)->nelem) #define TAILQ_FIRST(head) ((head)->tqh_first) #define TAILQ_END(head) NULL #define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) @@ -90,6 +94,7 @@ struct { \ #define TAILQ_INIT(head) do { \ (head)->tqh_first = NULL; \ (head)->tqh_last = &(head)->tqh_first; \ + (head)->nelem = 0; \ } while (0) #define TAILQ_INSERT_HEAD(head, elm, field) do { \ @@ -100,6 +105,7 @@ struct { \ (head)->tqh_last = &(elm)->field.tqe_next; \ (head)->tqh_first = (elm); \ (elm)->field.tqe_prev = &(head)->tqh_first; \ + ++(head)->nelem; \ } while (0) #define TAILQ_INSERT_TAIL(head, elm, field) do { \ @@ -107,6 +113,7 @@ struct { \ (elm)->field.tqe_prev = (head)->tqh_last; \ *(head)->tqh_last = (elm); \ (head)->tqh_last = &(elm)->field.tqe_next; \ + ++(head)->nelem; \ } while (0) #define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ @@ -117,6 +124,7 @@ struct { \ (head)->tqh_last = &(elm)->field.tqe_next; \ (listelm)->field.tqe_next = (elm); \ (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ + ++(head)->nelem; \ } while (0) #define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ @@ -124,6 +132,7 @@ struct { \ (elm)->field.tqe_next = (listelm); \ *(listelm)->field.tqe_prev = (elm); \ (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ + ++(head)->nelem; \ } while (0) #define TAILQ_REMOVE(head, elm, field) do { \ @@ -135,6 +144,7 @@ struct { \ *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ _Q_INVALIDATE((elm)->field.tqe_prev); \ _Q_INVALIDATE((elm)->field.tqe_next); \ + --(head)->nelem; \ } while (0) #define TAILQ_REPLACE(head, elm, elm2, field) do { \ -- cgit v1.2.3