From 2e235138da5cb6b747996ec472d332d9c8812b0d Mon Sep 17 00:00:00 2001 From: Filip Matusiak <filip.matusiak@iopsys.eu> Date: Thu, 7 Oct 2021 15:54:23 +0200 Subject: [PATCH] Revert "remove copy of hlist.h" This reverts commit d15897e2ecf17326babc5ec57e4d915e9b51b35d. --- src/core/allsta.c | 1 + src/core/cntlr.c | 1 + src/core/cntlr_ubus.c | 1 + src/utils/hlist.h | 101 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 104 insertions(+) create mode 100644 src/utils/hlist.h diff --git a/src/core/allsta.c b/src/core/allsta.c index f108e145..f577f4aa 100644 --- a/src/core/allsta.c +++ b/src/core/allsta.c @@ -15,6 +15,7 @@ #include <easy/easy.h> #include "utils.h" #include "debug.h" +#include "hlist.h" #include "allsta.h" /* hash table of all active stas in the network */ diff --git a/src/core/cntlr.c b/src/core/cntlr.c index 11ea7057..423edf98 100644 --- a/src/core/cntlr.c +++ b/src/core/cntlr.c @@ -41,6 +41,7 @@ #include "config.h" #include "cntlr.h" #include "comm.h" +#include "hlist.h" #include "allsta.h" #include "cntlr_ubus.h" #include "cntlr_map.h" diff --git a/src/core/cntlr_ubus.c b/src/core/cntlr_ubus.c index 2b5d3c23..1420c255 100644 --- a/src/core/cntlr_ubus.c +++ b/src/core/cntlr_ubus.c @@ -31,6 +31,7 @@ #include "debug.h" #include "config.h" #include "cntlr.h" +#include "hlist.h" #include "allsta.h" #include "cntlr_map.h" #include "cntlr_ubus.h" diff --git a/src/utils/hlist.h b/src/utils/hlist.h new file mode 100644 index 00000000..faf00789 --- /dev/null +++ b/src/utils/hlist.h @@ -0,0 +1,101 @@ +/* + * hlist.h - stripped down version of hash list implementation using + * singly linked list. + * Doubly linked list is wastage of space for big hash-tables. If cost of + * iterating a hash list is significant, it means the hash function is NOT + * formulated well and should be revisited. + * + * Copyright (C) 2019 IOPSYS Software Solutions AB. All rights reserved. + * + * Author: anjan.chanda@iopsys.eu + * + */ + +#ifndef _HLIST_H +#define _HLIST_H + +struct hlist_node { + struct hlist_node *next; +}; + +struct hlist_head { + struct hlist_node *first; +}; + +#define HLIST_HEAD_INIT(name) { &(name) } + +#define HLIST_HEAD(name) struct hlist_head name = HLIST_HEAD_INIT(name) + +static inline void INIT_HLIST_HEAD(struct hlist_head *h) +{ + h->first = NULL; +} + +static inline void INIT_HLIST_NODE(struct hlist_node *n) +{ + n->next = NULL; +} + +static inline int hlist_empty(const struct hlist_head *h) +{ + return !h->first; +} + +static inline void __hlist_del(struct hlist_node *prev, struct hlist_node *n) +{ + prev->next = n->next; + n->next = NULL; +} + +static inline void hlist_del(struct hlist_node *n, struct hlist_head *h) +{ + struct hlist_node *p; + + if (h->first == n) { + h->first = NULL; + n->next = NULL; + return; + } + + for (p = h->first; p; p = p->next) { + if (p->next == n) + __hlist_del(p, n); + } +} + +static inline void _hlist_add(struct hlist_node *_new, struct hlist_head *h) +{ + _new->next = h->first; + h->first = _new; +} + +static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h) +{ + _hlist_add(n, h); +} + +#define hlist_for_each(pos, head) \ + for (pos = (head)->first; pos ; pos = pos->next) + +#define hlist_for_each_safe(pos, n, head) \ + for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \ + pos = n) + +#define hlist_entry(ptr, type, member) container_of(ptr, type, member) + +#define hlist_entry_safe(ptr, type, member) \ + ({ typeof(ptr) ____ptr = (ptr); \ + ____ptr ? hlist_entry(____ptr, type, member) : NULL; \ + }) + +#define hlist_for_each_entry(pos, head, member) \ + for (pos = hlist_entry_safe((head)->first, typeof(*(pos)), member); \ + pos; \ + pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member)) + +#define hlist_for_each_entry_safe(pos, n, head, member) \ + for (pos = hlist_entry_safe((head)->first, typeof(*pos), member); \ + pos && ({ n = pos->member.next; 1; }); \ + pos = hlist_entry_safe(n, typeof(*pos), member)) + +#endif /* _HLIST_H */ -- GitLab