blob: 1c03457e043e2a280b9db133af840a17d42d7c6d [file] [log] [blame]
Jason Evansc0cc5db2017-01-19 21:41:41 -08001#define JEMALLOC_WITNESS_C_
Jason Evansb2c0d632016-04-13 23:36:15 -07002#include "jemalloc/internal/jemalloc_internal.h"
3
4void
5witness_init(witness_t *witness, const char *name, witness_rank_t rank,
Jason Evansc4c25922017-01-15 16:56:30 -08006 witness_comp_t *comp, void *opaque) {
Jason Evansb2c0d632016-04-13 23:36:15 -07007 witness->name = name;
8 witness->rank = rank;
9 witness->comp = comp;
Jason Evanse75e9be2016-04-17 12:55:10 -070010 witness->opaque = opaque;
Jason Evansb2c0d632016-04-13 23:36:15 -070011}
12
13#ifdef JEMALLOC_JET
14#undef witness_lock_error
Jason Evansc0cc5db2017-01-19 21:41:41 -080015#define witness_lock_error JEMALLOC_N(n_witness_lock_error)
Jason Evansb2c0d632016-04-13 23:36:15 -070016#endif
Jason Evans73d3d582016-05-11 15:33:28 -070017void
Jason Evansc4c25922017-01-15 16:56:30 -080018witness_lock_error(const witness_list_t *witnesses, const witness_t *witness) {
Jason Evansb2c0d632016-04-13 23:36:15 -070019 witness_t *w;
20
21 malloc_printf("<jemalloc>: Lock rank order reversal:");
22 ql_foreach(w, witnesses, link) {
23 malloc_printf(" %s(%u)", w->name, w->rank);
24 }
25 malloc_printf(" %s(%u)\n", witness->name, witness->rank);
26 abort();
27}
28#ifdef JEMALLOC_JET
29#undef witness_lock_error
Jason Evansc0cc5db2017-01-19 21:41:41 -080030#define witness_lock_error JEMALLOC_N(witness_lock_error)
Jason Evans0fc13172016-05-11 16:14:20 -070031witness_lock_error_t *witness_lock_error = JEMALLOC_N(n_witness_lock_error);
Jason Evansb2c0d632016-04-13 23:36:15 -070032#endif
33
Jason Evansb2c0d632016-04-13 23:36:15 -070034#ifdef JEMALLOC_JET
35#undef witness_owner_error
Jason Evansc0cc5db2017-01-19 21:41:41 -080036#define witness_owner_error JEMALLOC_N(n_witness_owner_error)
Jason Evansb2c0d632016-04-13 23:36:15 -070037#endif
Jason Evans73d3d582016-05-11 15:33:28 -070038void
Jason Evansc4c25922017-01-15 16:56:30 -080039witness_owner_error(const witness_t *witness) {
Jason Evansb2c0d632016-04-13 23:36:15 -070040 malloc_printf("<jemalloc>: Should own %s(%u)\n", witness->name,
41 witness->rank);
42 abort();
43}
44#ifdef JEMALLOC_JET
45#undef witness_owner_error
Jason Evansc0cc5db2017-01-19 21:41:41 -080046#define witness_owner_error JEMALLOC_N(witness_owner_error)
Jason Evans0fc13172016-05-11 16:14:20 -070047witness_owner_error_t *witness_owner_error = JEMALLOC_N(n_witness_owner_error);
Jason Evansb2c0d632016-04-13 23:36:15 -070048#endif
49
Jason Evansb2c0d632016-04-13 23:36:15 -070050#ifdef JEMALLOC_JET
51#undef witness_not_owner_error
Jason Evansc0cc5db2017-01-19 21:41:41 -080052#define witness_not_owner_error JEMALLOC_N(n_witness_not_owner_error)
Jason Evansb2c0d632016-04-13 23:36:15 -070053#endif
Jason Evans73d3d582016-05-11 15:33:28 -070054void
Jason Evansc4c25922017-01-15 16:56:30 -080055witness_not_owner_error(const witness_t *witness) {
Jason Evansb2c0d632016-04-13 23:36:15 -070056 malloc_printf("<jemalloc>: Should not own %s(%u)\n", witness->name,
57 witness->rank);
58 abort();
59}
60#ifdef JEMALLOC_JET
61#undef witness_not_owner_error
Jason Evansc0cc5db2017-01-19 21:41:41 -080062#define witness_not_owner_error JEMALLOC_N(witness_not_owner_error)
Jason Evansb2c0d632016-04-13 23:36:15 -070063witness_not_owner_error_t *witness_not_owner_error =
Jason Evans0fc13172016-05-11 16:14:20 -070064 JEMALLOC_N(n_witness_not_owner_error);
Jason Evansb2c0d632016-04-13 23:36:15 -070065#endif
66
Jason Evansb2c0d632016-04-13 23:36:15 -070067#ifdef JEMALLOC_JET
68#undef witness_lockless_error
Jason Evansc0cc5db2017-01-19 21:41:41 -080069#define witness_lockless_error JEMALLOC_N(n_witness_lockless_error)
Jason Evansb2c0d632016-04-13 23:36:15 -070070#endif
Jason Evans73d3d582016-05-11 15:33:28 -070071void
Jason Evansc4c25922017-01-15 16:56:30 -080072witness_lockless_error(const witness_list_t *witnesses) {
Jason Evansb2c0d632016-04-13 23:36:15 -070073 witness_t *w;
74
75 malloc_printf("<jemalloc>: Should not own any locks:");
76 ql_foreach(w, witnesses, link) {
77 malloc_printf(" %s(%u)", w->name, w->rank);
78 }
79 malloc_printf("\n");
80 abort();
81}
82#ifdef JEMALLOC_JET
83#undef witness_lockless_error
Jason Evansc0cc5db2017-01-19 21:41:41 -080084#define witness_lockless_error JEMALLOC_N(witness_lockless_error)
Jason Evansb2c0d632016-04-13 23:36:15 -070085witness_lockless_error_t *witness_lockless_error =
Jason Evans0fc13172016-05-11 16:14:20 -070086 JEMALLOC_N(n_witness_lockless_error);
Jason Evansb2c0d632016-04-13 23:36:15 -070087#endif
88
89void
Jason Evansc4c25922017-01-15 16:56:30 -080090witnesses_cleanup(tsd_t *tsd) {
Jason Evansc1e00ef2016-05-10 22:21:10 -070091 witness_assert_lockless(tsd_tsdn(tsd));
Jason Evansb2c0d632016-04-13 23:36:15 -070092
93 /* Do nothing. */
94}
Jason Evans174c0c32016-04-25 23:14:40 -070095
96void
Jason Evansc4c25922017-01-15 16:56:30 -080097witness_prefork(tsd_t *tsd) {
Jason Evans174c0c32016-04-25 23:14:40 -070098 tsd_witness_fork_set(tsd, true);
99}
100
101void
Jason Evansc4c25922017-01-15 16:56:30 -0800102witness_postfork_parent(tsd_t *tsd) {
Jason Evans174c0c32016-04-25 23:14:40 -0700103 tsd_witness_fork_set(tsd, false);
104}
Jason Evans108c4a12016-04-26 10:47:22 -0700105
106void
Jason Evansc4c25922017-01-15 16:56:30 -0800107witness_postfork_child(tsd_t *tsd) {
Jason Evans108c4a12016-04-26 10:47:22 -0700108#ifndef JEMALLOC_MUTEX_INIT_CB
109 witness_list_t *witnesses;
110
111 witnesses = tsd_witnessesp_get(tsd);
112 ql_new(witnesses);
113#endif
114 tsd_witness_fork_set(tsd, false);
115}