1*1f0a49e8SJason Evans #define JEMALLOC_WITNESS_C_ 2*1f0a49e8SJason Evans #include "jemalloc/internal/jemalloc_internal.h" 3*1f0a49e8SJason Evans 4*1f0a49e8SJason Evans void 5*1f0a49e8SJason Evans witness_init(witness_t *witness, const char *name, witness_rank_t rank, 6*1f0a49e8SJason Evans witness_comp_t *comp) 7*1f0a49e8SJason Evans { 8*1f0a49e8SJason Evans 9*1f0a49e8SJason Evans witness->name = name; 10*1f0a49e8SJason Evans witness->rank = rank; 11*1f0a49e8SJason Evans witness->comp = comp; 12*1f0a49e8SJason Evans } 13*1f0a49e8SJason Evans 14*1f0a49e8SJason Evans #ifdef JEMALLOC_JET 15*1f0a49e8SJason Evans #undef witness_lock_error 16*1f0a49e8SJason Evans #define witness_lock_error JEMALLOC_N(n_witness_lock_error) 17*1f0a49e8SJason Evans #endif 18*1f0a49e8SJason Evans void 19*1f0a49e8SJason Evans witness_lock_error(const witness_list_t *witnesses, const witness_t *witness) 20*1f0a49e8SJason Evans { 21*1f0a49e8SJason Evans witness_t *w; 22*1f0a49e8SJason Evans 23*1f0a49e8SJason Evans malloc_printf("<jemalloc>: Lock rank order reversal:"); 24*1f0a49e8SJason Evans ql_foreach(w, witnesses, link) { 25*1f0a49e8SJason Evans malloc_printf(" %s(%u)", w->name, w->rank); 26*1f0a49e8SJason Evans } 27*1f0a49e8SJason Evans malloc_printf(" %s(%u)\n", witness->name, witness->rank); 28*1f0a49e8SJason Evans abort(); 29*1f0a49e8SJason Evans } 30*1f0a49e8SJason Evans #ifdef JEMALLOC_JET 31*1f0a49e8SJason Evans #undef witness_lock_error 32*1f0a49e8SJason Evans #define witness_lock_error JEMALLOC_N(witness_lock_error) 33*1f0a49e8SJason Evans witness_lock_error_t *witness_lock_error = JEMALLOC_N(n_witness_lock_error); 34*1f0a49e8SJason Evans #endif 35*1f0a49e8SJason Evans 36*1f0a49e8SJason Evans #ifdef JEMALLOC_JET 37*1f0a49e8SJason Evans #undef witness_owner_error 38*1f0a49e8SJason Evans #define witness_owner_error JEMALLOC_N(n_witness_owner_error) 39*1f0a49e8SJason Evans #endif 40*1f0a49e8SJason Evans void 41*1f0a49e8SJason Evans witness_owner_error(const witness_t *witness) 42*1f0a49e8SJason Evans { 43*1f0a49e8SJason Evans 44*1f0a49e8SJason Evans malloc_printf("<jemalloc>: Should own %s(%u)\n", witness->name, 45*1f0a49e8SJason Evans witness->rank); 46*1f0a49e8SJason Evans abort(); 47*1f0a49e8SJason Evans } 48*1f0a49e8SJason Evans #ifdef JEMALLOC_JET 49*1f0a49e8SJason Evans #undef witness_owner_error 50*1f0a49e8SJason Evans #define witness_owner_error JEMALLOC_N(witness_owner_error) 51*1f0a49e8SJason Evans witness_owner_error_t *witness_owner_error = JEMALLOC_N(n_witness_owner_error); 52*1f0a49e8SJason Evans #endif 53*1f0a49e8SJason Evans 54*1f0a49e8SJason Evans #ifdef JEMALLOC_JET 55*1f0a49e8SJason Evans #undef witness_not_owner_error 56*1f0a49e8SJason Evans #define witness_not_owner_error JEMALLOC_N(n_witness_not_owner_error) 57*1f0a49e8SJason Evans #endif 58*1f0a49e8SJason Evans void 59*1f0a49e8SJason Evans witness_not_owner_error(const witness_t *witness) 60*1f0a49e8SJason Evans { 61*1f0a49e8SJason Evans 62*1f0a49e8SJason Evans malloc_printf("<jemalloc>: Should not own %s(%u)\n", witness->name, 63*1f0a49e8SJason Evans witness->rank); 64*1f0a49e8SJason Evans abort(); 65*1f0a49e8SJason Evans } 66*1f0a49e8SJason Evans #ifdef JEMALLOC_JET 67*1f0a49e8SJason Evans #undef witness_not_owner_error 68*1f0a49e8SJason Evans #define witness_not_owner_error JEMALLOC_N(witness_not_owner_error) 69*1f0a49e8SJason Evans witness_not_owner_error_t *witness_not_owner_error = 70*1f0a49e8SJason Evans JEMALLOC_N(n_witness_not_owner_error); 71*1f0a49e8SJason Evans #endif 72*1f0a49e8SJason Evans 73*1f0a49e8SJason Evans #ifdef JEMALLOC_JET 74*1f0a49e8SJason Evans #undef witness_lockless_error 75*1f0a49e8SJason Evans #define witness_lockless_error JEMALLOC_N(n_witness_lockless_error) 76*1f0a49e8SJason Evans #endif 77*1f0a49e8SJason Evans void 78*1f0a49e8SJason Evans witness_lockless_error(const witness_list_t *witnesses) 79*1f0a49e8SJason Evans { 80*1f0a49e8SJason Evans witness_t *w; 81*1f0a49e8SJason Evans 82*1f0a49e8SJason Evans malloc_printf("<jemalloc>: Should not own any locks:"); 83*1f0a49e8SJason Evans ql_foreach(w, witnesses, link) { 84*1f0a49e8SJason Evans malloc_printf(" %s(%u)", w->name, w->rank); 85*1f0a49e8SJason Evans } 86*1f0a49e8SJason Evans malloc_printf("\n"); 87*1f0a49e8SJason Evans abort(); 88*1f0a49e8SJason Evans } 89*1f0a49e8SJason Evans #ifdef JEMALLOC_JET 90*1f0a49e8SJason Evans #undef witness_lockless_error 91*1f0a49e8SJason Evans #define witness_lockless_error JEMALLOC_N(witness_lockless_error) 92*1f0a49e8SJason Evans witness_lockless_error_t *witness_lockless_error = 93*1f0a49e8SJason Evans JEMALLOC_N(n_witness_lockless_error); 94*1f0a49e8SJason Evans #endif 95*1f0a49e8SJason Evans 96*1f0a49e8SJason Evans void 97*1f0a49e8SJason Evans witnesses_cleanup(tsd_t *tsd) 98*1f0a49e8SJason Evans { 99*1f0a49e8SJason Evans 100*1f0a49e8SJason Evans witness_assert_lockless(tsd_tsdn(tsd)); 101*1f0a49e8SJason Evans 102*1f0a49e8SJason Evans /* Do nothing. */ 103*1f0a49e8SJason Evans } 104*1f0a49e8SJason Evans 105*1f0a49e8SJason Evans void 106*1f0a49e8SJason Evans witness_fork_cleanup(tsd_t *tsd) 107*1f0a49e8SJason Evans { 108*1f0a49e8SJason Evans 109*1f0a49e8SJason Evans /* Do nothing. */ 110*1f0a49e8SJason Evans } 111*1f0a49e8SJason Evans 112*1f0a49e8SJason Evans void 113*1f0a49e8SJason Evans witness_prefork(tsd_t *tsd) 114*1f0a49e8SJason Evans { 115*1f0a49e8SJason Evans 116*1f0a49e8SJason Evans tsd_witness_fork_set(tsd, true); 117*1f0a49e8SJason Evans } 118*1f0a49e8SJason Evans 119*1f0a49e8SJason Evans void 120*1f0a49e8SJason Evans witness_postfork_parent(tsd_t *tsd) 121*1f0a49e8SJason Evans { 122*1f0a49e8SJason Evans 123*1f0a49e8SJason Evans tsd_witness_fork_set(tsd, false); 124*1f0a49e8SJason Evans } 125*1f0a49e8SJason Evans 126*1f0a49e8SJason Evans void 127*1f0a49e8SJason Evans witness_postfork_child(tsd_t *tsd) 128*1f0a49e8SJason Evans { 129*1f0a49e8SJason Evans #ifndef JEMALLOC_MUTEX_INIT_CB 130*1f0a49e8SJason Evans witness_list_t *witnesses; 131*1f0a49e8SJason Evans 132*1f0a49e8SJason Evans witnesses = tsd_witnessesp_get(tsd); 133*1f0a49e8SJason Evans ql_new(witnesses); 134*1f0a49e8SJason Evans #endif 135*1f0a49e8SJason Evans tsd_witness_fork_set(tsd, false); 136*1f0a49e8SJason Evans } 137