1*1208bc7eSAndroid Build Coastguard Worker #ifndef JEMALLOC_INTERNAL_QL_H 2*1208bc7eSAndroid Build Coastguard Worker #define JEMALLOC_INTERNAL_QL_H 3*1208bc7eSAndroid Build Coastguard Worker 4*1208bc7eSAndroid Build Coastguard Worker #include "jemalloc/internal/qr.h" 5*1208bc7eSAndroid Build Coastguard Worker 6*1208bc7eSAndroid Build Coastguard Worker /* List definitions. */ 7*1208bc7eSAndroid Build Coastguard Worker #define ql_head(a_type) \ 8*1208bc7eSAndroid Build Coastguard Worker struct { \ 9*1208bc7eSAndroid Build Coastguard Worker a_type *qlh_first; \ 10*1208bc7eSAndroid Build Coastguard Worker } 11*1208bc7eSAndroid Build Coastguard Worker 12*1208bc7eSAndroid Build Coastguard Worker #define ql_head_initializer(a_head) {NULL} 13*1208bc7eSAndroid Build Coastguard Worker 14*1208bc7eSAndroid Build Coastguard Worker #define ql_elm(a_type) qr(a_type) 15*1208bc7eSAndroid Build Coastguard Worker 16*1208bc7eSAndroid Build Coastguard Worker /* List functions. */ 17*1208bc7eSAndroid Build Coastguard Worker #define ql_new(a_head) do { \ 18*1208bc7eSAndroid Build Coastguard Worker (a_head)->qlh_first = NULL; \ 19*1208bc7eSAndroid Build Coastguard Worker } while (0) 20*1208bc7eSAndroid Build Coastguard Worker 21*1208bc7eSAndroid Build Coastguard Worker #define ql_elm_new(a_elm, a_field) qr_new((a_elm), a_field) 22*1208bc7eSAndroid Build Coastguard Worker 23*1208bc7eSAndroid Build Coastguard Worker #define ql_first(a_head) ((a_head)->qlh_first) 24*1208bc7eSAndroid Build Coastguard Worker 25*1208bc7eSAndroid Build Coastguard Worker #define ql_last(a_head, a_field) \ 26*1208bc7eSAndroid Build Coastguard Worker ((ql_first(a_head) != NULL) \ 27*1208bc7eSAndroid Build Coastguard Worker ? qr_prev(ql_first(a_head), a_field) : NULL) 28*1208bc7eSAndroid Build Coastguard Worker 29*1208bc7eSAndroid Build Coastguard Worker #define ql_next(a_head, a_elm, a_field) \ 30*1208bc7eSAndroid Build Coastguard Worker ((ql_last(a_head, a_field) != (a_elm)) \ 31*1208bc7eSAndroid Build Coastguard Worker ? qr_next((a_elm), a_field) : NULL) 32*1208bc7eSAndroid Build Coastguard Worker 33*1208bc7eSAndroid Build Coastguard Worker #define ql_prev(a_head, a_elm, a_field) \ 34*1208bc7eSAndroid Build Coastguard Worker ((ql_first(a_head) != (a_elm)) ? qr_prev((a_elm), a_field) \ 35*1208bc7eSAndroid Build Coastguard Worker : NULL) 36*1208bc7eSAndroid Build Coastguard Worker 37*1208bc7eSAndroid Build Coastguard Worker #define ql_before_insert(a_head, a_qlelm, a_elm, a_field) do { \ 38*1208bc7eSAndroid Build Coastguard Worker qr_before_insert((a_qlelm), (a_elm), a_field); \ 39*1208bc7eSAndroid Build Coastguard Worker if (ql_first(a_head) == (a_qlelm)) { \ 40*1208bc7eSAndroid Build Coastguard Worker ql_first(a_head) = (a_elm); \ 41*1208bc7eSAndroid Build Coastguard Worker } \ 42*1208bc7eSAndroid Build Coastguard Worker } while (0) 43*1208bc7eSAndroid Build Coastguard Worker 44*1208bc7eSAndroid Build Coastguard Worker #define ql_after_insert(a_qlelm, a_elm, a_field) \ 45*1208bc7eSAndroid Build Coastguard Worker qr_after_insert((a_qlelm), (a_elm), a_field) 46*1208bc7eSAndroid Build Coastguard Worker 47*1208bc7eSAndroid Build Coastguard Worker #define ql_head_insert(a_head, a_elm, a_field) do { \ 48*1208bc7eSAndroid Build Coastguard Worker if (ql_first(a_head) != NULL) { \ 49*1208bc7eSAndroid Build Coastguard Worker qr_before_insert(ql_first(a_head), (a_elm), a_field); \ 50*1208bc7eSAndroid Build Coastguard Worker } \ 51*1208bc7eSAndroid Build Coastguard Worker ql_first(a_head) = (a_elm); \ 52*1208bc7eSAndroid Build Coastguard Worker } while (0) 53*1208bc7eSAndroid Build Coastguard Worker 54*1208bc7eSAndroid Build Coastguard Worker #define ql_tail_insert(a_head, a_elm, a_field) do { \ 55*1208bc7eSAndroid Build Coastguard Worker if (ql_first(a_head) != NULL) { \ 56*1208bc7eSAndroid Build Coastguard Worker qr_before_insert(ql_first(a_head), (a_elm), a_field); \ 57*1208bc7eSAndroid Build Coastguard Worker } \ 58*1208bc7eSAndroid Build Coastguard Worker ql_first(a_head) = qr_next((a_elm), a_field); \ 59*1208bc7eSAndroid Build Coastguard Worker } while (0) 60*1208bc7eSAndroid Build Coastguard Worker 61*1208bc7eSAndroid Build Coastguard Worker #define ql_remove(a_head, a_elm, a_field) do { \ 62*1208bc7eSAndroid Build Coastguard Worker if (ql_first(a_head) == (a_elm)) { \ 63*1208bc7eSAndroid Build Coastguard Worker ql_first(a_head) = qr_next(ql_first(a_head), a_field); \ 64*1208bc7eSAndroid Build Coastguard Worker } \ 65*1208bc7eSAndroid Build Coastguard Worker if (ql_first(a_head) != (a_elm)) { \ 66*1208bc7eSAndroid Build Coastguard Worker qr_remove((a_elm), a_field); \ 67*1208bc7eSAndroid Build Coastguard Worker } else { \ 68*1208bc7eSAndroid Build Coastguard Worker ql_first(a_head) = NULL; \ 69*1208bc7eSAndroid Build Coastguard Worker } \ 70*1208bc7eSAndroid Build Coastguard Worker } while (0) 71*1208bc7eSAndroid Build Coastguard Worker 72*1208bc7eSAndroid Build Coastguard Worker #define ql_head_remove(a_head, a_type, a_field) do { \ 73*1208bc7eSAndroid Build Coastguard Worker a_type *t = ql_first(a_head); \ 74*1208bc7eSAndroid Build Coastguard Worker ql_remove((a_head), t, a_field); \ 75*1208bc7eSAndroid Build Coastguard Worker } while (0) 76*1208bc7eSAndroid Build Coastguard Worker 77*1208bc7eSAndroid Build Coastguard Worker #define ql_tail_remove(a_head, a_type, a_field) do { \ 78*1208bc7eSAndroid Build Coastguard Worker a_type *t = ql_last(a_head, a_field); \ 79*1208bc7eSAndroid Build Coastguard Worker ql_remove((a_head), t, a_field); \ 80*1208bc7eSAndroid Build Coastguard Worker } while (0) 81*1208bc7eSAndroid Build Coastguard Worker 82*1208bc7eSAndroid Build Coastguard Worker #define ql_foreach(a_var, a_head, a_field) \ 83*1208bc7eSAndroid Build Coastguard Worker qr_foreach((a_var), ql_first(a_head), a_field) 84*1208bc7eSAndroid Build Coastguard Worker 85*1208bc7eSAndroid Build Coastguard Worker #define ql_reverse_foreach(a_var, a_head, a_field) \ 86*1208bc7eSAndroid Build Coastguard Worker qr_reverse_foreach((a_var), ql_first(a_head), a_field) 87*1208bc7eSAndroid Build Coastguard Worker 88*1208bc7eSAndroid Build Coastguard Worker #endif /* JEMALLOC_INTERNAL_QL_H */ 89