1 #define JEMALLOC_WITNESS_C_
2 #include "jemalloc/internal/jemalloc_internal.h"
3
4 void
witness_init(witness_t * witness,const char * name,witness_rank_t rank,witness_comp_t * comp)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
witness_lock_error(const witness_list_t * witnesses,const witness_t * witness)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
witness_owner_error(const witness_t * witness)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
witness_not_owner_error(const witness_t * witness)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_lockless_error
75 #define witness_lockless_error JEMALLOC_N(n_witness_lockless_error)
76 #endif
77 void
witness_lockless_error(const witness_list_t * witnesses)78 witness_lockless_error(const witness_list_t *witnesses)
79 {
80 witness_t *w;
81
82 malloc_printf("<jemalloc>: Should not own any locks:");
83 ql_foreach(w, witnesses, link) {
84 malloc_printf(" %s(%u)", w->name, w->rank);
85 }
86 malloc_printf("\n");
87 abort();
88 }
89 #ifdef JEMALLOC_JET
90 #undef witness_lockless_error
91 #define witness_lockless_error JEMALLOC_N(witness_lockless_error)
92 witness_lockless_error_t *witness_lockless_error =
93 JEMALLOC_N(n_witness_lockless_error);
94 #endif
95
96 void
witnesses_cleanup(tsd_t * tsd)97 witnesses_cleanup(tsd_t *tsd)
98 {
99
100 witness_assert_lockless(tsd_tsdn(tsd));
101
102 /* Do nothing. */
103 }
104
105 void
witness_fork_cleanup(tsd_t * tsd)106 witness_fork_cleanup(tsd_t *tsd)
107 {
108
109 /* Do nothing. */
110 }
111
112 void
witness_prefork(tsd_t * tsd)113 witness_prefork(tsd_t *tsd)
114 {
115
116 tsd_witness_fork_set(tsd, true);
117 }
118
119 void
witness_postfork_parent(tsd_t * tsd)120 witness_postfork_parent(tsd_t *tsd)
121 {
122
123 tsd_witness_fork_set(tsd, false);
124 }
125
126 void
witness_postfork_child(tsd_t * tsd)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