1*1208bc7eSAndroid Build Coastguard Worker #ifndef JEMALLOC_INTERNAL_QR_H 2*1208bc7eSAndroid Build Coastguard Worker #define JEMALLOC_INTERNAL_QR_H 3*1208bc7eSAndroid Build Coastguard Worker 4*1208bc7eSAndroid Build Coastguard Worker /* Ring definitions. */ 5*1208bc7eSAndroid Build Coastguard Worker #define qr(a_type) \ 6*1208bc7eSAndroid Build Coastguard Worker struct { \ 7*1208bc7eSAndroid Build Coastguard Worker a_type *qre_next; \ 8*1208bc7eSAndroid Build Coastguard Worker a_type *qre_prev; \ 9*1208bc7eSAndroid Build Coastguard Worker } 10*1208bc7eSAndroid Build Coastguard Worker 11*1208bc7eSAndroid Build Coastguard Worker /* Ring functions. */ 12*1208bc7eSAndroid Build Coastguard Worker #define qr_new(a_qr, a_field) do { \ 13*1208bc7eSAndroid Build Coastguard Worker (a_qr)->a_field.qre_next = (a_qr); \ 14*1208bc7eSAndroid Build Coastguard Worker (a_qr)->a_field.qre_prev = (a_qr); \ 15*1208bc7eSAndroid Build Coastguard Worker } while (0) 16*1208bc7eSAndroid Build Coastguard Worker 17*1208bc7eSAndroid Build Coastguard Worker #define qr_next(a_qr, a_field) ((a_qr)->a_field.qre_next) 18*1208bc7eSAndroid Build Coastguard Worker 19*1208bc7eSAndroid Build Coastguard Worker #define qr_prev(a_qr, a_field) ((a_qr)->a_field.qre_prev) 20*1208bc7eSAndroid Build Coastguard Worker 21*1208bc7eSAndroid Build Coastguard Worker #define qr_before_insert(a_qrelm, a_qr, a_field) do { \ 22*1208bc7eSAndroid Build Coastguard Worker (a_qr)->a_field.qre_prev = (a_qrelm)->a_field.qre_prev; \ 23*1208bc7eSAndroid Build Coastguard Worker (a_qr)->a_field.qre_next = (a_qrelm); \ 24*1208bc7eSAndroid Build Coastguard Worker (a_qr)->a_field.qre_prev->a_field.qre_next = (a_qr); \ 25*1208bc7eSAndroid Build Coastguard Worker (a_qrelm)->a_field.qre_prev = (a_qr); \ 26*1208bc7eSAndroid Build Coastguard Worker } while (0) 27*1208bc7eSAndroid Build Coastguard Worker 28*1208bc7eSAndroid Build Coastguard Worker #define qr_after_insert(a_qrelm, a_qr, a_field) do { \ 29*1208bc7eSAndroid Build Coastguard Worker (a_qr)->a_field.qre_next = (a_qrelm)->a_field.qre_next; \ 30*1208bc7eSAndroid Build Coastguard Worker (a_qr)->a_field.qre_prev = (a_qrelm); \ 31*1208bc7eSAndroid Build Coastguard Worker (a_qr)->a_field.qre_next->a_field.qre_prev = (a_qr); \ 32*1208bc7eSAndroid Build Coastguard Worker (a_qrelm)->a_field.qre_next = (a_qr); \ 33*1208bc7eSAndroid Build Coastguard Worker } while (0) 34*1208bc7eSAndroid Build Coastguard Worker 35*1208bc7eSAndroid Build Coastguard Worker #define qr_meld(a_qr_a, a_qr_b, a_type, a_field) do { \ 36*1208bc7eSAndroid Build Coastguard Worker a_type *t; \ 37*1208bc7eSAndroid Build Coastguard Worker (a_qr_a)->a_field.qre_prev->a_field.qre_next = (a_qr_b); \ 38*1208bc7eSAndroid Build Coastguard Worker (a_qr_b)->a_field.qre_prev->a_field.qre_next = (a_qr_a); \ 39*1208bc7eSAndroid Build Coastguard Worker t = (a_qr_a)->a_field.qre_prev; \ 40*1208bc7eSAndroid Build Coastguard Worker (a_qr_a)->a_field.qre_prev = (a_qr_b)->a_field.qre_prev; \ 41*1208bc7eSAndroid Build Coastguard Worker (a_qr_b)->a_field.qre_prev = t; \ 42*1208bc7eSAndroid Build Coastguard Worker } while (0) 43*1208bc7eSAndroid Build Coastguard Worker 44*1208bc7eSAndroid Build Coastguard Worker /* 45*1208bc7eSAndroid Build Coastguard Worker * qr_meld() and qr_split() are functionally equivalent, so there's no need to 46*1208bc7eSAndroid Build Coastguard Worker * have two copies of the code. 47*1208bc7eSAndroid Build Coastguard Worker */ 48*1208bc7eSAndroid Build Coastguard Worker #define qr_split(a_qr_a, a_qr_b, a_type, a_field) \ 49*1208bc7eSAndroid Build Coastguard Worker qr_meld((a_qr_a), (a_qr_b), a_type, a_field) 50*1208bc7eSAndroid Build Coastguard Worker 51*1208bc7eSAndroid Build Coastguard Worker #define qr_remove(a_qr, a_field) do { \ 52*1208bc7eSAndroid Build Coastguard Worker (a_qr)->a_field.qre_prev->a_field.qre_next \ 53*1208bc7eSAndroid Build Coastguard Worker = (a_qr)->a_field.qre_next; \ 54*1208bc7eSAndroid Build Coastguard Worker (a_qr)->a_field.qre_next->a_field.qre_prev \ 55*1208bc7eSAndroid Build Coastguard Worker = (a_qr)->a_field.qre_prev; \ 56*1208bc7eSAndroid Build Coastguard Worker (a_qr)->a_field.qre_next = (a_qr); \ 57*1208bc7eSAndroid Build Coastguard Worker (a_qr)->a_field.qre_prev = (a_qr); \ 58*1208bc7eSAndroid Build Coastguard Worker } while (0) 59*1208bc7eSAndroid Build Coastguard Worker 60*1208bc7eSAndroid Build Coastguard Worker #define qr_foreach(var, a_qr, a_field) \ 61*1208bc7eSAndroid Build Coastguard Worker for ((var) = (a_qr); \ 62*1208bc7eSAndroid Build Coastguard Worker (var) != NULL; \ 63*1208bc7eSAndroid Build Coastguard Worker (var) = (((var)->a_field.qre_next != (a_qr)) \ 64*1208bc7eSAndroid Build Coastguard Worker ? (var)->a_field.qre_next : NULL)) 65*1208bc7eSAndroid Build Coastguard Worker 66*1208bc7eSAndroid Build Coastguard Worker #define qr_reverse_foreach(var, a_qr, a_field) \ 67*1208bc7eSAndroid Build Coastguard Worker for ((var) = ((a_qr) != NULL) ? qr_prev(a_qr, a_field) : NULL; \ 68*1208bc7eSAndroid Build Coastguard Worker (var) != NULL; \ 69*1208bc7eSAndroid Build Coastguard Worker (var) = (((var) != (a_qr)) \ 70*1208bc7eSAndroid Build Coastguard Worker ? (var)->a_field.qre_prev : NULL)) 71*1208bc7eSAndroid Build Coastguard Worker 72*1208bc7eSAndroid Build Coastguard Worker #endif /* JEMALLOC_INTERNAL_QR_H */ 73