• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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