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