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