Add typed-list module.
This gives some named convenience wrappers.
This commit is contained in:
parent
00f06c9beb
commit
129b727058
@ -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);
|
||||||
|
47
include/jemalloc/internal/typed_list.h
Normal file
47
include/jemalloc/internal/typed_list.h
Normal 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 */
|
Loading…
Reference in New Issue
Block a user