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