11f0a49e8SJason Evans #define JEMALLOC_WITNESS_C_ 21f0a49e8SJason Evans #include "jemalloc/internal/jemalloc_internal.h" 31f0a49e8SJason Evans 41f0a49e8SJason Evans void 51f0a49e8SJason Evans witness_init(witness_t *witness, const char *name, witness_rank_t rank, 61f0a49e8SJason Evans witness_comp_t *comp) 71f0a49e8SJason Evans { 81f0a49e8SJason Evans 91f0a49e8SJason Evans witness->name = name; 101f0a49e8SJason Evans witness->rank = rank; 111f0a49e8SJason Evans witness->comp = comp; 121f0a49e8SJason Evans } 131f0a49e8SJason Evans 141f0a49e8SJason Evans #ifdef JEMALLOC_JET 151f0a49e8SJason Evans #undef witness_lock_error 161f0a49e8SJason Evans #define witness_lock_error JEMALLOC_N(n_witness_lock_error) 171f0a49e8SJason Evans #endif 181f0a49e8SJason Evans void 191f0a49e8SJason Evans witness_lock_error(const witness_list_t *witnesses, const witness_t *witness) 201f0a49e8SJason Evans { 211f0a49e8SJason Evans witness_t *w; 221f0a49e8SJason Evans 231f0a49e8SJason Evans malloc_printf("<jemalloc>: Lock rank order reversal:"); 241f0a49e8SJason Evans ql_foreach(w, witnesses, link) { 251f0a49e8SJason Evans malloc_printf(" %s(%u)", w->name, w->rank); 261f0a49e8SJason Evans } 271f0a49e8SJason Evans malloc_printf(" %s(%u)\n", witness->name, witness->rank); 281f0a49e8SJason Evans abort(); 291f0a49e8SJason Evans } 301f0a49e8SJason Evans #ifdef JEMALLOC_JET 311f0a49e8SJason Evans #undef witness_lock_error 321f0a49e8SJason Evans #define witness_lock_error JEMALLOC_N(witness_lock_error) 331f0a49e8SJason Evans witness_lock_error_t *witness_lock_error = JEMALLOC_N(n_witness_lock_error); 341f0a49e8SJason Evans #endif 351f0a49e8SJason Evans 361f0a49e8SJason Evans #ifdef JEMALLOC_JET 371f0a49e8SJason Evans #undef witness_owner_error 381f0a49e8SJason Evans #define witness_owner_error JEMALLOC_N(n_witness_owner_error) 391f0a49e8SJason Evans #endif 401f0a49e8SJason Evans void 411f0a49e8SJason Evans witness_owner_error(const witness_t *witness) 421f0a49e8SJason Evans { 431f0a49e8SJason Evans 441f0a49e8SJason Evans malloc_printf("<jemalloc>: Should own %s(%u)\n", witness->name, 451f0a49e8SJason Evans witness->rank); 461f0a49e8SJason Evans abort(); 471f0a49e8SJason Evans } 481f0a49e8SJason Evans #ifdef JEMALLOC_JET 491f0a49e8SJason Evans #undef witness_owner_error 501f0a49e8SJason Evans #define witness_owner_error JEMALLOC_N(witness_owner_error) 511f0a49e8SJason Evans witness_owner_error_t *witness_owner_error = JEMALLOC_N(n_witness_owner_error); 521f0a49e8SJason Evans #endif 531f0a49e8SJason Evans 541f0a49e8SJason Evans #ifdef JEMALLOC_JET 551f0a49e8SJason Evans #undef witness_not_owner_error 561f0a49e8SJason Evans #define witness_not_owner_error JEMALLOC_N(n_witness_not_owner_error) 571f0a49e8SJason Evans #endif 581f0a49e8SJason Evans void 591f0a49e8SJason Evans witness_not_owner_error(const witness_t *witness) 601f0a49e8SJason Evans { 611f0a49e8SJason Evans 621f0a49e8SJason Evans malloc_printf("<jemalloc>: Should not own %s(%u)\n", witness->name, 631f0a49e8SJason Evans witness->rank); 641f0a49e8SJason Evans abort(); 651f0a49e8SJason Evans } 661f0a49e8SJason Evans #ifdef JEMALLOC_JET 671f0a49e8SJason Evans #undef witness_not_owner_error 681f0a49e8SJason Evans #define witness_not_owner_error JEMALLOC_N(witness_not_owner_error) 691f0a49e8SJason Evans witness_not_owner_error_t *witness_not_owner_error = 701f0a49e8SJason Evans JEMALLOC_N(n_witness_not_owner_error); 711f0a49e8SJason Evans #endif 721f0a49e8SJason Evans 731f0a49e8SJason Evans #ifdef JEMALLOC_JET 74*8244f2aaSJason Evans #undef witness_depth_error 75*8244f2aaSJason Evans #define witness_depth_error JEMALLOC_N(n_witness_depth_error) 761f0a49e8SJason Evans #endif 771f0a49e8SJason Evans void 78*8244f2aaSJason Evans witness_depth_error(const witness_list_t *witnesses, 79*8244f2aaSJason Evans witness_rank_t rank_inclusive, unsigned depth) { 801f0a49e8SJason Evans witness_t *w; 811f0a49e8SJason Evans 82*8244f2aaSJason Evans malloc_printf("<jemalloc>: Should own %u lock%s of rank >= %u:", depth, 83*8244f2aaSJason Evans (depth != 1) ? "s" : "", rank_inclusive); 841f0a49e8SJason Evans ql_foreach(w, witnesses, link) { 851f0a49e8SJason Evans malloc_printf(" %s(%u)", w->name, w->rank); 861f0a49e8SJason Evans } 871f0a49e8SJason Evans malloc_printf("\n"); 881f0a49e8SJason Evans abort(); 891f0a49e8SJason Evans } 901f0a49e8SJason Evans #ifdef JEMALLOC_JET 91*8244f2aaSJason Evans #undef witness_depth_error 92*8244f2aaSJason Evans #define witness_depth_error JEMALLOC_N(witness_depth_error) 93*8244f2aaSJason Evans witness_depth_error_t *witness_depth_error = JEMALLOC_N(n_witness_depth_error); 941f0a49e8SJason Evans #endif 951f0a49e8SJason Evans 961f0a49e8SJason Evans void 971f0a49e8SJason Evans witnesses_cleanup(tsd_t *tsd) 981f0a49e8SJason Evans { 991f0a49e8SJason Evans 1001f0a49e8SJason Evans witness_assert_lockless(tsd_tsdn(tsd)); 1011f0a49e8SJason Evans 1021f0a49e8SJason Evans /* Do nothing. */ 1031f0a49e8SJason Evans } 1041f0a49e8SJason Evans 1051f0a49e8SJason Evans void 1061f0a49e8SJason Evans witness_fork_cleanup(tsd_t *tsd) 1071f0a49e8SJason Evans { 1081f0a49e8SJason Evans 1091f0a49e8SJason Evans /* Do nothing. */ 1101f0a49e8SJason Evans } 1111f0a49e8SJason Evans 1121f0a49e8SJason Evans void 1131f0a49e8SJason Evans witness_prefork(tsd_t *tsd) 1141f0a49e8SJason Evans { 1151f0a49e8SJason Evans 1161f0a49e8SJason Evans tsd_witness_fork_set(tsd, true); 1171f0a49e8SJason Evans } 1181f0a49e8SJason Evans 1191f0a49e8SJason Evans void 1201f0a49e8SJason Evans witness_postfork_parent(tsd_t *tsd) 1211f0a49e8SJason Evans { 1221f0a49e8SJason Evans 1231f0a49e8SJason Evans tsd_witness_fork_set(tsd, false); 1241f0a49e8SJason Evans } 1251f0a49e8SJason Evans 1261f0a49e8SJason Evans void 1271f0a49e8SJason Evans witness_postfork_child(tsd_t *tsd) 1281f0a49e8SJason Evans { 1291f0a49e8SJason Evans #ifndef JEMALLOC_MUTEX_INIT_CB 1301f0a49e8SJason Evans witness_list_t *witnesses; 1311f0a49e8SJason Evans 1321f0a49e8SJason Evans witnesses = tsd_witnessesp_get(tsd); 1331f0a49e8SJason Evans ql_new(witnesses); 1341f0a49e8SJason Evans #endif 1351f0a49e8SJason Evans tsd_witness_fork_set(tsd, false); 1361f0a49e8SJason Evans } 137