MySQL  8.0.17
Source Code Documentation
mysql_rwlock.h
Go to the documentation of this file.
1 /* Copyright (c) 2008, 2019, Oracle and/or its affiliates. All rights reserved.
2 
3  This program is free software; you can redistribute it and/or modify
4  it under the terms of the GNU General Public License, version 2.0,
5  as published by the Free Software Foundation.
6 
7  This program is also distributed with certain software (including
8  but not limited to OpenSSL) that is licensed under separate terms,
9  as designated in a particular file or component or in included license
10  documentation. The authors of MySQL hereby grant you an additional
11  permission to link the program and your derivative works with the
12  separately licensed software that they have included with MySQL.
13 
14  This program is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  GNU General Public License, version 2.0, for more details.
18 
19  You should have received a copy of the GNU General Public License
20  along with this program; if not, write to the Free Software
21  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
22 
23 #ifndef MYSQL_RWLOCK_H
24 #define MYSQL_RWLOCK_H
25 
26 /**
27  @file include/mysql/psi/mysql_rwlock.h
28  Instrumentation helpers for rwlock.
29 */
30 
32 #include "mysql/psi/psi_rwlock.h"
33 #include "thr_rwlock.h"
34 #ifdef MYSQL_SERVER
35 #ifndef MYSQL_DYNAMIC_PLUGIN
36 #include "pfs_rwlock_provider.h"
37 #endif
38 #endif
39 
40 #ifndef PSI_RWLOCK_CALL
41 #define PSI_RWLOCK_CALL(M) psi_rwlock_service->M
42 #endif
43 
44 /**
45  @defgroup psi_api_rwlock Rwlock Instrumentation (API)
46  @ingroup psi_api
47  @{
48 */
49 
50 /**
51  @def mysql_prlock_assert_write_owner(M)
52  Drop-in replacement
53  for @c rw_pr_lock_assert_write_owner.
54 */
55 #ifdef SAFE_MUTEX
56 #define mysql_prlock_assert_write_owner(M) \
57  rw_pr_lock_assert_write_owner(&(M)->m_prlock)
58 #else
59 #define mysql_prlock_assert_write_owner(M) \
60  {}
61 #endif
62 
63 /**
64  @def mysql_prlock_assert_not_write_owner(M)
65  Drop-in replacement
66  for @c rw_pr_lock_assert_not_write_owner.
67 */
68 #ifdef SAFE_MUTEX
69 #define mysql_prlock_assert_not_write_owner(M) \
70  rw_pr_lock_assert_not_write_owner(&(M)->m_prlock)
71 #else
72 #define mysql_prlock_assert_not_write_owner(M) \
73  {}
74 #endif
75 
76 #ifndef DISABLE_MYSQL_THREAD_H
77 
78 /**
79  @def mysql_rwlock_register(P1, P2, P3)
80  Rwlock registration.
81 */
82 #define mysql_rwlock_register(P1, P2, P3) \
83  inline_mysql_rwlock_register(P1, P2, P3)
84 
85 /**
86  @def mysql_rwlock_init(K, T)
87  Instrumented rwlock_init.
88  @c mysql_rwlock_init is a replacement for @c pthread_rwlock_init.
89  Note that pthread_rwlockattr_t is not supported in MySQL.
90  @param K The PSI_rwlock_key for this instrumented rwlock
91  @param T The rwlock to initialize
92 */
93 
94 #define mysql_rwlock_init(K, T) \
95  mysql_rwlock_init_with_src(K, T, __FILE__, __LINE__)
96 
97 #define mysql_rwlock_init_with_src(K, T, F, L) \
98  inline_mysql_rwlock_init(K, T, F, L)
99 
100 /**
101  @def mysql_prlock_init(K, T)
102  Instrumented rw_pr_init.
103  @c mysql_prlock_init is a replacement for @c rw_pr_init.
104  @param K The PSI_rwlock_key for this instrumented prlock
105  @param T The prlock to initialize
106 */
107 
108 #define mysql_prlock_init(K, T) \
109  mysql_prlock_init_with_src(K, T, __FILE__, __LINE__)
110 
111 #define mysql_prlock_init_with_src(K, T, F, L) \
112  inline_mysql_prlock_init(K, T, F, L)
113 
114 /**
115  @def mysql_rwlock_destroy(T)
116  Instrumented rwlock_destroy.
117  @c mysql_rwlock_destroy is a drop-in replacement
118  for @c pthread_rwlock_destroy.
119 */
120 
121 #define mysql_rwlock_destroy(T) \
122  mysql_rwlock_destroy_with_src(T, __FILE__, __LINE__)
123 
124 #define mysql_rwlock_destroy_with_src(T, F, L) \
125  inline_mysql_rwlock_destroy(T, F, L)
126 
127 /**
128  @def mysql_prlock_destroy(T)
129  Instrumented rw_pr_destroy.
130  @c mysql_prlock_destroy is a drop-in replacement
131  for @c rw_pr_destroy.
132 */
133 #define mysql_prlock_destroy(T) \
134  mysql_prlock_destroy_with_src(T, __FILE__, __LINE__)
135 
136 #define mysql_prlock_destroy_with_src(T, F, L) \
137  inline_mysql_prlock_destroy(T, F, L)
138 
139 /**
140  @def mysql_rwlock_rdlock(T)
141  Instrumented rwlock_rdlock.
142  @c mysql_rwlock_rdlock is a drop-in replacement
143  for @c pthread_rwlock_rdlock.
144 */
145 
146 #define mysql_rwlock_rdlock(T) \
147  mysql_rwlock_rdlock_with_src(T, __FILE__, __LINE__)
148 
149 #define mysql_rwlock_rdlock_with_src(T, F, L) \
150  inline_mysql_rwlock_rdlock(T, F, L)
151 
152 /**
153  @def mysql_prlock_rdlock(T)
154  Instrumented rw_pr_rdlock.
155  @c mysql_prlock_rdlock is a drop-in replacement
156  for @c rw_pr_rdlock.
157 */
158 
159 #define mysql_prlock_rdlock(T) \
160  mysql_prlock_rdlock_with_src(T, __FILE__, __LINE__)
161 
162 #define mysql_prlock_rdlock_with_src(T, F, L) \
163  inline_mysql_prlock_rdlock(T, F, L)
164 
165 /**
166  @def mysql_rwlock_wrlock(T)
167  Instrumented rwlock_wrlock.
168  @c mysql_rwlock_wrlock is a drop-in replacement
169  for @c pthread_rwlock_wrlock.
170 */
171 
172 #define mysql_rwlock_wrlock(T) \
173  mysql_rwlock_wrlock_with_src(T, __FILE__, __LINE__)
174 
175 #define mysql_rwlock_wrlock_with_src(T, F, L) \
176  inline_mysql_rwlock_wrlock(T, F, L)
177 
178 /**
179  @def mysql_prlock_wrlock(T)
180  Instrumented rw_pr_wrlock.
181  @c mysql_prlock_wrlock is a drop-in replacement
182  for @c rw_pr_wrlock.
183 */
184 
185 #define mysql_prlock_wrlock(T) \
186  mysql_prlock_wrlock_with_src(T, __FILE__, __LINE__)
187 
188 #define mysql_prlock_wrlock_with_src(T, F, L) \
189  inline_mysql_prlock_wrlock(T, F, L)
190 
191 /**
192  @def mysql_rwlock_tryrdlock(T)
193  Instrumented rwlock_tryrdlock.
194  @c mysql_rwlock_tryrdlock is a drop-in replacement
195  for @c pthread_rwlock_tryrdlock.
196 */
197 
198 #define mysql_rwlock_tryrdlock(T) \
199  mysql_rwlock_tryrdlock_with_src(T, __FILE__, __LINE__)
200 
201 #define mysql_rwlock_tryrdlock_with_src(T, F, L) \
202  inline_mysql_rwlock_tryrdlock(T, F, L)
203 
204 /**
205  @def mysql_rwlock_trywrlock(T)
206  Instrumented rwlock_trywrlock.
207  @c mysql_rwlock_trywrlock is a drop-in replacement
208  for @c pthread_rwlock_trywrlock.
209 */
210 
211 #define mysql_rwlock_trywrlock(T) \
212  mysql_rwlock_trywrlock_with_src(T, __FILE__, __LINE__)
213 
214 #define mysql_rwlock_trywrlock_with_src(T, F, L) \
215  inline_mysql_rwlock_trywrlock(T, F, L)
216 
217 /**
218  @def mysql_rwlock_unlock(T)
219  Instrumented rwlock_unlock.
220  @c mysql_rwlock_unlock is a drop-in replacement
221  for @c pthread_rwlock_unlock.
222 */
223 #define mysql_rwlock_unlock(T) \
224  mysql_rwlock_unlock_with_src(T, __FILE__, __LINE__)
225 
226 #define mysql_rwlock_unlock_with_src(T, F, L) \
227  inline_mysql_rwlock_unlock(T, F, L)
228 
229 /**
230  @def mysql_prlock_unlock(T)
231  Instrumented rw_pr_unlock.
232  @c mysql_prlock_unlock is a drop-in replacement
233  for @c rw_pr_unlock.
234 */
235 
236 #define mysql_prlock_unlock(T) \
237  mysql_prlock_unlock_with_src(T, __FILE__, __LINE__)
238 
239 #define mysql_prlock_unlock_with_src(T, F, L) \
240  inline_mysql_prlock_unlock(T, F, L)
241 
242 static inline void inline_mysql_rwlock_register(
243  const char *category MY_ATTRIBUTE((unused)),
244  PSI_rwlock_info *info MY_ATTRIBUTE((unused)),
245  int count MY_ATTRIBUTE((unused))) {
246 #ifdef HAVE_PSI_RWLOCK_INTERFACE
247  PSI_RWLOCK_CALL(register_rwlock)(category, info, count);
248 #endif
249 }
250 
251 static inline int inline_mysql_rwlock_init(
252  PSI_rwlock_key key MY_ATTRIBUTE((unused)), mysql_rwlock_t *that,
253  const char *src_file MY_ATTRIBUTE((unused)),
254  int src_line MY_ATTRIBUTE((unused))) {
255 #ifdef HAVE_PSI_RWLOCK_INTERFACE
256  that->m_psi = PSI_RWLOCK_CALL(init_rwlock)(key, &that->m_rwlock);
257 #else
258  that->m_psi = NULL;
259 #endif
260  return native_rw_init(&that->m_rwlock);
261 }
262 
263 #ifndef DISABLE_MYSQL_PRLOCK_H
264 static inline int inline_mysql_prlock_init(
265  PSI_rwlock_key key MY_ATTRIBUTE((unused)), mysql_prlock_t *that,
266  const char *src_file MY_ATTRIBUTE((unused)),
267  int src_line MY_ATTRIBUTE((unused))) {
268 #ifdef HAVE_PSI_RWLOCK_INTERFACE
269  that->m_psi = PSI_RWLOCK_CALL(init_rwlock)(key, &that->m_prlock);
270 #else
271  that->m_psi = NULL;
272 #endif
273  return rw_pr_init(&that->m_prlock);
274 }
275 #endif
276 
277 static inline int inline_mysql_rwlock_destroy(
278  mysql_rwlock_t *that, const char *src_file MY_ATTRIBUTE((unused)),
279  int src_line MY_ATTRIBUTE((unused))) {
280 #ifdef HAVE_PSI_RWLOCK_INTERFACE
281  if (that->m_psi != NULL) {
283  that->m_psi = NULL;
284  }
285 #endif
286  return native_rw_destroy(&that->m_rwlock);
287 }
288 
289 #ifndef DISABLE_MYSQL_PRLOCK_H
290 static inline int inline_mysql_prlock_destroy(
291  mysql_prlock_t *that, const char *src_file MY_ATTRIBUTE((unused)),
292  int src_line MY_ATTRIBUTE((unused))) {
293 #ifdef HAVE_PSI_RWLOCK_INTERFACE
294  if (that->m_psi != NULL) {
296  that->m_psi = NULL;
297  }
298 #endif
299  return rw_pr_destroy(&that->m_prlock);
300 }
301 #endif
302 
303 static inline int inline_mysql_rwlock_rdlock(
304  mysql_rwlock_t *that, const char *src_file MY_ATTRIBUTE((unused)),
305  int src_line MY_ATTRIBUTE((unused))) {
306  int result;
307 
308 #ifdef HAVE_PSI_RWLOCK_INTERFACE
309  if (that->m_psi != NULL) {
310  /* Instrumentation start */
311  PSI_rwlock_locker *locker;
313  locker = PSI_RWLOCK_CALL(start_rwlock_rdwait)(
314  &state, that->m_psi, PSI_RWLOCK_READLOCK, src_file, src_line);
315 
316  /* Instrumented code */
317  result = native_rw_rdlock(&that->m_rwlock);
318 
319  /* Instrumentation end */
320  if (locker != NULL) {
321  PSI_RWLOCK_CALL(end_rwlock_rdwait)(locker, result);
322  }
323 
324  return result;
325  }
326 #endif
327 
328  /* Non instrumented code */
329  result = native_rw_rdlock(&that->m_rwlock);
330 
331  return result;
332 }
333 
334 #ifndef DISABLE_MYSQL_PRLOCK_H
335 static inline int inline_mysql_prlock_rdlock(
336  mysql_prlock_t *that, const char *src_file MY_ATTRIBUTE((unused)),
337  int src_line MY_ATTRIBUTE((unused))) {
338  int result;
339 
340 #ifdef HAVE_PSI_RWLOCK_INTERFACE
341  if (that->m_psi != NULL) {
342  /* Instrumentation start */
343  PSI_rwlock_locker *locker;
345  locker = PSI_RWLOCK_CALL(start_rwlock_rdwait)(
346  &state, that->m_psi, PSI_RWLOCK_READLOCK, src_file, src_line);
347 
348  /* Instrumented code */
349  result = rw_pr_rdlock(&that->m_prlock);
350 
351  /* Instrumentation end */
352  if (locker != NULL) {
353  PSI_RWLOCK_CALL(end_rwlock_rdwait)(locker, result);
354  }
355 
356  return result;
357  }
358 #endif
359 
360  /* Non instrumented code */
361  result = rw_pr_rdlock(&that->m_prlock);
362 
363  return result;
364 }
365 #endif
366 
367 static inline int inline_mysql_rwlock_wrlock(
368  mysql_rwlock_t *that, const char *src_file MY_ATTRIBUTE((unused)),
369  int src_line MY_ATTRIBUTE((unused))) {
370  int result;
371 
372 #ifdef HAVE_PSI_RWLOCK_INTERFACE
373  if (that->m_psi != NULL) {
374  /* Instrumentation start */
375  PSI_rwlock_locker *locker;
377  locker = PSI_RWLOCK_CALL(start_rwlock_wrwait)(
378  &state, that->m_psi, PSI_RWLOCK_WRITELOCK, src_file, src_line);
379 
380  /* Instrumented code */
381  result = native_rw_wrlock(&that->m_rwlock);
382 
383  /* Instrumentation end */
384  if (locker != NULL) {
385  PSI_RWLOCK_CALL(end_rwlock_wrwait)(locker, result);
386  }
387 
388  return result;
389  }
390 #endif
391 
392  /* Non instrumented code */
393  result = native_rw_wrlock(&that->m_rwlock);
394 
395  return result;
396 }
397 
398 #ifndef DISABLE_MYSQL_PRLOCK_H
399 static inline int inline_mysql_prlock_wrlock(
400  mysql_prlock_t *that, const char *src_file MY_ATTRIBUTE((unused)),
401  int src_line MY_ATTRIBUTE((unused))) {
402  int result;
403 
404 #ifdef HAVE_PSI_RWLOCK_INTERFACE
405  if (that->m_psi != NULL) {
406  /* Instrumentation start */
407  PSI_rwlock_locker *locker;
409  locker = PSI_RWLOCK_CALL(start_rwlock_wrwait)(
410  &state, that->m_psi, PSI_RWLOCK_WRITELOCK, src_file, src_line);
411 
412  /* Instrumented code */
413  result = rw_pr_wrlock(&that->m_prlock);
414 
415  /* Instrumentation end */
416  if (locker != NULL) {
417  PSI_RWLOCK_CALL(end_rwlock_wrwait)(locker, result);
418  }
419 
420  return result;
421  }
422 #endif
423 
424  /* Non instrumented code */
425  result = rw_pr_wrlock(&that->m_prlock);
426 
427  return result;
428 }
429 #endif
430 
432  mysql_rwlock_t *that, const char *src_file MY_ATTRIBUTE((unused)),
433  int src_line MY_ATTRIBUTE((unused))) {
434  int result;
435 
436 #ifdef HAVE_PSI_RWLOCK_INTERFACE
437  if (that->m_psi != NULL) {
438  /* Instrumentation start */
439  PSI_rwlock_locker *locker;
441  locker = PSI_RWLOCK_CALL(start_rwlock_rdwait)(
442  &state, that->m_psi, PSI_RWLOCK_TRYREADLOCK, src_file, src_line);
443 
444  /* Instrumented code */
445  result = native_rw_tryrdlock(&that->m_rwlock);
446 
447  /* Instrumentation end */
448  if (locker != NULL) {
449  PSI_RWLOCK_CALL(end_rwlock_rdwait)(locker, result);
450  }
451 
452  return result;
453  }
454 #endif
455 
456  /* Non instrumented code */
457  result = native_rw_tryrdlock(&that->m_rwlock);
458 
459  return result;
460 }
461 
463  mysql_rwlock_t *that, const char *src_file MY_ATTRIBUTE((unused)),
464  int src_line MY_ATTRIBUTE((unused))) {
465  int result;
466 
467 #ifdef HAVE_PSI_RWLOCK_INTERFACE
468  if (that->m_psi != NULL) {
469  /* Instrumentation start */
470  PSI_rwlock_locker *locker;
472  locker = PSI_RWLOCK_CALL(start_rwlock_wrwait)(
473  &state, that->m_psi, PSI_RWLOCK_TRYWRITELOCK, src_file, src_line);
474 
475  /* Instrumented code */
476  result = native_rw_trywrlock(&that->m_rwlock);
477 
478  /* Instrumentation end */
479  if (locker != NULL) {
480  PSI_RWLOCK_CALL(end_rwlock_wrwait)(locker, result);
481  }
482 
483  return result;
484  }
485 #endif
486 
487  /* Non instrumented code */
488  result = native_rw_trywrlock(&that->m_rwlock);
489 
490  return result;
491 }
492 
493 static inline int inline_mysql_rwlock_unlock(
494  mysql_rwlock_t *that, const char *src_file MY_ATTRIBUTE((unused)),
495  int src_line MY_ATTRIBUTE((unused))) {
496  int result;
497 #ifdef HAVE_PSI_RWLOCK_INTERFACE
498  if (that->m_psi != NULL) {
499  PSI_RWLOCK_CALL(unlock_rwlock)(that->m_psi, PSI_RWLOCK_UNLOCK);
500  }
501 #endif
502  result = native_rw_unlock(&that->m_rwlock);
503  return result;
504 }
505 
506 #ifndef DISABLE_MYSQL_PRLOCK_H
507 static inline int inline_mysql_prlock_unlock(
508  mysql_prlock_t *that, const char *src_file MY_ATTRIBUTE((unused)),
509  int src_line MY_ATTRIBUTE((unused))) {
510  int result;
511 #ifdef HAVE_PSI_RWLOCK_INTERFACE
512  if (that->m_psi != NULL) {
513  PSI_RWLOCK_CALL(unlock_rwlock)(that->m_psi, PSI_RWLOCK_UNLOCK);
514  }
515 #endif
516  result = rw_pr_unlock(&that->m_prlock);
517  return result;
518 }
519 #endif
520 
521 #endif /* DISABLE_MYSQL_THREAD_H */
522 
523 /** @} (end of group psi_api_rwlock) */
524 
525 #endif
struct PSI_rwlock_locker PSI_rwlock_locker
Definition: psi_rwlock_bits.h:76
MySQL rwlock implementation.
static int native_rw_wrlock(native_rw_lock_t *rwp)
Definition: thr_rwlock.h:96
static int inline_mysql_rwlock_destroy(mysql_rwlock_t *that, const char *src_file, int src_line)
Definition: mysql_rwlock.h:277
static int native_rw_rdlock(native_rw_lock_t *rwp)
Definition: thr_rwlock.h:78
Read lock attempt.
Definition: psi_rwlock_bits.h:127
ssize_t count
Definition: memcached.c:386
static int native_rw_unlock(native_rw_lock_t *rwp)
Definition: thr_rwlock.h:116
int rw_pr_unlock(rw_pr_lock_t *)
Definition: thr_rwlock.cc:99
Sergei Dialog Client Authentication NULL
Definition: dialog.cc:352
int rw_pr_init(rw_pr_lock_t *)
Definition: thr_rwlock.cc:35
static int native_rw_destroy(native_rw_lock_t *rwp)
Definition: thr_rwlock.h:69
Performance schema instrumentation interface.
Write lock.
Definition: psi_rwlock_bits.h:125
int rw_pr_wrlock(rw_pr_lock_t *)
Definition: thr_rwlock.cc:66
Write lock attempt.
Definition: psi_rwlock_bits.h:129
An instrumented prlock structure.
Definition: mysql_rwlock_bits.h:71
static int inline_mysql_rwlock_wrlock(mysql_rwlock_t *that, const char *src_file, int src_line)
Definition: mysql_rwlock.h:367
Read lock.
Definition: psi_rwlock_bits.h:123
static int inline_mysql_prlock_init(PSI_rwlock_key key, mysql_prlock_t *that, const char *src_file, int src_line)
Definition: mysql_rwlock.h:264
rw_pr_lock_t m_prlock
The real prlock.
Definition: mysql_rwlock_bits.h:73
int rw_pr_destroy(rw_pr_lock_t *)
Definition: thr_rwlock.cc:47
Rwlock information.
Definition: psi_rwlock_bits.h:159
unsigned int PSI_rwlock_key
Instrumented rwlock key.
Definition: psi_rwlock_bits.h:41
static void inline_mysql_rwlock_register(const char *category, PSI_rwlock_info *info, int count)
Definition: mysql_rwlock.h:242
static int native_rw_tryrdlock(native_rw_lock_t *rwp)
Definition: thr_rwlock.h:87
static const char * key
Definition: suite_stubs.c:14
An instrumented rwlock structure.
Definition: mysql_rwlock_bits.h:50
Unlock (Read or Write).
Definition: psi_rwlock_bits.h:131
static const char * category
Definition: sha2_password.cc:168
Performance schema instrumentation (declarations).
static int inline_mysql_rwlock_unlock(mysql_rwlock_t *that, const char *src_file, int src_line)
Definition: mysql_rwlock.h:493
static int inline_mysql_prlock_wrlock(mysql_prlock_t *that, const char *src_file, int src_line)
Definition: mysql_rwlock.h:399
int rw_pr_rdlock(rw_pr_lock_t *)
Definition: thr_rwlock.cc:53
struct PSI_rwlock * m_psi
The instrumentation hook.
Definition: mysql_rwlock_bits.h:79
static int native_rw_init(native_rw_lock_t *rwp)
Definition: thr_rwlock.h:58
static int inline_mysql_rwlock_rdlock(mysql_rwlock_t *that, const char *src_file, int src_line)
Definition: mysql_rwlock.h:303
static int inline_mysql_prlock_rdlock(mysql_prlock_t *that, const char *src_file, int src_line)
Definition: mysql_rwlock.h:335
static int inline_mysql_prlock_unlock(mysql_prlock_t *that, const char *src_file, int src_line)
Definition: mysql_rwlock.h:507
static int inline_mysql_rwlock_tryrdlock(mysql_rwlock_t *that, const char *src_file, int src_line)
Definition: mysql_rwlock.h:431
Log info(cout, "NOTE")
static int inline_mysql_rwlock_init(PSI_rwlock_key key, mysql_rwlock_t *that, const char *src_file, int src_line)
Definition: mysql_rwlock.h:251
Instrumentation helpers for rwlock.
State data storage for start_rwlock_rdwait_v1_t, start_rwlock_wrwait_v1_t.
Definition: psi_rwlock_bits.h:191
struct PSI_rwlock * m_psi
The instrumentation hook.
Definition: mysql_rwlock_bits.h:58
static int inline_mysql_prlock_destroy(mysql_prlock_t *that, const char *src_file, int src_line)
Definition: mysql_rwlock.h:290
static int native_rw_trywrlock(native_rw_lock_t *rwp)
Definition: thr_rwlock.h:106
void destroy_rwlock(PFS_rwlock *pfs)
Destroy instrumentation for a rwlock instance.
Definition: pfs_instr.cc:385
native_rw_lock_t m_rwlock
The real rwlock.
Definition: mysql_rwlock_bits.h:52
static int inline_mysql_rwlock_trywrlock(mysql_rwlock_t *that, const char *src_file, int src_line)
Definition: mysql_rwlock.h:462
#define PSI_RWLOCK_CALL(M)
Definition: psi_rwlock.h:31