From: Marc Alff Date: March 7 2010 5:51pm Subject: bzr push into mysql-next-mr-bugfixing branch (marc.alff:3123 to 3124) Bug#51295 List-Archive: http://lists.mysql.com/commits/102523 X-Bug: 51295 Message-Id: <20100307175117.4C3AE45E80@linux-su11.site> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1461765889462279691==" --===============1461765889462279691== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3124 Marc Alff 2010-03-07 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 modified: include/mysql/psi/mysql_thread.h mysql-test/suite/perfschema/r/dml_setup_instruments.result sql/mdl.cc sql/mdl.h 3123 Marc Alff 2010-03-07 [merge] local merge added: mysql-test/include/ctype_utf8mb4.inc mysql-test/r/ctype_utf8mb4_heap.result mysql-test/r/ctype_utf8mb4_innodb.result mysql-test/r/ctype_utf8mb4_myisam.result mysql-test/r/ctype_utf8mb4_ndb.result mysql-test/suite/perfschema/r/pfs_upgrade.result mysql-test/suite/perfschema/t/pfs_upgrade.test mysql-test/suite/sys_vars/r/log_error_func.result mysql-test/suite/sys_vars/r/log_error_func2.result mysql-test/suite/sys_vars/r/log_error_func3.result mysql-test/suite/sys_vars/t/log_error_func.cnf mysql-test/suite/sys_vars/t/log_error_func.test mysql-test/suite/sys_vars/t/log_error_func2.cnf mysql-test/suite/sys_vars/t/log_error_func2.test mysql-test/suite/sys_vars/t/log_error_func3.test mysql-test/t/ctype_utf8mb4_heap.test mysql-test/t/ctype_utf8mb4_innodb.test mysql-test/t/ctype_utf8mb4_myisam.test mysql-test/t/ctype_utf8mb4_ndb.test modified: COPYING README configure.in include/m_ctype.h mysql-test/collections/default.experimental mysql-test/lib/v1/mysql-test-run.pl mysql-test/r/ctype_utf8mb4.result mysql-test/t/ctype_utf8mb4.test scripts/mysql_system_tables.sql sql-common/client.c sql/mysql_priv.h sql/mysqld.cc sql/sys_vars.cc storage/perfschema/pfs_instr.cc strings/ctype-uca.c strings/ctype-ucs2.c strings/ctype-utf8.c === modified file 'include/mysql/psi/mysql_thread.h' --- a/include/mysql/psi/mysql_thread.h 2009-12-01 00:49:15 +0000 +++ b/include/mysql/psi/mysql_thread.h 2010-03-07 17:50:47 +0000 @@ -107,6 +107,22 @@ struct st_mysql_rwlock }; /** + 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. @c mysql_rwlock_t is a drop-in replacement for @c pthread_rwlock_t. @sa mysql_rwlock_init @@ -120,6 +136,20 @@ struct st_mysql_rwlock 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. @sa mysql_cond_t */ @@ -282,6 +312,19 @@ typedef struct st_mysql_cond mysql_cond_ #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) Instrumented rwlock_destroy. @c mysql_rwlock_destroy is a drop-in replacement @@ -290,6 +333,14 @@ typedef struct st_mysql_cond mysql_cond_ #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) Instrumented rwlock_rdlock. @c mysql_rwlock_rdlock is a drop-in replacement @@ -304,6 +355,20 @@ typedef struct st_mysql_cond mysql_cond_ #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) Instrumented rwlock_wrlock. @c mysql_rwlock_wrlock is a drop-in replacement @@ -318,6 +383,20 @@ typedef struct st_mysql_cond mysql_cond_ #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) Instrumented rwlock_tryrdlock. @c mysql_rwlock_tryrdlock is a drop-in replacement @@ -332,6 +411,20 @@ typedef struct st_mysql_cond mysql_cond_ #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) Instrumented rwlock_trywrlock. @c mysql_rwlock_trywrlock is a drop-in replacement @@ -346,6 +439,20 @@ typedef struct st_mysql_cond mysql_cond_ #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) Instrumented rwlock_unlock. @c mysql_rwlock_unlock is a drop-in replacement @@ -354,8 +461,16 @@ typedef struct st_mysql_cond mysql_cond_ #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) - Instrumented rwlock_init. + Instrumented cond_init. @c mysql_cond_init is a replacement for @c pthread_cond_init. @param C The cond to initialize @param K The PSI_cond_key for this instrumented cond @@ -599,6 +714,21 @@ static inline int inline_mysql_rwlock_in 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( mysql_rwlock_t *that) { @@ -612,6 +742,19 @@ static inline int inline_mysql_rwlock_de 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( mysql_rwlock_t *that #ifdef HAVE_PSI_INTERFACE @@ -638,6 +781,32 @@ static inline int inline_mysql_rwlock_rd 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( mysql_rwlock_t *that #ifdef HAVE_PSI_INTERFACE @@ -664,6 +833,32 @@ static inline int inline_mysql_rwlock_wr 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( mysql_rwlock_t *that #ifdef HAVE_PSI_INTERFACE @@ -690,6 +885,32 @@ static inline int inline_mysql_rwlock_tr 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( mysql_rwlock_t *that #ifdef HAVE_PSI_INTERFACE @@ -716,6 +937,32 @@ static inline int inline_mysql_rwlock_tr 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( mysql_rwlock_t *that) { @@ -733,6 +980,23 @@ static inline int inline_mysql_rwlock_un 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( #ifdef HAVE_PSI_INTERFACE PSI_cond_key key, === modified file 'mysql-test/suite/perfschema/r/dml_setup_instruments.result' --- a/mysql-test/suite/perfschema/r/dml_setup_instruments.result 2010-02-13 16:01:32 +0000 +++ b/mysql-test/suite/perfschema/r/dml_setup_instruments.result 2010-03-07 17:50:47 +0000 @@ -25,9 +25,10 @@ wait/synch/rwlock/sql/LOCK_system_variab wait/synch/rwlock/sql/LOCK_sys_init_connect 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/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/THR_LOCK_servers YES YES -wait/synch/rwlock/sql/THR_LOCK_udf YES YES select * from performance_schema.SETUP_INSTRUMENTS where name like 'Wait/Synch/Cond/sql/%' and name not in ( === modified file 'sql/mdl.cc' --- a/sql/mdl.cc 2010-02-28 04:35:09 +0000 +++ b/sql/mdl.cc 2010-03-07 17:50:47 +0000 @@ -19,6 +19,54 @@ #include #include +#ifdef HAVE_PSI_INTERFACE +static PSI_mutex_key key_MDL_map_mutex; +static PSI_mutex_key key_MDL_context_signal_mutex; + +static PSI_mutex_info all_mdl_mutexes[]= +{ + { &key_MDL_map_mutex, "MDL_map::mutex", PSI_FLAG_GLOBAL}, + { &key_MDL_context_signal_mutex, "MDL_context::signal", 0} +}; + +static PSI_rwlock_key key_MDL_lock_rwlock; +static PSI_rwlock_key key_MDL_context_waiting_for_rwlock; + +static PSI_rwlock_info all_mdl_rwlocks[]= +{ + { &key_MDL_lock_rwlock, "MDL_lock::rwlock", 0}, + { &key_MDL_context_waiting_for_rwlock, "MDL_context::waiting_for_lock", 0} +}; + +static PSI_cond_key key_MDL_context_signal_cond; + +static PSI_cond_info all_mdl_conds[]= +{ + { &key_MDL_context_signal_cond, "MDL_context::signal", 0} +}; + +/** + Initialise all the performance schema instrumentation points + used by the MDL subsystem. +*/ +static void init_mdl_psi_keys(void) +{ + const char *category= "sql"; + int count; + + if (PSI_server == NULL) + return; + + count= array_elements(all_mdl_mutexes); + PSI_server->register_mutex(category, all_mdl_mutexes, count); + + count= array_elements(all_mdl_rwlocks); + PSI_server->register_rwlock(category, all_mdl_rwlocks, count); + + count= array_elements(all_mdl_conds); + PSI_server->register_cond(category, all_mdl_conds, count); +} +#endif /* HAVE_PSI_INTERFACE */ void notify_shared_lock(THD *thd, MDL_ticket *conflicting_ticket); @@ -178,7 +226,7 @@ public: If m_wrlock prefers readers (actually ignoring pending writers is enough) ctxA and ctxB will continue and no deadlock will occur. */ - rw_pr_lock_t m_rwlock; + mysql_prlock_t m_rwlock; bool is_empty() const { @@ -240,12 +288,12 @@ public: m_ref_release(0), m_is_destroyed(FALSE) { - rw_pr_init(&m_rwlock); + mysql_prlock_init(key_MDL_lock_rwlock, &m_rwlock); } virtual ~MDL_lock() { - rw_pr_destroy(&m_rwlock); + mysql_prlock_destroy(&m_rwlock); } inline static void destroy(MDL_lock *lock); public: @@ -368,6 +416,11 @@ void mdl_init() { DBUG_ASSERT(! mdl_initialized); mdl_initialized= TRUE; + +#ifdef HAVE_PSI_INTERFACE + init_mdl_psi_keys(); +#endif + mdl_locks.init(); } @@ -393,7 +446,7 @@ void mdl_destroy() void MDL_map::init() { - mysql_mutex_init(NULL /* pfs key */,&m_mutex, NULL); + mysql_mutex_init(key_MDL_map_mutex, &m_mutex, NULL); my_hash_init(&m_locks, &my_charset_bin, 16 /* FIXME */, 0, 0, mdl_locks_key, 0, 0); } @@ -507,7 +560,7 @@ bool MDL_map::move_from_hash_to_lock_mut lock->m_ref_usage++; mysql_mutex_unlock(&m_mutex); - rw_pr_wrlock(&lock->m_rwlock); + mysql_prlock_wrlock(&lock->m_rwlock); lock->m_ref_release++; if (unlikely(lock->m_is_destroyed)) { @@ -522,7 +575,7 @@ bool MDL_map::move_from_hash_to_lock_mut */ uint ref_usage= lock->m_ref_usage; uint ref_release= lock->m_ref_release; - rw_pr_unlock(&lock->m_rwlock); + mysql_prlock_unlock(&lock->m_rwlock); if (ref_usage == ref_release) MDL_lock::destroy(lock); return TRUE; @@ -565,7 +618,7 @@ void MDL_map::remove(MDL_lock *lock) lock->m_is_destroyed= TRUE; ref_usage= lock->m_ref_usage; ref_release= lock->m_ref_release; - rw_pr_unlock(&lock->m_rwlock); + mysql_prlock_unlock(&lock->m_rwlock); mysql_mutex_unlock(&m_mutex); if (ref_usage == ref_release) MDL_lock::destroy(lock); @@ -586,9 +639,9 @@ MDL_context::MDL_context() m_deadlock_weight(0), m_signal(NO_WAKE_UP) { - rw_pr_init(&m_waiting_for_lock); - mysql_mutex_init(NULL /* pfs key */, &m_signal_lock, NULL); - mysql_cond_init(NULL /* pfs key */, &m_signal_cond, NULL); + mysql_prlock_init(key_MDL_context_waiting_for_rwlock, &m_waiting_for_lock); + mysql_mutex_init(key_MDL_context_signal_mutex, &m_signal_lock, NULL); + mysql_cond_init(key_MDL_context_signal_mutex, &m_signal_cond, NULL); } @@ -608,7 +661,7 @@ void MDL_context::destroy() { DBUG_ASSERT(m_tickets.is_empty()); - rw_pr_destroy(&m_waiting_for_lock); + mysql_prlock_destroy(&m_waiting_for_lock); mysql_mutex_destroy(&m_signal_lock); mysql_cond_destroy(&m_signal_cond); } @@ -1098,7 +1151,7 @@ MDL_lock::can_grant_lock(enum_mdl_type t void MDL_lock::remove_ticket(Ticket_list MDL_lock::*list, MDL_ticket *ticket) { - rw_pr_wrlock(&m_rwlock); + mysql_prlock_wrlock(&m_rwlock); (this->*list).remove_ticket(ticket); if (is_empty()) mdl_locks.remove(this); @@ -1109,7 +1162,7 @@ void MDL_lock::remove_ticket(Ticket_list which now might be able to do it. Wake them up! */ wake_up_waiters(); - rw_pr_unlock(&m_rwlock); + mysql_prlock_unlock(&m_rwlock); } } @@ -1129,9 +1182,9 @@ bool MDL_lock::has_pending_conflicting_l mysql_mutex_assert_not_owner(&LOCK_open); - rw_pr_rdlock(&m_rwlock); + mysql_prlock_rdlock(&m_rwlock); result= (m_waiting.bitmap() & incompatible_granted_types_bitmap()[type]); - rw_pr_unlock(&m_rwlock); + mysql_prlock_unlock(&m_rwlock); return result; } @@ -1325,7 +1378,7 @@ MDL_context::try_acquire_lock(MDL_reques { ticket->m_lock= lock; lock->m_granted.add_ticket(ticket); - rw_pr_unlock(&lock->m_rwlock); + mysql_prlock_unlock(&lock->m_rwlock); m_tickets.push_front(ticket); @@ -1335,7 +1388,7 @@ MDL_context::try_acquire_lock(MDL_reques { /* We can't get here if we allocated a new lock. */ DBUG_ASSERT(! lock->is_empty()); - rw_pr_unlock(&lock->m_rwlock); + mysql_prlock_unlock(&lock->m_rwlock); MDL_ticket::destroy(ticket); } @@ -1376,9 +1429,9 @@ MDL_context::clone_ticket(MDL_request *m ticket->m_lock= mdl_request->ticket->m_lock; mdl_request->ticket= ticket; - rw_pr_wrlock(&ticket->m_lock->m_rwlock); + mysql_prlock_wrlock(&ticket->m_lock->m_rwlock); ticket->m_lock->m_granted.add_ticket(ticket); - rw_pr_unlock(&ticket->m_lock->m_rwlock); + mysql_prlock_unlock(&ticket->m_lock->m_rwlock); m_tickets.push_front(ticket); @@ -1484,7 +1537,7 @@ bool MDL_context::acquire_lock_impl(MDL_ if (ticket->is_upgradable_or_exclusive()) lock->notify_shared_locks(this); - rw_pr_unlock(&lock->m_rwlock); + mysql_prlock_unlock(&lock->m_rwlock); set_deadlock_weight(mdl_request->get_deadlock_weight()); will_wait_for(ticket); @@ -1519,7 +1572,7 @@ bool MDL_context::acquire_lock_impl(MDL_ my_error(ER_LOCK_WAIT_TIMEOUT, MYF(0)); return TRUE; } - rw_pr_wrlock(&lock->m_rwlock); + mysql_prlock_wrlock(&lock->m_rwlock); } lock->m_waiting.remove_ticket(ticket); @@ -1529,7 +1582,7 @@ bool MDL_context::acquire_lock_impl(MDL_ (*lock->cached_object_release_hook)(lock->cached_object); lock->cached_object= NULL; - rw_pr_unlock(&lock->m_rwlock); + mysql_prlock_unlock(&lock->m_rwlock); m_tickets.push_front(ticket); @@ -1674,7 +1727,7 @@ MDL_context::upgrade_shared_lock_to_excl is_new_ticket= ! has_lock(mdl_svp, mdl_xlock_request.ticket); /* Merge the acquired and the original lock. @todo: move to a method. */ - rw_pr_wrlock(&mdl_ticket->m_lock->m_rwlock); + mysql_prlock_wrlock(&mdl_ticket->m_lock->m_rwlock); if (is_new_ticket) mdl_ticket->m_lock->m_granted.remove_ticket(mdl_xlock_request.ticket); /* @@ -1686,7 +1739,7 @@ MDL_context::upgrade_shared_lock_to_excl mdl_ticket->m_type= MDL_EXCLUSIVE; mdl_ticket->m_lock->m_granted.add_ticket(mdl_ticket); - rw_pr_unlock(&mdl_ticket->m_lock->m_rwlock); + mysql_prlock_unlock(&mdl_ticket->m_lock->m_rwlock); if (is_new_ticket) { @@ -1704,7 +1757,7 @@ bool MDL_lock::find_deadlock(MDL_ticket MDL_ticket *ticket; bool result= FALSE; - rw_pr_rdlock(&m_rwlock); + mysql_prlock_rdlock(&m_rwlock); Ticket_iterator granted_it(m_granted); Ticket_iterator waiting_it(m_waiting); @@ -1756,7 +1809,7 @@ bool MDL_lock::find_deadlock(MDL_ticket } end: - rw_pr_unlock(&m_rwlock); + mysql_prlock_unlock(&m_rwlock); return result; } @@ -1765,7 +1818,7 @@ bool MDL_context::find_deadlock(Deadlock { bool result= FALSE; - rw_pr_rdlock(&m_waiting_for_lock); + mysql_prlock_rdlock(&m_waiting_for_lock); if (m_waiting_for) { @@ -1794,14 +1847,14 @@ bool MDL_context::find_deadlock(Deadlock deadlock_ctx->victim= this; else if (deadlock_ctx->victim->m_deadlock_weight >= m_deadlock_weight) { - rw_pr_unlock(&deadlock_ctx->victim->m_waiting_for_lock); + mysql_prlock_unlock(&deadlock_ctx->victim->m_waiting_for_lock); deadlock_ctx->victim= this; } else - rw_pr_unlock(&m_waiting_for_lock); + mysql_prlock_unlock(&m_waiting_for_lock); } else - rw_pr_unlock(&m_waiting_for_lock); + mysql_prlock_unlock(&m_waiting_for_lock); return result; } @@ -1827,7 +1880,7 @@ bool MDL_context::find_deadlock() if (deadlock_ctx.victim != this) { deadlock_ctx.victim->awake(VICTIM_WAKE_UP); - rw_pr_unlock(&deadlock_ctx.victim->m_waiting_for_lock); + mysql_prlock_unlock(&deadlock_ctx.victim->m_waiting_for_lock); /* After adding new arc to waiting graph we found that it participates in some loop (i.e. there is a deadlock). We decided to destroy this @@ -1840,7 +1893,7 @@ bool MDL_context::find_deadlock() else { DBUG_ASSERT(&deadlock_ctx.victim->m_waiting_for_lock == &m_waiting_for_lock); - rw_pr_unlock(&deadlock_ctx.victim->m_waiting_for_lock); + mysql_prlock_unlock(&deadlock_ctx.victim->m_waiting_for_lock); return TRUE; } } @@ -1897,14 +1950,14 @@ MDL_context::wait_for_lock(MDL_request * if (lock->can_grant_lock(mdl_request->type, this)) { - rw_pr_unlock(&lock->m_rwlock); + mysql_prlock_unlock(&lock->m_rwlock); return FALSE; } MDL_ticket *pending_ticket; if (! (pending_ticket= MDL_ticket::create(this, mdl_request->type))) { - rw_pr_unlock(&lock->m_rwlock); + mysql_prlock_unlock(&lock->m_rwlock); return TRUE; } @@ -1913,7 +1966,7 @@ MDL_context::wait_for_lock(MDL_request * lock->m_waiting.add_ticket(pending_ticket); wait_reset(); - rw_pr_unlock(&lock->m_rwlock); + mysql_prlock_unlock(&lock->m_rwlock); set_deadlock_weight(MDL_DEADLOCK_WEIGHT_DML); will_wait_for(pending_ticket); @@ -2064,7 +2117,7 @@ void MDL_ticket::downgrade_exclusive_loc if (m_type != MDL_EXCLUSIVE) return; - rw_pr_wrlock(&m_lock->m_rwlock); + mysql_prlock_wrlock(&m_lock->m_rwlock); /* To update state of MDL_lock object correctly we need to temporarily exclude ticket from the granted queue and then include it back. @@ -2073,7 +2126,7 @@ void MDL_ticket::downgrade_exclusive_loc m_type= type; m_lock->m_granted.add_ticket(this); m_lock->wake_up_waiters(); - rw_pr_unlock(&m_lock->m_rwlock); + mysql_prlock_unlock(&m_lock->m_rwlock); } === modified file 'sql/mdl.h' --- a/sql/mdl.h 2010-02-28 04:35:09 +0000 +++ b/sql/mdl.h 2010-03-07 17:50:47 +0000 @@ -628,7 +628,7 @@ private: important as deadlock detector won't work correctly 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; uint m_deadlock_weight; /** @@ -652,9 +652,9 @@ private: 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; - rw_pr_unlock(&m_waiting_for_lock); + mysql_prlock_unlock(&m_waiting_for_lock); } void set_deadlock_weight(uint weight) @@ -670,9 +670,9 @@ private: void stop_waiting() { - rw_pr_wrlock(&m_waiting_for_lock); + mysql_prlock_wrlock(&m_waiting_for_lock); m_waiting_for= NULL; - rw_pr_unlock(&m_waiting_for_lock); + mysql_prlock_unlock(&m_waiting_for_lock); } void wait_reset() --===============1461765889462279691== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/marc.alff@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: marc.alff@stripped # target_branch: file:///home/malff/BZR_TREE/mysql-next-mr-bugfixing-\ # 51295-b/ # testament_sha1: 88de55e7e9a14b7435e543b6ea73bda639701e8a # timestamp: 2010-03-07 10:51:17 -0700 # base_revision_id: marc.alff@stripped\ # fv8e7yzesez1dua2 # # Begin bundle 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 Ze5vJzhGDIkfhnkaH/i7kinChIGx6VNA --===============1461765889462279691==--