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, void *opaque)
7{
8	witness->name = name;
9	witness->rank = rank;
10	witness->comp = comp;
11	witness->opaque = opaque;
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	malloc_printf("<jemalloc>: Should own %s(%u)\n", witness->name,
44	    witness->rank);
45	abort();
46}
47#ifdef JEMALLOC_JET
48#undef witness_owner_error
49#define	witness_owner_error JEMALLOC_N(witness_owner_error)
50witness_owner_error_t *witness_owner_error = JEMALLOC_N(n_witness_owner_error);
51#endif
52
53#ifdef JEMALLOC_JET
54#undef witness_not_owner_error
55#define	witness_not_owner_error JEMALLOC_N(n_witness_not_owner_error)
56#endif
57void
58witness_not_owner_error(const witness_t *witness)
59{
60	malloc_printf("<jemalloc>: Should not own %s(%u)\n", witness->name,
61	    witness->rank);
62	abort();
63}
64#ifdef JEMALLOC_JET
65#undef witness_not_owner_error
66#define	witness_not_owner_error JEMALLOC_N(witness_not_owner_error)
67witness_not_owner_error_t *witness_not_owner_error =
68    JEMALLOC_N(n_witness_not_owner_error);
69#endif
70
71#ifdef JEMALLOC_JET
72#undef witness_lockless_error
73#define	witness_lockless_error JEMALLOC_N(n_witness_lockless_error)
74#endif
75void
76witness_lockless_error(const witness_list_t *witnesses)
77{
78	witness_t *w;
79
80	malloc_printf("<jemalloc>: Should not own any locks:");
81	ql_foreach(w, witnesses, link) {
82		malloc_printf(" %s(%u)", w->name, w->rank);
83	}
84	malloc_printf("\n");
85	abort();
86}
87#ifdef JEMALLOC_JET
88#undef witness_lockless_error
89#define	witness_lockless_error JEMALLOC_N(witness_lockless_error)
90witness_lockless_error_t *witness_lockless_error =
91    JEMALLOC_N(n_witness_lockless_error);
92#endif
93
94void
95witnesses_cleanup(tsd_t *tsd)
96{
97	witness_assert_lockless(tsd_tsdn(tsd));
98
99	/* Do nothing. */
100}
101
102void
103witness_prefork(tsd_t *tsd)
104{
105	tsd_witness_fork_set(tsd, true);
106}
107
108void
109witness_postfork_parent(tsd_t *tsd)
110{
111	tsd_witness_fork_set(tsd, false);
112}
113
114void
115witness_postfork_child(tsd_t *tsd)
116{
117#ifndef JEMALLOC_MUTEX_INIT_CB
118	witness_list_t *witnesses;
119
120	witnesses = tsd_witnessesp_get(tsd);
121	ql_new(witnesses);
122#endif
123	tsd_witness_fork_set(tsd, false);
124}
125