Commit a7c9bf2c authored by Marc Alff's avatar Marc Alff

Bug#51295 Build warnings in mdl.cc

Before this fix, the performance schema instrumentation
in mdl.h / mdl.cc was incomplete, causing:
- build warnings,
- no data collection for the performance schema

This fix:
- added instrumentation helpers for the new preferred
  reader read write lock, mysql_prlock_*
- implemented completely the performance schema
  instrumentation of mdl.h / mdl.cc
parent 8c28d0d1
...@@ -106,6 +106,22 @@ struct st_mysql_rwlock ...@@ -106,6 +106,22 @@ struct st_mysql_rwlock
struct PSI_rwlock *m_psi; struct PSI_rwlock *m_psi;
}; };
/**
An instrumented prlock structure.
@sa mysql_prlock_t
*/
struct st_mysql_prlock
{
/** The real prlock */
rw_pr_lock_t m_prlock;
/**
The instrumentation hook.
Note that this hook is not conditionally defined,
for binary compatibility of the @c mysql_rwlock_t interface.
*/
struct PSI_rwlock *m_psi;
};
/** /**
Type of an instrumented rwlock. Type of an instrumented rwlock.
@c mysql_rwlock_t is a drop-in replacement for @c pthread_rwlock_t. @c mysql_rwlock_t is a drop-in replacement for @c pthread_rwlock_t.
...@@ -119,6 +135,20 @@ struct st_mysql_rwlock ...@@ -119,6 +135,20 @@ struct st_mysql_rwlock
*/ */
typedef struct st_mysql_rwlock mysql_rwlock_t; typedef struct st_mysql_rwlock mysql_rwlock_t;
/**
Type of an instrumented prlock.
A prlock is a read write lock that 'prefers readers' (pr).
@c mysql_prlock_t is a drop-in replacement for @c rw_pr_lock_t.
@sa mysql_prlock_init
@sa mysql_prlock_rdlock
@sa mysql_prlock_tryrdlock
@sa mysql_prlock_wrlock
@sa mysql_prlock_trywrlock
@sa mysql_prlock_unlock
@sa mysql_prlock_destroy
*/
typedef struct st_mysql_prlock mysql_prlock_t;
/** /**
An instrumented cond structure. An instrumented cond structure.
@sa mysql_cond_t @sa mysql_cond_t
...@@ -281,6 +311,19 @@ typedef struct st_mysql_cond mysql_cond_t; ...@@ -281,6 +311,19 @@ typedef struct st_mysql_cond mysql_cond_t;
#define mysql_rwlock_init(K, RW) inline_mysql_rwlock_init(RW) #define mysql_rwlock_init(K, RW) inline_mysql_rwlock_init(RW)
#endif #endif
/**
@def mysql_prlock_init(K, RW)
Instrumented rw_pr_init.
@c mysql_prlock_init is a replacement for @c rw_pr_init.
@param K The PSI_rwlock_key for this instrumented prlock
@param RW The prlock to initialize
*/
#ifdef HAVE_PSI_INTERFACE
#define mysql_prlock_init(K, RW) inline_mysql_prlock_init(K, RW)
#else
#define mysql_prlock_init(K, RW) inline_mysql_prlock_init(RW)
#endif
/** /**
@def mysql_rwlock_destroy(RW) @def mysql_rwlock_destroy(RW)
Instrumented rwlock_destroy. Instrumented rwlock_destroy.
...@@ -289,6 +332,14 @@ typedef struct st_mysql_cond mysql_cond_t; ...@@ -289,6 +332,14 @@ typedef struct st_mysql_cond mysql_cond_t;
*/ */
#define mysql_rwlock_destroy(RW) inline_mysql_rwlock_destroy(RW) #define mysql_rwlock_destroy(RW) inline_mysql_rwlock_destroy(RW)
/**
@def mysql_prlock_destroy(RW)
Instrumented rw_pr_destroy.
@c mysql_prlock_destroy is a drop-in replacement
for @c rw_pr_destroy.
*/
#define mysql_prlock_destroy(RW) inline_mysql_prlock_destroy(RW)
/** /**
@def mysql_rwlock_rdlock(RW) @def mysql_rwlock_rdlock(RW)
Instrumented rwlock_rdlock. Instrumented rwlock_rdlock.
...@@ -303,6 +354,20 @@ typedef struct st_mysql_cond mysql_cond_t; ...@@ -303,6 +354,20 @@ typedef struct st_mysql_cond mysql_cond_t;
inline_mysql_rwlock_rdlock(RW) inline_mysql_rwlock_rdlock(RW)
#endif #endif
/**
@def mysql_prlock_rdlock(RW)
Instrumented rw_pr_rdlock.
@c mysql_prlock_rdlock is a drop-in replacement
for @c rw_pr_rdlock.
*/
#ifdef HAVE_PSI_INTERFACE
#define mysql_prlock_rdlock(RW) \
inline_mysql_prlock_rdlock(RW, __FILE__, __LINE__)
#else
#define mysql_prlock_rdlock(RW) \
inline_mysql_prlock_rdlock(RW)
#endif
/** /**
@def mysql_rwlock_wrlock(RW) @def mysql_rwlock_wrlock(RW)
Instrumented rwlock_wrlock. Instrumented rwlock_wrlock.
...@@ -317,6 +382,20 @@ typedef struct st_mysql_cond mysql_cond_t; ...@@ -317,6 +382,20 @@ typedef struct st_mysql_cond mysql_cond_t;
inline_mysql_rwlock_wrlock(RW) inline_mysql_rwlock_wrlock(RW)
#endif #endif
/**
@def mysql_prlock_wrlock(RW)
Instrumented rw_pr_wrlock.
@c mysql_prlock_wrlock is a drop-in replacement
for @c rw_pr_wrlock.
*/
#ifdef HAVE_PSI_INTERFACE
#define mysql_prlock_wrlock(RW) \
inline_mysql_prlock_wrlock(RW, __FILE__, __LINE__)
#else
#define mysql_prlock_wrlock(RW) \
inline_mysql_prlock_wrlock(RW)
#endif
/** /**
@def mysql_rwlock_tryrdlock(RW) @def mysql_rwlock_tryrdlock(RW)
Instrumented rwlock_tryrdlock. Instrumented rwlock_tryrdlock.
...@@ -331,6 +410,20 @@ typedef struct st_mysql_cond mysql_cond_t; ...@@ -331,6 +410,20 @@ typedef struct st_mysql_cond mysql_cond_t;
inline_mysql_rwlock_tryrdlock(RW) inline_mysql_rwlock_tryrdlock(RW)
#endif #endif
/**
@def mysql_prlock_tryrdlock(RW)
Instrumented rw_pr_tryrdlock.
@c mysql_prlock_tryrdlock is a drop-in replacement
for @c rw_pr_tryrdlock.
*/
#ifdef HAVE_PSI_INTERFACE
#define mysql_prlock_tryrdlock(RW) \
inline_mysql_prlock_tryrdlock(RW, __FILE__, __LINE__)
#else
#define mysql_prlock_tryrdlock(RW) \
inline_mysql_prlock_tryrdlock(RW)
#endif
/** /**
@def mysql_rwlock_trywrlock(RW) @def mysql_rwlock_trywrlock(RW)
Instrumented rwlock_trywrlock. Instrumented rwlock_trywrlock.
...@@ -345,6 +438,20 @@ typedef struct st_mysql_cond mysql_cond_t; ...@@ -345,6 +438,20 @@ typedef struct st_mysql_cond mysql_cond_t;
inline_mysql_rwlock_trywrlock(RW) inline_mysql_rwlock_trywrlock(RW)
#endif #endif
/**
@def mysql_prlock_trywrlock(RW)
Instrumented rw_pr_trywrlock.
@c mysql_prlock_trywrlock is a drop-in replacement
for @c rw_pr_trywrlock.
*/
#ifdef HAVE_PSI_INTERFACE
#define mysql_prlock_trywrlock(RW) \
inline_mysql_prlock_trywrlock(RW, __FILE__, __LINE__)
#else
#define mysql_prlock_trywrlock(RW) \
inline_mysql_prlock_trywrlock(RW)
#endif
/** /**
@def mysql_rwlock_unlock(RW) @def mysql_rwlock_unlock(RW)
Instrumented rwlock_unlock. Instrumented rwlock_unlock.
...@@ -353,9 +460,17 @@ typedef struct st_mysql_cond mysql_cond_t; ...@@ -353,9 +460,17 @@ typedef struct st_mysql_cond mysql_cond_t;
*/ */
#define mysql_rwlock_unlock(RW) inline_mysql_rwlock_unlock(RW) #define mysql_rwlock_unlock(RW) inline_mysql_rwlock_unlock(RW)
/**
@def mysql_prlock_unlock(RW)
Instrumented rw_pr_unlock.
@c mysql_prlock_unlock is a drop-in replacement
for @c rw_pr_unlock.
*/
#define mysql_prlock_unlock(RW) inline_mysql_prlock_unlock(RW)
/** /**
@def mysql_cond_init(K, C, A) @def mysql_cond_init(K, C, A)
Instrumented rwlock_init. Instrumented cond_init.
@c mysql_cond_init is a replacement for @c pthread_cond_init. @c mysql_cond_init is a replacement for @c pthread_cond_init.
@param C The cond to initialize @param C The cond to initialize
@param K The PSI_cond_key for this instrumented cond @param K The PSI_cond_key for this instrumented cond
...@@ -599,6 +714,21 @@ static inline int inline_mysql_rwlock_init( ...@@ -599,6 +714,21 @@ static inline int inline_mysql_rwlock_init(
return my_rwlock_init(&that->m_rwlock, NULL); return my_rwlock_init(&that->m_rwlock, NULL);
} }
static inline int inline_mysql_prlock_init(
#ifdef HAVE_PSI_INTERFACE
PSI_rwlock_key key,
#endif
mysql_prlock_t *that)
{
#ifdef HAVE_PSI_INTERFACE
that->m_psi= (PSI_server ? PSI_server->init_rwlock(key, &that->m_prlock)
: NULL);
#else
that->m_psi= NULL;
#endif
return rw_pr_init(&that->m_prlock);
}
static inline int inline_mysql_rwlock_destroy( static inline int inline_mysql_rwlock_destroy(
mysql_rwlock_t *that) mysql_rwlock_t *that)
{ {
...@@ -612,6 +742,19 @@ static inline int inline_mysql_rwlock_destroy( ...@@ -612,6 +742,19 @@ static inline int inline_mysql_rwlock_destroy(
return rwlock_destroy(&that->m_rwlock); return rwlock_destroy(&that->m_rwlock);
} }
static inline int inline_mysql_prlock_destroy(
mysql_prlock_t *that)
{
#ifdef HAVE_PSI_INTERFACE
if (likely(PSI_server && that->m_psi))
{
PSI_server->destroy_rwlock(that->m_psi);
that->m_psi= NULL;
}
#endif
return rw_pr_destroy(&that->m_prlock);
}
static inline int inline_mysql_rwlock_rdlock( static inline int inline_mysql_rwlock_rdlock(
mysql_rwlock_t *that mysql_rwlock_t *that
#ifdef HAVE_PSI_INTERFACE #ifdef HAVE_PSI_INTERFACE
...@@ -638,6 +781,32 @@ static inline int inline_mysql_rwlock_rdlock( ...@@ -638,6 +781,32 @@ static inline int inline_mysql_rwlock_rdlock(
return result; return result;
} }
static inline int inline_mysql_prlock_rdlock(
mysql_prlock_t *that
#ifdef HAVE_PSI_INTERFACE
, const char *src_file, uint src_line
#endif
)
{
int result;
#ifdef HAVE_PSI_INTERFACE
struct PSI_rwlock_locker *locker= NULL;
if (likely(PSI_server && that->m_psi))
{
locker= PSI_server->get_thread_rwlock_locker(that->m_psi,
PSI_RWLOCK_READLOCK);
if (likely(locker != NULL))
PSI_server->start_rwlock_rdwait(locker, src_file, src_line);
}
#endif
result= rw_pr_rdlock(&that->m_prlock);
#ifdef HAVE_PSI_INTERFACE
if (likely(locker != NULL))
PSI_server->end_rwlock_rdwait(locker, result);
#endif
return result;
}
static inline int inline_mysql_rwlock_wrlock( static inline int inline_mysql_rwlock_wrlock(
mysql_rwlock_t *that mysql_rwlock_t *that
#ifdef HAVE_PSI_INTERFACE #ifdef HAVE_PSI_INTERFACE
...@@ -664,6 +833,32 @@ static inline int inline_mysql_rwlock_wrlock( ...@@ -664,6 +833,32 @@ static inline int inline_mysql_rwlock_wrlock(
return result; return result;
} }
static inline int inline_mysql_prlock_wrlock(
mysql_prlock_t *that
#ifdef HAVE_PSI_INTERFACE
, const char *src_file, uint src_line
#endif
)
{
int result;
#ifdef HAVE_PSI_INTERFACE
struct PSI_rwlock_locker *locker= NULL;
if (likely(PSI_server && that->m_psi))
{
locker= PSI_server->get_thread_rwlock_locker(that->m_psi,
PSI_RWLOCK_WRITELOCK);
if (likely(locker != NULL))
PSI_server->start_rwlock_wrwait(locker, src_file, src_line);
}
#endif
result= rw_pr_wrlock(&that->m_prlock);
#ifdef HAVE_PSI_INTERFACE
if (likely(locker != NULL))
PSI_server->end_rwlock_wrwait(locker, result);
#endif
return result;
}
static inline int inline_mysql_rwlock_tryrdlock( static inline int inline_mysql_rwlock_tryrdlock(
mysql_rwlock_t *that mysql_rwlock_t *that
#ifdef HAVE_PSI_INTERFACE #ifdef HAVE_PSI_INTERFACE
...@@ -690,6 +885,32 @@ static inline int inline_mysql_rwlock_tryrdlock( ...@@ -690,6 +885,32 @@ static inline int inline_mysql_rwlock_tryrdlock(
return result; return result;
} }
static inline int inline_mysql_prlock_tryrdlock(
mysql_prlock_t *that
#ifdef HAVE_PSI_INTERFACE
, const char *src_file, uint src_line
#endif
)
{
int result;
#ifdef HAVE_PSI_INTERFACE
struct PSI_rwlock_locker *locker= NULL;
if (likely(PSI_server && that->m_psi))
{
locker= PSI_server->get_thread_rwlock_locker(that->m_psi,
PSI_RWLOCK_TRYREADLOCK);
if (likely(locker != NULL))
PSI_server->start_rwlock_rdwait(locker, src_file, src_line);
}
#endif
result= rw_pr_tryrdlock(&that->m_prlock);
#ifdef HAVE_PSI_INTERFACE
if (likely(locker != NULL))
PSI_server->end_rwlock_rdwait(locker, result);
#endif
return result;
}
static inline int inline_mysql_rwlock_trywrlock( static inline int inline_mysql_rwlock_trywrlock(
mysql_rwlock_t *that mysql_rwlock_t *that
#ifdef HAVE_PSI_INTERFACE #ifdef HAVE_PSI_INTERFACE
...@@ -716,6 +937,32 @@ static inline int inline_mysql_rwlock_trywrlock( ...@@ -716,6 +937,32 @@ static inline int inline_mysql_rwlock_trywrlock(
return result; return result;
} }
static inline int inline_mysql_prlock_trywrlock(
mysql_prlock_t *that
#ifdef HAVE_PSI_INTERFACE
, const char *src_file, uint src_line
#endif
)
{
int result;
#ifdef HAVE_PSI_INTERFACE
struct PSI_rwlock_locker *locker= NULL;
if (likely(PSI_server && that->m_psi))
{
locker= PSI_server->get_thread_rwlock_locker(that->m_psi,
PSI_RWLOCK_TRYWRITELOCK);
if (likely(locker != NULL))
PSI_server->start_rwlock_wrwait(locker, src_file, src_line);
}
#endif
result= rw_pr_trywrlock(&that->m_prlock);
#ifdef HAVE_PSI_INTERFACE
if (likely(locker != NULL))
PSI_server->end_rwlock_wrwait(locker, result);
#endif
return result;
}
static inline int inline_mysql_rwlock_unlock( static inline int inline_mysql_rwlock_unlock(
mysql_rwlock_t *that) mysql_rwlock_t *that)
{ {
...@@ -733,6 +980,23 @@ static inline int inline_mysql_rwlock_unlock( ...@@ -733,6 +980,23 @@ static inline int inline_mysql_rwlock_unlock(
return result; return result;
} }
static inline int inline_mysql_prlock_unlock(
mysql_prlock_t *that)
{
int result;
#ifdef HAVE_PSI_INTERFACE
struct PSI_thread *thread;
if (likely(PSI_server && that->m_psi))
{
thread= PSI_server->get_thread();
if (likely(thread != NULL))
PSI_server->unlock_rwlock(thread, that->m_psi);
}
#endif
result= rw_pr_unlock(&that->m_prlock);
return result;
}
static inline int inline_mysql_cond_init( static inline int inline_mysql_cond_init(
#ifdef HAVE_PSI_INTERFACE #ifdef HAVE_PSI_INTERFACE
PSI_cond_key key, PSI_cond_key key,
......
...@@ -25,9 +25,10 @@ wait/synch/rwlock/sql/LOCK_system_variables_hash YES YES ...@@ -25,9 +25,10 @@ wait/synch/rwlock/sql/LOCK_system_variables_hash YES YES
wait/synch/rwlock/sql/LOCK_sys_init_connect YES YES wait/synch/rwlock/sql/LOCK_sys_init_connect YES YES
wait/synch/rwlock/sql/LOCK_sys_init_slave YES YES wait/synch/rwlock/sql/LOCK_sys_init_slave YES YES
wait/synch/rwlock/sql/LOGGER::LOCK_logger YES YES wait/synch/rwlock/sql/LOGGER::LOCK_logger YES YES
wait/synch/rwlock/sql/MDL_context::waiting_for_lock YES YES
wait/synch/rwlock/sql/MDL_lock::rwlock YES YES
wait/synch/rwlock/sql/Query_cache_query::lock YES YES wait/synch/rwlock/sql/Query_cache_query::lock YES YES
wait/synch/rwlock/sql/THR_LOCK_servers YES YES wait/synch/rwlock/sql/THR_LOCK_servers YES YES
wait/synch/rwlock/sql/THR_LOCK_udf YES YES
select * from performance_schema.SETUP_INSTRUMENTS select * from performance_schema.SETUP_INSTRUMENTS
where name like 'Wait/Synch/Cond/sql/%' where name like 'Wait/Synch/Cond/sql/%'
and name not in ( and name not in (
......
This diff is collapsed.
...@@ -628,7 +628,7 @@ class MDL_context ...@@ -628,7 +628,7 @@ class MDL_context
important as deadlock detector won't work correctly important as deadlock detector won't work correctly
otherwise. @sa Comment for MDL_lock::m_rwlock. otherwise. @sa Comment for MDL_lock::m_rwlock.
*/ */
rw_pr_lock_t m_waiting_for_lock; mysql_prlock_t m_waiting_for_lock;
MDL_ticket *m_waiting_for; MDL_ticket *m_waiting_for;
uint m_deadlock_weight; uint m_deadlock_weight;
/** /**
...@@ -652,9 +652,9 @@ class MDL_context ...@@ -652,9 +652,9 @@ class MDL_context
void will_wait_for(MDL_ticket *pending_ticket) void will_wait_for(MDL_ticket *pending_ticket)
{ {
rw_pr_wrlock(&m_waiting_for_lock); mysql_prlock_wrlock(&m_waiting_for_lock);
m_waiting_for= pending_ticket; m_waiting_for= pending_ticket;
rw_pr_unlock(&m_waiting_for_lock); mysql_prlock_unlock(&m_waiting_for_lock);
} }
void set_deadlock_weight(uint weight) void set_deadlock_weight(uint weight)
...@@ -670,9 +670,9 @@ class MDL_context ...@@ -670,9 +670,9 @@ class MDL_context
void stop_waiting() void stop_waiting()
{ {
rw_pr_wrlock(&m_waiting_for_lock); mysql_prlock_wrlock(&m_waiting_for_lock);
m_waiting_for= NULL; m_waiting_for= NULL;
rw_pr_unlock(&m_waiting_for_lock); mysql_prlock_unlock(&m_waiting_for_lock);
} }
void wait_reset() void wait_reset()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment