1538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* 2538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * Copyright (c) 2004-2010 Alex Pankratov. All rights reserved. 3538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * 4538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * Hierarchical memory allocator, 1.2.1 5538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * http://swapped.cc/halloc 6538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */ 7538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 8538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* 9538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * The program is distributed under terms of BSD license. 10538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * You can obtain the copy of the license by visiting: 11538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * 12538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * http://www.opensource.org/licenses/bsd-license.php 13538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */ 14538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 15538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifndef _LIBP_HLIST_H_ 16538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define _LIBP_HLIST_H_ 17538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 18538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include <assert.h> 19538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include "macros.h" /* static_inline */ 20538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 21538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* 22538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * weak double-linked list w/ tail sentinel 23538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */ 24538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubertypedef struct hlist_head hlist_head_t; 25538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubertypedef struct hlist_item hlist_item_t; 26538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 27538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* 28538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * 29538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */ 30538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstruct hlist_head 31538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{ 32538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber hlist_item_t * next; 33538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}; 34538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 35538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstruct hlist_item 36538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{ 37538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber hlist_item_t * next; 38538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber hlist_item_t ** prev; 39538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}; 40538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 41538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* 42538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * shared tail sentinel 43538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */ 44538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstruct hlist_item hlist_null; 45538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 46538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* 47538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * 48538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */ 49538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define __hlist_init(h) { &hlist_null } 50538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define __hlist_init_item(i) { &hlist_null, &(i).next } 51538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 52538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic_inline void hlist_init(hlist_head_t * h); 53538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic_inline void hlist_init_item(hlist_item_t * i); 54538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 55538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* static_inline void hlist_purge(hlist_head_t * h); */ 56538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 57538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* static_inline bool_t hlist_empty(const hlist_head_t * h); */ 58538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 59538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* static_inline hlist_item_t * hlist_head(const hlist_head_t * h); */ 60538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 61538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* static_inline hlist_item_t * hlist_next(const hlist_item_t * i); */ 62538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* static_inline hlist_item_t * hlist_prev(const hlist_item_t * i, 63538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const hlist_head_t * h); */ 64538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 65538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic_inline void hlist_add(hlist_head_t * h, hlist_item_t * i); 66538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 67538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* static_inline void hlist_add_prev(hlist_item_t * l, hlist_item_t * i); */ 68538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* static_inline void hlist_add_next(hlist_item_t * l, hlist_item_t * i); */ 69538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 70538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic_inline void hlist_del(hlist_item_t * i); 71538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 72538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic_inline void hlist_relink(hlist_item_t * i); 73538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic_inline void hlist_relink_head(hlist_head_t * h); 74538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 75538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define hlist_for_each(i, h) \ 76538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber for (i = (h)->next; i != &hlist_null; i = i->next) 77538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 78538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define hlist_for_each_safe(i, tmp, h) \ 79538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber for (i = (h)->next, tmp = i->next; \ 80538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber i!= &hlist_null; \ 81538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber i = tmp, tmp = i->next) 82538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 83538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* 84538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * static 85538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */ 86538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic_inline void hlist_init(hlist_head_t * h) 87538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{ 88538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber assert(h); 89538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber h->next = &hlist_null; 90538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber} 91538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 92538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic_inline void hlist_init_item(hlist_item_t * i) 93538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{ 94538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber assert(i); 95538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber i->prev = &i->next; 96538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber i->next = &hlist_null; 97538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber} 98538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 99538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic_inline void hlist_add(hlist_head_t * h, hlist_item_t * i) 100538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{ 101538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber hlist_item_t * next; 102538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber assert(h && i); 103538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 104538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber next = i->next = h->next; 105538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber next->prev = &i->next; 106538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber h->next = i; 107538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber i->prev = &h->next; 108538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber} 109538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 110538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic_inline void hlist_del(hlist_item_t * i) 111538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{ 112538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber hlist_item_t * next; 113538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber assert(i); 114538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 115538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber next = i->next; 116538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber next->prev = i->prev; 117538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber *i->prev = next; 118538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 119538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber hlist_init_item(i); 120538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber} 121538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 122538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic_inline void hlist_relink(hlist_item_t * i) 123538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{ 124538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber assert(i); 125538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber *i->prev = i; 126538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber i->next->prev = &i->next; 127538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber} 128538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 129538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic_inline void hlist_relink_head(hlist_head_t * h) 130538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{ 131538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber assert(h); 132538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber h->next->prev = &h->next; 133538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber} 134538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 135538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif 136538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 137