18
18
19
19
#include < grpc/support/port_platform.h>
20
20
21
+ #include < grpc/support/alloc.h>
22
+
21
23
#ifdef GPR_POSIX_SYNC
22
24
23
25
#include < errno.h>
@@ -72,27 +74,53 @@ gpr_atm gpr_counter_atm_add = 0;
72
74
#endif
73
75
74
76
void gpr_mu_init (gpr_mu* mu) {
77
+ #ifdef GRPC_ASAN_ENABLED
78
+ GPR_ASSERT (pthread_mutex_init (&mu->mutex , nullptr ) == 0 );
79
+ mu->leak_checker = static_cast <int *>(gpr_malloc (sizeof (*mu->leak_checker )));
80
+ GPR_ASSERT (mu->leak_checker != nullptr );
81
+ #else
75
82
GPR_ASSERT (pthread_mutex_init (mu, nullptr ) == 0 );
83
+ #endif
76
84
}
77
85
78
- void gpr_mu_destroy (gpr_mu* mu) { GPR_ASSERT (pthread_mutex_destroy (mu) == 0 ); }
86
+ void gpr_mu_destroy (gpr_mu* mu) {
87
+ #ifdef GRPC_ASAN_ENABLED
88
+ GPR_ASSERT (pthread_mutex_destroy (&mu->mutex ) == 0 );
89
+ gpr_free (mu->leak_checker );
90
+ #else
91
+ GPR_ASSERT (pthread_mutex_destroy (mu) == 0 );
92
+ #endif
93
+ }
79
94
80
95
void gpr_mu_lock (gpr_mu* mu) {
81
96
#ifdef GPR_LOW_LEVEL_COUNTERS
82
97
GPR_ATM_INC_COUNTER (gpr_mu_locks);
83
98
#endif
84
99
GPR_TIMER_SCOPE (" gpr_mu_lock" , 0 );
100
+ #ifdef GRPC_ASAN_ENABLED
101
+ GPR_ASSERT (pthread_mutex_lock (&mu->mutex ) == 0 );
102
+ #else
85
103
GPR_ASSERT (pthread_mutex_lock (mu) == 0 );
104
+ #endif
86
105
}
87
106
88
107
void gpr_mu_unlock (gpr_mu* mu) {
89
108
GPR_TIMER_SCOPE (" gpr_mu_unlock" , 0 );
109
+ #ifdef GRPC_ASAN_ENABLED
110
+ GPR_ASSERT (pthread_mutex_unlock (&mu->mutex ) == 0 );
111
+ #else
90
112
GPR_ASSERT (pthread_mutex_unlock (mu) == 0 );
113
+ #endif
91
114
}
92
115
93
116
int gpr_mu_trylock (gpr_mu* mu) {
94
117
GPR_TIMER_SCOPE (" gpr_mu_trylock" , 0 );
95
- int err = pthread_mutex_trylock (mu);
118
+ int err = 0 ;
119
+ #ifdef GRPC_ASAN_ENABLED
120
+ err = pthread_mutex_trylock (&mu->mutex );
121
+ #else
122
+ err = pthread_mutex_trylock (mu);
123
+ #endif
96
124
GPR_ASSERT (err == 0 || err == EBUSY);
97
125
return err == 0 ;
98
126
}
@@ -105,10 +133,24 @@ void gpr_cv_init(gpr_cv* cv) {
105
133
#if GPR_LINUX
106
134
GPR_ASSERT (pthread_condattr_setclock (&attr, CLOCK_MONOTONIC) == 0 );
107
135
#endif // GPR_LINUX
136
+
137
+ #ifdef GRPC_ASAN_ENABLED
138
+ GPR_ASSERT (pthread_cond_init (&cv->cond_var , &attr) == 0 );
139
+ cv->leak_checker = static_cast <int *>(gpr_malloc (sizeof (*cv->leak_checker )));
140
+ GPR_ASSERT (cv->leak_checker != nullptr );
141
+ #else
108
142
GPR_ASSERT (pthread_cond_init (cv, &attr) == 0 );
143
+ #endif
109
144
}
110
145
111
- void gpr_cv_destroy (gpr_cv* cv) { GPR_ASSERT (pthread_cond_destroy (cv) == 0 ); }
146
+ void gpr_cv_destroy (gpr_cv* cv) {
147
+ #ifdef GRPC_ASAN_ENABLED
148
+ GPR_ASSERT (pthread_cond_destroy (&cv->cond_var ) == 0 );
149
+ gpr_free (cv->leak_checker );
150
+ #else
151
+ GPR_ASSERT (pthread_cond_destroy (cv) == 0 );
152
+ #endif
153
+ }
112
154
113
155
// For debug of the timer manager crash only.
114
156
// TODO (mxyan): remove after bug is fixed.
@@ -169,7 +211,11 @@ int gpr_cv_wait(gpr_cv* cv, gpr_mu* mu, gpr_timespec abs_deadline) {
169
211
#endif
170
212
if (gpr_time_cmp (abs_deadline, gpr_inf_future (abs_deadline.clock_type )) ==
171
213
0 ) {
214
+ #ifdef GRPC_ASAN_ENABLED
215
+ err = pthread_cond_wait (&cv->cond_var , &mu->mutex );
216
+ #else
172
217
err = pthread_cond_wait (cv, mu);
218
+ #endif
173
219
} else {
174
220
struct timespec abs_deadline_ts;
175
221
#if GPR_LINUX
@@ -181,7 +227,12 @@ int gpr_cv_wait(gpr_cv* cv, gpr_mu* mu, gpr_timespec abs_deadline) {
181
227
#endif // GPR_LINUX
182
228
abs_deadline_ts.tv_sec = static_cast <time_t >(abs_deadline.tv_sec );
183
229
abs_deadline_ts.tv_nsec = abs_deadline.tv_nsec ;
230
+ #ifdef GRPC_ASAN_ENABLED
231
+ err = pthread_cond_timedwait (&cv->cond_var , &mu->mutex , &abs_deadline_ts);
232
+ #else
184
233
err = pthread_cond_timedwait (cv, mu, &abs_deadline_ts);
234
+ #endif
235
+
185
236
#ifdef GRPC_DEBUG_TIMER_MANAGER
186
237
// For debug of the timer manager crash only.
187
238
// TODO (mxyan): remove after bug is fixed.
@@ -226,10 +277,20 @@ int gpr_cv_wait(gpr_cv* cv, gpr_mu* mu, gpr_timespec abs_deadline) {
226
277
return err == ETIMEDOUT;
227
278
}
228
279
229
- void gpr_cv_signal (gpr_cv* cv) { GPR_ASSERT (pthread_cond_signal (cv) == 0 ); }
280
+ void gpr_cv_signal (gpr_cv* cv) {
281
+ #ifdef GRPC_ASAN_ENABLED
282
+ GPR_ASSERT (pthread_cond_signal (&cv->cond_var ) == 0 );
283
+ #else
284
+ GPR_ASSERT (pthread_cond_signal (cv) == 0 );
285
+ #endif
286
+ }
230
287
231
288
void gpr_cv_broadcast (gpr_cv* cv) {
289
+ #ifdef GRPC_ASAN_ENABLED
290
+ GPR_ASSERT (pthread_cond_broadcast (&cv->cond_var ) == 0 );
291
+ #else
232
292
GPR_ASSERT (pthread_cond_broadcast (cv) == 0 );
293
+ #endif
233
294
}
234
295
235
296
/* ----------------------------------------*/
0 commit comments