xref: /freebsd/contrib/jemalloc/src/witness.c (revision 8244f2aa7cb3ce15f2d5ce7f860913d2e7cc784d)
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