1#define JEMALLOC_WITNESS_C_
2#include "jemalloc/internal/jemalloc_internal.h"
3
4void
5witness_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
18void
19witness_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)
33witness_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
40void
41witness_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)
51witness_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
58void
59witness_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)
69witness_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
77void
78witness_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)
92witness_lockless_error_t *witness_lockless_error =
93 JEMALLOC_N(n_witness_lockless_error);
94#endif
95
96void
97witnesses_cleanup(tsd_t *tsd)
98{
99
100 witness_assert_lockless(tsd_tsdn(tsd));
101
102 /* Do nothing. */
103}
104
105void
106witness_fork_cleanup(tsd_t *tsd)
107{
108
109 /* Do nothing. */
110}
111
112void
113witness_prefork(tsd_t *tsd)
114{
115
116 tsd_witness_fork_set(tsd, true);
117}
118
119void
120witness_postfork_parent(tsd_t *tsd)
121{
122
123 tsd_witness_fork_set(tsd, false);
124}
125
126void
127witness_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