Add typed-list module.

This gives some named convenience wrappers.
This commit is contained in:
David Goldblatt 2020-06-11 15:16:38 -07:00 committed by David Goldblatt
parent 00f06c9beb
commit 129b727058
2 changed files with 50 additions and 39 deletions

View File

@ -10,6 +10,7 @@
#include "jemalloc/internal/sc.h" #include "jemalloc/internal/sc.h"
#include "jemalloc/internal/slab_data.h" #include "jemalloc/internal/slab_data.h"
#include "jemalloc/internal/sz.h" #include "jemalloc/internal/sz.h"
#include "jemalloc/internal/typed_list.h"
enum extent_state_e { enum extent_state_e {
extent_state_active = 0, extent_state_active = 0,
@ -58,7 +59,6 @@ struct edata_map_info_s {
/* Extent (span of pages). Use accessor functions for e_* fields. */ /* Extent (span of pages). Use accessor functions for e_* fields. */
typedef struct edata_s edata_t; typedef struct edata_s edata_t;
typedef ql_head(edata_t) edata_list_t;
typedef ph(edata_t) edata_tree_t; typedef ph(edata_t) edata_tree_t;
typedef ph(edata_t) edata_heap_t; typedef ph(edata_t) edata_heap_t;
struct edata_s { struct edata_s {
@ -209,6 +209,8 @@ struct edata_s {
}; };
}; };
TYPED_LIST(edata_list, edata_t, ql_link)
static inline unsigned static inline unsigned
edata_arena_ind_get(const edata_t *edata) { edata_arena_ind_get(const edata_t *edata) {
unsigned arena_ind = (unsigned)((edata->e_bits & unsigned arena_ind = (unsigned)((edata->e_bits &
@ -531,7 +533,6 @@ edata_init(edata_t *edata, unsigned arena_ind, void *addr, size_t size,
edata_zeroed_set(edata, zeroed); edata_zeroed_set(edata, zeroed);
edata_committed_set(edata, committed); edata_committed_set(edata, committed);
edata_ranged_set(edata, ranged); edata_ranged_set(edata, ranged);
ql_elm_new(edata, ql_link);
edata_is_head_set(edata, is_head == EXTENT_IS_HEAD); edata_is_head_set(edata, is_head == EXTENT_IS_HEAD);
if (config_prof) { if (config_prof) {
edata_prof_tctx_set(edata, NULL); edata_prof_tctx_set(edata, NULL);
@ -552,43 +553,6 @@ edata_binit(edata_t *edata, void *addr, size_t bsize, size_t sn) {
edata_ranged_set(edata, false); edata_ranged_set(edata, false);
} }
static inline void
edata_list_init(edata_list_t *list) {
ql_new(list);
}
static inline edata_t *
edata_list_first(const edata_list_t *list) {
return ql_first(list);
}
static inline edata_t *
edata_list_last(const edata_list_t *list) {
return ql_last(list, ql_link);
}
static inline void
edata_list_append(edata_list_t *list, edata_t *edata) {
ql_tail_insert(list, edata, ql_link);
}
static inline void
edata_list_prepend(edata_list_t *list, edata_t *edata) {
ql_head_insert(list, edata, ql_link);
}
static inline void
edata_list_replace(edata_list_t *list, edata_t *to_remove,
edata_t *to_insert) {
ql_after_insert(to_remove, to_insert, ql_link);
ql_remove(list, to_remove, ql_link);
}
static inline void
edata_list_remove(edata_list_t *list, edata_t *edata) {
ql_remove(list, edata, ql_link);
}
static inline int static inline int
edata_sn_comp(const edata_t *a, const edata_t *b) { edata_sn_comp(const edata_t *a, const edata_t *b) {
size_t a_sn = edata_sn_get(a); size_t a_sn = edata_sn_get(a);

View File

@ -0,0 +1,47 @@
#ifndef JEMALLOC_INTERNAL_TYPED_LIST_H
#define JEMALLOC_INTERNAL_TYPED_LIST_H
/*
* This wraps the ql module to implement a list class in a way that's a little
* bit easier to use; it handles ql_elm_new calls and provides type safety.
*/
#define TYPED_LIST(list_type, el_type, linkage) \
typedef struct { \
ql_head(el_type) head; \
} list_type##_t; \
static inline void \
list_type##_init(list_type##_t *list) { \
ql_new(&list->head); \
} \
static inline el_type * \
list_type##_first(const list_type##_t *list) { \
return ql_first(&list->head); \
} \
static inline el_type * \
list_type##_last(const list_type##_t *list) { \
return ql_last(&list->head, linkage); \
} \
static inline void \
list_type##_append(list_type##_t *list, el_type *item) { \
ql_elm_new(item, linkage); \
ql_tail_insert(&list->head, item, linkage); \
} \
static inline void \
list_type##_prepend(list_type##_t *list, el_type *item) { \
ql_elm_new(item, linkage); \
ql_head_insert(&list->head, item, linkage); \
} \
static inline void \
list_type##_replace(list_type##_t *list, el_type *to_remove, \
el_type *to_insert) { \
ql_elm_new(to_insert, linkage); \
ql_after_insert(to_remove, to_insert, linkage); \
ql_remove(&list->head, to_remove, linkage); \
} \
static inline void \
list_type##_remove(list_type##_t *list, el_type *item) { \
ql_remove(&list->head, item, linkage); \
}
#endif /* JEMALLOC_INTERNAL_TYPED_LIST_H */