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