List:Commits« Previous MessageNext Message »
From:Marc Alff Date:October 13 2008 10:44pm
Subject:bzr push into mysql-6.0-perf branch (marc.alff:2694 to 2695)
View as plain text  
 2695 Marc Alff	2008-10-13
      Instrumentation interface (draft), continued
modified:
  include/Makefile.am
  include/mysql/mysql_mutex.h
  include/mysql/psi.h
  include/mysql/psi_abi_v1.h.pp
  sql/mysqld.cc
  sql/sql_class.cc
  sql/sql_class.h
  storage/perfschema/psm.cc
  storage/perfschema/psm.h
  storage/perfschema/psm_server.cc

 2694 Marc Alff	2008-10-10
      Basic PSI instrumentation
added:
  include/mysql/mysql_mutex.h
  include/mysql/psi.h
  include/mysql/psi_abi_v1.h
  include/mysql/psi_abi_v1.h.pp
  include/mysql/psi_abi_v2.h
  include/mysql/psi_abi_v2.h.pp
  storage/perfschema/
  storage/perfschema/Makefile.am
  storage/perfschema/ha_perfschema.cc
  storage/perfschema/ha_perfschema.h
  storage/perfschema/plug.in
  storage/perfschema/pse_metadata.cc
  storage/perfschema/pse_metadata.h
  storage/perfschema/psm.cc
  storage/perfschema/psm.h
  storage/perfschema/psm_server.cc
  storage/perfschema/psm_server.h
  storage/perfschema/unittest/
  storage/perfschema/unittest/Makefile.am
modified:
  Makefile.am
  configure.in
  include/heap.h
  include/keycache.h
  include/maria.h
  include/my_bitmap.h
  include/my_no_pthread.h
  include/my_pthread.h
  include/my_sys.h
  include/myisam.h
  include/myisammrg.h
  include/thr_lock.h
  include/wqueue.h
  mysys/charset.c
  mysys/mf_iocache.c
  mysys/mf_iocache2.c
  mysys/mf_keycache.c
  mysys/mf_tempdir.c
  mysys/my_bitmap.c
  mysys/my_fopen.c
  mysys/my_gethostbyname.c
  mysys/my_getsystime.c
  mysys/my_lib.c
  mysys/my_lockmem.c
  mysys/my_net.c
  mysys/my_open.c
  mysys/my_pread.c
  mysys/my_pthread.c
  mysys/my_safehash.c
  mysys/my_safehash.h
  mysys/my_seek.c
  mysys/my_static.c
  mysys/my_thr_init.c
  mysys/my_uuid.c
  mysys/my_wincond.c
  mysys/my_winthread.c
  mysys/mysys_priv.h
  mysys/safemalloc.c
  mysys/thr_alarm.c
  mysys/thr_lock.c
  mysys/thr_rwlock.c
  mysys/wqueue.c
  sql/backup/backup_kernel.h
  sql/backup/be_thread.cc
  sql/backup/be_thread.h
  sql/backup/kernel.cc
  sql/ddl_blocker.cc
  sql/ddl_blocker.h
  sql/debug_sync.cc
  sql/des_key_file.cc
  sql/event_queue.cc
  sql/event_queue.h
  sql/event_scheduler.cc
  sql/event_scheduler.h
  sql/events.cc
  sql/events.h
  sql/ha_ndbcluster.cc
  sql/ha_ndbcluster.h
  sql/ha_ndbcluster_binlog.cc
  sql/ha_ndbcluster_binlog.h
  sql/ha_ndbcluster_connection.cc
  sql/ha_partition.cc
  sql/ha_partition.h
  sql/handler.cc
  sql/hash_filo.h
  sql/hostname.cc
  sql/item_func.cc
  sql/item_strfunc.cc
  sql/lock.cc
  sql/log.cc
  sql/log.h
  sql/log_event.cc
  sql/log_event.h
  sql/mdl.cc
  sql/mdl.h
  sql/mysql_priv.h
  sql/mysqld.cc
  sql/net_serv.cc
  sql/repl_failsafe.cc
  sql/repl_failsafe.h
  sql/rpl_mi.cc
  sql/rpl_mi.h
  sql/rpl_rli.cc
  sql/rpl_rli.h
  sql/scheduler.cc
  sql/set_var.cc
  sql/set_var.h
  sql/si_objects.cc
  sql/slave.cc
  sql/slave.h
  sql/sp_cache.cc
  sql/sp_head.cc
  sql/sql_acl.cc
  sql/sql_audit.cc
  sql/sql_base.cc
  sql/sql_cache.cc
  sql/sql_cache.h
  sql/sql_class.cc
  sql/sql_class.h
  sql/sql_connect.cc
  sql/sql_db.cc
  sql/sql_delete.cc
  sql/sql_handler.cc
  sql/sql_insert.cc
  sql/sql_manager.cc
  sql/sql_map.cc
  sql/sql_parse.cc
  sql/sql_partition.cc
  sql/sql_plugin.cc
  sql/sql_rename.cc
  sql/sql_repl.cc
  sql/sql_servers.cc
  sql/sql_show.cc
  sql/sql_table.cc
  sql/sql_test.cc
  sql/sql_trigger.cc
  sql/sql_udf.cc
  sql/sql_view.cc
  sql/table.cc
  sql/table.h
  sql/tztime.cc
  sql/udf_example.c
  storage/federated/ha_federated.cc
  storage/federated/ha_federated.h
  storage/maria/ha_maria.cc
  storage/maria/lockman.c
  storage/maria/lockman.h
  storage/maria/ma_bitmap.c
  storage/maria/ma_blockrec.c
  storage/maria/ma_check.c
  storage/maria/ma_checkpoint.c
  storage/maria/ma_close.c
  storage/maria/ma_create.c
  storage/maria/ma_dynrec.c
  storage/maria/ma_extra.c
  storage/maria/ma_info.c
  storage/maria/ma_init.c
  storage/maria/ma_key_recover.c
  storage/maria/ma_keycache.c
  storage/maria/ma_locking.c
  storage/maria/ma_loghandler.c
  storage/maria/ma_open.c
  storage/maria/ma_page.c
  storage/maria/ma_pagecache.h
  storage/maria/ma_panic.c
  storage/maria/ma_range.c
  storage/maria/ma_recovery.c
  storage/maria/ma_rkey.c
  storage/maria/ma_rnext.c
  storage/maria/ma_rnext_same.c
  storage/maria/ma_rprev.c
  storage/maria/ma_rsame.c
  storage/maria/ma_sort.c
  storage/maria/ma_state.c
  storage/maria/ma_static.c
  storage/maria/ma_write.c
  storage/maria/maria_def.h
  storage/maria/tablockman.c
  storage/maria/tablockman.h
  storage/maria/trnman.c
  storage/maria/trnman_public.h
  storage/myisam/ha_myisam.cc
  storage/myisam/mi_check.c
  storage/myisam/mi_close.c
  storage/myisam/mi_create.c
  storage/myisam/mi_dbug.c
  storage/myisam/mi_dynrec.c
  storage/myisam/mi_extra.c
  storage/myisam/mi_info.c
  storage/myisam/mi_keycache.c
  storage/myisam/mi_locking.c
  storage/myisam/mi_log.c
  storage/myisam/mi_open.c
  storage/myisam/mi_panic.c
  storage/myisam/mi_range.c
  storage/myisam/mi_rkey.c
  storage/myisam/mi_rnext.c
  storage/myisam/mi_rnext_same.c
  storage/myisam/mi_rprev.c
  storage/myisam/mi_rsame.c
  storage/myisam/mi_write.c
  storage/myisam/myisam_backup_engine.cc
  storage/myisam/myisamdef.h
  storage/myisam/sort.c

=== modified file 'include/Makefile.am'
--- a/include/Makefile.am	2008-07-24 11:55:49 +0000
+++ b/include/Makefile.am	2008-10-13 20:42:40 +0000
@@ -40,7 +40,8 @@ noinst_HEADERS =	config-win.h config-net
 			atomic/gcc_builtins.h my_libwrap.h my_stacktrace.h \
 			wqueue.h
 
-EXTRA_DIST =        mysql.h.pp mysql/plugin.h.pp
+EXTRA_DIST =            mysql.h.pp mysql/plugin.h.pp \
+                        mysql/psi_abi_v1.h.pp mysql/psi_abi_v2.h.pp
 
 # Remove built files and the symlinked directories
 CLEANFILES =            $(BUILT_SOURCES) readline openssl

=== modified file 'include/mysql/mysql_mutex.h'
--- a/include/mysql/mysql_mutex.h	2008-10-10 20:34:55 +0000
+++ b/include/mysql/mysql_mutex.h	2008-10-13 20:42:40 +0000
@@ -2,6 +2,24 @@
 #ifndef MYSQL_MUTEX_H
 #define MYSQL_MUTEX_H
 
+/*
+  Note: there are several orthogonal dimensions here.
+
+  Dimension 1: Instrumentation
+  HAVE_PSI_INTERFACE is defined when the instrumentation is compiled in.
+  This may happen both in debug or production builds.
+
+  Dimension 2: Debug
+  SAFE_MUTEX is defined when debug is compiled in.
+  This may happen both with and without instrumentation.
+
+  Dimention 3: Platform
+  Mutexes are implemented with one of:
+  - the pthread library
+  - fast mutexes
+  - window apis
+*/
+
 #ifdef HAVE_PSI_INTERFACE
 #include "mysql/psi.h"
 extern PSI *PSI_server;
@@ -10,19 +28,34 @@ extern PSI *PSI_server;
 #define MYSQL_MUTEX_ASSERT_OWNER(M) safe_mutex_assert_owner(& (M)->m_mutex)
 #define MYSQL_MUTEX_ASSERT_NOT_OWNER(M) safe_mutex_assert_not_owner(&
(M)->m_mutex)
 
+#ifdef HAVE_PSI_INTERFACE
+  #ifdef SAFE_MUTEX
+    #define MYSQL_MUTEX_INIT(M,K,A) mysql_mutex_init(M,K,A,__FILE__,__LINE__)
+  #else
+    #define MYSQL_MUTEX_INIT(M,K,A) mysql_mutex_init(M,K,A)
+  #endif
+  #define MYSQL_RWLOCK_INIT(M,K,A) mysql_rwlock_init(M,K,A)
+  #define MYSQL_COND_INIT(C,K,A) mysql_cond_init(C,K,A)
+#else
+  #ifdef SAFE_MUTEX
+    #define MYSQL_MUTEX_INIT(M,K,A) mysql_mutex_init(M,A,__FILE__,__LINE__)
+  #else
+    #define MYSQL_MUTEX_INIT(M,K,A) mysql_mutex_init(M,A)
+  #endif
+  #define MYSQL_RWLOCK_INIT(M,K,A) mysql_rwlock_init(M,A)
+  #define MYSQL_COND_INIT(C,K,A) mysql_cond_init(C,A)
+#endif
+
 #ifdef SAFE_MUTEX
-  #define MYSQL_MUTEX_INIT(M,K,A) mysql_mutex_init(M,K,A,__FILE__,__LINE__)
   #define MYSQL_MUTEX_DESTROY(M) mysql_mutex_destroy(M,__FILE__,__LINE__)
   #define MYSQL_MUTEX_LOCK(M) mysql_mutex_lock(M,__FILE__,__LINE__)
   #define MYSQL_MUTEX_UNLOCK(M) mysql_mutex_unlock(M,__FILE__,__LINE__)
 #else
-  #define MYSQL_MUTEX_INIT(M,K,A) mysql_mutex_init(M,K,A)
   #define MYSQL_MUTEX_DESTROY(M) mysql_mutex_destroy(M)
   #define MYSQL_MUTEX_LOCK(M) mysql_mutex_lock(M)
   #define MYSQL_MUTEX_UNLOCK(M) mysql_mutex_unlock(M)
 #endif
 
-#define MYSQL_RWLOCK_INIT(M,K,A) mysql_rwlock_init(M,K,A)
 #define MYSQL_RWLOCK_DESTROY(M) mysql_rwlock_destroy(M)
 #define MYSQL_RWLOCK_RDLOCK(M) mysql_rwlock_rdlock(M)
 #define MYSQL_RWLOCK_WRLOCK(M) mysql_rwlock_wrlock(M)
@@ -30,20 +63,12 @@ extern PSI *PSI_server;
 #define MYSQL_RWLOCK_TRYWRLOCK(M) mysql_rwlock_trywrlock(M)
 #define MYSQL_RWLOCK_UNLOCK(M) mysql_rwlock_unlock(M)
 
-#define MYSQL_COND_INIT(C,K,A) mysql_cond_init(C,K,A)
 #define MYSQL_COND_DESTROY(C) mysql_cond_destroy(C)
 #define MYSQL_COND_WAIT(C,M) mysql_cond_wait(C,M)
 #define MYSQL_COND_TIMEDWAIT(C,M,W) mysql_cond_timedwait(C,M,W)
 #define MYSQL_COND_SIGNAL(C) mysql_cond_signal(C)
 #define MYSQL_COND_BROADCAST(C) mysql_cond_broadcast(C)
 
-/*
-  Note: there are several orthogonal dimensions here.
-  - HAVE_PSI_INTERFACE, flag controlling the performance schema
-  instrumentation,
-
-  - SAFE_MUTEX, flag controlling internal debugging tools
-*/
 
 struct s_mysql_mutex
 {
@@ -103,11 +128,9 @@ static inline int mysql_mutex_lock(
   int result;
 #ifdef HAVE_PSI_INTERFACE
   struct PSI_locker *locker= NULL;
-  struct PSI_thread *thread;
   if (PSI_server && that->m_psi)
-    if ((thread= PSI_server->get_thread()))
-      if ((locker= PSI_server->get_locker(thread)))
-        PSI_server->start_wait(locker, that->m_psi, 1);
+    if ((locker= PSI_server->get_thread_locker()))
+      PSI_server->start_wait(locker, that->m_psi, 1);
 #endif
 #ifdef SAFE_MUTEX
   result= safe_mutex_lock(& that->m_mutex, FALSE, file, line);
@@ -181,11 +204,9 @@ static inline int mysql_rwlock_rdlock(
   int result;
 #ifdef HAVE_PSI_INTERFACE
   struct PSI_locker *locker= NULL;
-  struct PSI_thread *thread;
   if (PSI_server && that->m_psi)
-    if ((thread= PSI_server->get_thread()))
-      if ((locker= PSI_server->get_locker(thread)))
-        PSI_server->start_rdwait(locker, that->m_psi, 1);
+    if ((locker= PSI_server->get_thread_locker()))
+      PSI_server->start_rdwait(locker, that->m_psi, 1);
 #endif
   result= rw_rdlock(& that->m_rwlock);
 #ifdef HAVE_PSI_INTERFACE
@@ -201,11 +222,9 @@ static inline int mysql_rwlock_wrlock(
   int result;
 #ifdef HAVE_PSI_INTERFACE
   struct PSI_locker *locker= NULL;
-  struct PSI_thread *thread;
   if (PSI_server && that->m_psi)
-    if ((thread= PSI_server->get_thread()))
-      if ((locker= PSI_server->get_locker(thread)))
-        PSI_server->start_wrwait(locker, that->m_psi, 1);
+    if ((locker= PSI_server->get_thread_locker()))
+      PSI_server->start_wrwait(locker, that->m_psi, 1);
 #endif
   result= rw_rdlock(& that->m_rwlock);
 #ifdef HAVE_PSI_INTERFACE
@@ -221,11 +240,9 @@ static inline int mysql_rwlock_tryrdlock
   int result;
 #ifdef HAVE_PSI_INTERFACE
   struct PSI_locker *locker= NULL;
-  struct PSI_thread *thread;
   if (PSI_server && that->m_psi)
-    if ((thread= PSI_server->get_thread()))
-      if ((locker= PSI_server->get_locker(thread)))
-        PSI_server->start_rdwait(locker, that->m_psi, 0);
+    if ((locker= PSI_server->get_thread_locker()))
+      PSI_server->start_rdwait(locker, that->m_psi, 0);
 #endif
   result= rw_rdlock(& that->m_rwlock);
 #ifdef HAVE_PSI_INTERFACE
@@ -241,11 +258,9 @@ static inline int mysql_rwlock_trywrlock
   int result;
 #ifdef HAVE_PSI_INTERFACE
   struct PSI_locker *locker= NULL;
-  struct PSI_thread *thread;
   if (PSI_server && that->m_psi)
-    if ((thread= PSI_server->get_thread()))
-      if ((locker= PSI_server->get_locker(thread)))
-        PSI_server->start_wrwait(locker, that->m_psi, 0);
+    if ((locker= PSI_server->get_thread_locker()))
+      PSI_server->start_wrwait(locker, that->m_psi, 0);
 #endif
   result= rw_rdlock(& that->m_rwlock);
 #ifdef HAVE_PSI_INTERFACE
@@ -309,11 +324,9 @@ static inline int mysql_cond_wait(
   int result;
 #ifdef HAVE_PSI_INTERFACE
   struct PSI_locker *locker= NULL;
-  struct PSI_thread *thread;
   if (PSI_server)
-    if ((thread= PSI_server->get_thread()))
-      if ((locker= PSI_server->get_locker(thread)))
-        PSI_server->start_condwait(locker, that->m_psi, 1);
+    if ((locker= PSI_server->get_thread_locker()))
+      PSI_server->start_condwait(locker, that->m_psi, 1);
 #endif
   result= pthread_cond_wait(& that->m_cond, & mutex->m_mutex);
 #ifdef HAVE_PSI_INTERFACE
@@ -331,11 +344,9 @@ static inline int mysql_cond_timedwait(
   int result;
 #ifdef HAVE_PSI_INTERFACE
   struct PSI_locker *locker= NULL;
-  struct PSI_thread *thread;
   if (PSI_server && that->m_psi)
-    if ((thread= PSI_server->get_thread()))
-      if ((locker= PSI_server->get_locker(thread)))
-        PSI_server->start_condwait(locker, that->m_psi, 0);
+    if ((locker= PSI_server->get_thread_locker()))
+      PSI_server->start_condwait(locker, that->m_psi, 0);
 #endif
   result= pthread_cond_timedwait(& that->m_cond, & mutex->m_mutex,
abstime);
 #ifdef HAVE_PSI_INTERFACE

=== modified file 'include/mysql/psi.h'
--- a/include/mysql/psi.h	2008-10-10 20:34:55 +0000
+++ b/include/mysql/psi.h	2008-10-13 20:42:40 +0000
@@ -52,8 +52,10 @@ struct PSI_v1
 
   struct PSI_thread* (*new_thread)();
   struct PSI_thread* (*get_thread)();
+  void (*set_thread)(struct PSI_thread* thread);
   void (*delete_thread)(struct PSI_thread *thread);
 
+  struct PSI_locker* (*get_thread_locker)();
   struct PSI_locker* (*get_locker)(struct PSI_thread *thread);
 
   void (*unlock_mutex)(struct PSI_thread *thread, struct PSI_mutex* mutex);

=== modified file 'include/mysql/psi_abi_v1.h.pp'
--- a/include/mysql/psi_abi_v1.h.pp	2008-10-10 20:34:55 +0000
+++ b/include/mysql/psi_abi_v1.h.pp	2008-10-13 20:42:40 +0000
@@ -24,7 +24,9 @@ struct PSI_v1
   void (*destroy_cond)(struct PSI_cond* cond, void *identity);
   struct PSI_thread* (*new_thread)();
   struct PSI_thread* (*get_thread)();
+  void (*set_thread)(struct PSI_thread* thread);
   void (*delete_thread)(struct PSI_thread *thread);
+  struct PSI_locker* (*get_thread_locker)();
   struct PSI_locker* (*get_locker)(struct PSI_thread *thread);
   void (*unlock_mutex)(struct PSI_thread *thread, struct PSI_mutex* mutex);
   void (*unlock_rwlock)(struct PSI_thread *thread, struct PSI_rwlock* rwlock);

=== modified file 'sql/mysqld.cc'
--- a/sql/mysqld.cc	2008-10-10 20:34:55 +0000
+++ b/sql/mysqld.cc	2008-10-13 20:42:40 +0000
@@ -29,6 +29,10 @@
 #include "ddl_blocker.h"
 #include "sql_audit.h"
 
+#ifdef HAVE_PERFORMANCE_SCHEMA
+#include "../storage/perfschema/psm_server.h"
+#endif
+
 #include "../storage/myisam/ha_myisam.h"
 
 #include "rpl_injector.h"
@@ -4430,6 +4434,9 @@ void decrement_handler_count()
 #define decrement_handler_count()
 #endif /* defined(__NT__) || defined(HAVE_SMEM) */
 
+#ifdef HAVE_PSI_INTERFACE
+static void init_psi_server_keys();
+#endif
 
 #ifndef EMBEDDED_LIBRARY
 #ifdef __WIN__
@@ -4441,6 +4448,16 @@ int main(int argc, char **argv)
   MY_INIT(argv[0]);		// init my_sys library & pthreads
   /* nothing should come before this line ^^^ */
 
+#ifdef HAVE_PERFORMANCE_SCHEMA
+  PSI_hook= initialize_performance_schema();
+#endif
+
+#ifdef HAVE_PSI_INTERFACE
+  if (PSI_hook)
+    PSI_server= (PSI*) PSI_hook->get_PSI(PSI_CURRENT_VERSION);
+  init_psi_server_keys();
+#endif
+
   /* Set signal used to kill MySQL */
 #if defined(SIGUSR2)
   thr_kill_signal= thd_lib_detected == THD_LIB_LT ? SIGINT : SIGUSR2;
@@ -9065,18 +9082,14 @@ PSI_cond_key key_COND_thread_cache;
 PSI_cond_key key_COND_flush_thread_cache;
 PSI_mutex_key key_LOCK_rpl_status;
 PSI_cond_key key_COND_rpl_status;
-
 PSI_mutex_key key_LOCK_delete;
 PSI_mutex_key key_hash_filo_lock;
 PSI_mutex_key key_LOCK_ha_data;
-
 PSI_mutex_key key_LOG_LOCK_log;
-
 PSI_mutex_key key_BINLOG_LOCK_index;
 PSI_mutex_key key_BINLOG_LOCK_prep_xids;
 PSI_cond_key key_BINLOG_COND_prep_xids;
 PSI_cond_key key_BINLOG_update_cond;
-
 PSI_mutex_key key_LOCK_logger;
 PSI_mutex_key key_LOG_INFO_lock;
 PSI_mutex_key key_LOCK_backupid;
@@ -9113,8 +9126,6 @@ PSI_cond_key key_COND_caller_wait;
 PSI_mutex_key key_BRC_run_lock;
 PSI_mutex_key key_NDB_SHARE_mutex;
 
-
-
 #ifdef HAVE_OPENSSL
 PSI_mutex_key key_LOCK_des_key_file;
 #endif
@@ -9131,12 +9142,124 @@ PSI_cond_key key_COND_pool;
 
 void init_psi_server_keys()
 {
-}
-
-#endif
+  PSI_mutex_key (*reg_mutex)(const char* name, int global);
+  PSI_rwlock_key (*reg_rwlock)(const char* name, int global);
+  PSI_cond_key (*reg_cond)(const char* name, int global);
+  int global= 1;
+  int multiple= 0;
 
+  if (PSI_server == NULL)
+    return;
 
+  reg_mutex= PSI_server->register_mutex;
+  reg_rwlock= PSI_server->register_rwlock;
+  reg_cond= PSI_server->register_cond;
+
+  /* ALL MUTEXES */
+  key_LOCK_mysql_create_db= (*reg_mutex)("LOCK_mysql_create_db", global);
+  key_LOCK_Acl= (*reg_mutex)("LOCK_Acl", global);
+  key_LOCK_open= (*reg_mutex)("LOCK_open", global);
+  key_LOCK_lock_db= (*reg_mutex)("LOCK_lock_db", global);
+  key_LOCK_thread_count= (*reg_mutex)("LOCK_thread_count", global);
+  key_LOCK_mapped_file= (*reg_mutex)("LOCK_mapped_file", global);
+  key_LOCK_status= (*reg_mutex)("LOCK_status", global);
+  key_LOCK_error_log= (*reg_mutex)("LOCK_error_log", global);
+  key_LOCK_delayed_insert= (*reg_mutex)("LOCK_delayed_insert", global);
+  key_LOCK_uuid_short= (*reg_mutex)("LOCK_uuid_short", global);
+  key_LOCK_delayed_status= (*reg_mutex)("LOCK_delayed_status", global);
+  key_LOCK_delayed_create= (*reg_mutex)("LOCK_delayed_create", global);
+  key_LOCK_crypt= (*reg_mutex)("LOCK_crypt", global);
+  key_LOCK_timezone= (*reg_mutex)("LOCK_timezone", global);
+  key_LOCK_slave_list= (*reg_mutex)("LOCK_slave_list", global);
+  key_LOCK_active_mi= (*reg_mutex)("LOCK_active_mi", global);
+  key_LOCK_manager= (*reg_mutex)("LOCK_manager", global);
+  key_LOCK_global_read_lock= (*reg_mutex)("LOCK_global_read_lock", global);
+  key_LOCK_global_system_variables= (*reg_mutex)("LOCK_global_system_variables", global);
+  key_LOCK_user_conn= (*reg_mutex)("LOCK_user_conn", global);
+  key_LOCK_prepared_stmt_count= (*reg_mutex)("LOCK_prepared_stmt_count", global);
+  key_LOCK_bytes_sent= (*reg_mutex)("LOCK_bytes_sent", global);
+  key_LOCK_bytes_received= (*reg_mutex)("LOCK_bytes_received", global);
+  key_LOCK_connection_count= (*reg_mutex)("LOCK_connection_count", global);
+  key_LOCK_server_started= (*reg_mutex)("LOCK_server_started", global);
+  key_LOCK_rpl_status= (*reg_mutex)("LOCK_rpl_status", global);
+  key_LOCK_delete= (*reg_mutex)("LOCK_delete", global);
+  key_hash_filo_lock= (*reg_mutex)("hash_filo_lock", global);
+  key_LOCK_ha_data= (*reg_mutex)("LOCK_ha_data", global);
+  key_LOG_LOCK_log= (*reg_mutex)("MYSQL_LOG::LOCK_log", global);
+  key_BINLOG_LOCK_index= (*reg_mutex)("MYSQL_BIN_LOG::LOCK_index", global);
+  key_BINLOG_LOCK_prep_xids= (*reg_mutex)("MYSQL_BIN_LOG::LOCK_prep_xids", global);
+  key_LOCK_logger= (*reg_mutex)("LOCK_logger", global);
+  key_LOG_INFO_lock= (*reg_mutex)("LOG_INFO_lock", global);
+  key_LOCK_backupid= (*reg_mutex)("LOCK_backupid", global);
+  key_structure_guard_mutex= (*reg_mutex)("Query_cache::guard", global);
+  key_RLI_run_lock= (*reg_mutex)("Relay_log_info::run_lock", global);
+  key_RLI_data_lock= (*reg_mutex)("Relay_log_info::data_lock", global);
+  key_RLI_log_space_lock= (*reg_mutex)("Relay_log_info::log_space_lock", global);
+  key_MI_run_lock= (*reg_mutex)("Master_info::run_lock", global);
+  key_MI_data_lock= (*reg_mutex)("Master_info::data_lock", global);
+  key_LOCK_event_metadata= (*reg_mutex)("LOCK_event_metadata", global);
+  key_LOCK_event_queue= (*reg_mutex)("LOCK_event_queue", global);
+  key_LOCK_scheduler_state= (*reg_mutex)("LOCK_scheduler_state", global);
+  key_THR_LOCK_DDL_blocker= (*reg_mutex)("THR_LOCK_DDL_blocker", global);
+  key_THR_LOCK_DDL_is_blocked= (*reg_mutex)("THR_LOCK_DDL_is_blocked", global);
+  key_THR_LOCK_DDL_blocker_blocked= (*reg_mutex)("THR_LOCK_DDL_blocker_blocked", global);
+  key_THR_LOCK_thread= (*reg_mutex)("THR_LOCK_thread", global);
+  key_THR_LOCK_caller= (*reg_mutex)("THR_LOCK_caller", global);
+  key_BRC_run_lock= (*reg_mutex)("Backup_restore_ctx::run_lock", global);
+  key_NDB_SHARE_mutex= (*reg_mutex)("NDB_SHARE::mutex", global);
 
+#ifdef HAVE_OPENSSL
+  key_LOCK_des_key_file= (*reg_mutex)("LOCK_des_key_file", global);
+#endif
 
+#ifdef HAVE_MMAP
+  key_PAGE_lock= (*reg_mutex)("PAGE::lock", global);
+  key_LOCK_sync= (*reg_mutex)("LOCK_sync", global);
+  key_LOCK_active= (*reg_mutex)("LOCK_active", global);
+  key_LOCK_pool= (*reg_mutex)("LOCK_pool", global);
+#endif
+
+  /* ALL RWLOCKS */
+
+  key_LOCK_grant= (*reg_rwlock)("LOCK_grant", global);
+  key_LOCK_sys_init_connect= (*reg_rwlock)("LOCK_sys_init_connect", global);
+  key_LOCK_sys_init_slave= (*reg_rwlock)("LOCK_sys_init_slave", global);
+  key_LOCK_system_variables_hash= (*reg_rwlock)("LOCK_system_variables_hash", global);
+  key_QCQ_lock= (*reg_rwlock)("Query_cache_query::lock", global);
+
+  /* ALL CONDITIONS */
+
+  key_COND_server_started= (*reg_cond)("COND_server_started", global);
+  key_COND_refresh= (*reg_cond)("COND_refresh", global);
+  key_COND_thread_count= (*reg_cond)("COND_thread_count", global);
+  key_COND_manager= (*reg_cond)("COND_manager", global);
+  key_COND_global_read_lock= (*reg_cond)("COND_global_read_lock", global);
+  key_COND_thread_cache= (*reg_cond)("COND_thread_cache", global);
+  key_COND_flush_thread_cache= (*reg_cond)("COND_flush_thread_cache", global);
+  key_COND_rpl_status= (*reg_cond)("COND_rpl_status", global);
+  key_BINLOG_COND_prep_xids= (*reg_cond)("BINLOG::COND_prep_xids", global);
+  key_BINLOG_update_cond= (*reg_cond)("BINLOG::update_cond", global);
+  key_COND_cache_status_changed= (*reg_cond)("COND_cache_status_changed", global);
+  key_RLI_data_cond= (*reg_cond)("Relay_log_info::data_cond", global);
+  key_RLI_start_cond= (*reg_cond)("Relay_log_info::start_cond", global);
+  key_RLI_stop_cond= (*reg_cond)("Relay_log_info::stop_cond", global);
+  key_RLI_log_space_cond= (*reg_cond)("Relay_log_info::log_space_cond", global);
+  key_MI_data_cond= (*reg_cond)("Master_info::data_cond", global);
+  key_MI_start_cond= (*reg_cond)("Master_info::start_cond", global);
+  key_MI_stop_cond= (*reg_cond)("Master_info::stop_cond", global);
+  key_Event_scheduler_COND_state= (*reg_cond)("Event_scheduler::COND_state", global);
+  key_COND_queue_state= (*reg_cond)("COND_queue_state", global);
+  key_COND_DDL_blocker= (*reg_cond)("COND_DDL_blocker", global);
+  key_COND_process_blocked= (*reg_cond)("COND_process_blocked", global);
+  key_COND_DDL_blocker_blocked= (*reg_cond)("COND_DDL_blocker_blocked", global);
+  key_COND_thread_wait= (*reg_cond)("COND_thread_wait", global);
+  key_COND_caller_wait= (*reg_cond)("COND_caller_wait", global);
 
+#ifdef HAVE_MMAP
+  key_PAGE_cond= (*reg_cond)("PAGE::cond", global);
+  key_COND_active= (*reg_cond)("COND_active", global);
+  key_COND_pool= (*reg_cond)("COND_pool", global);
+#endif
+}
+#endif
 

=== modified file 'sql/sql_class.cc'
--- a/sql/sql_class.cc	2008-10-10 20:34:55 +0000
+++ b/sql/sql_class.cc	2008-10-13 20:42:40 +0000
@@ -546,6 +546,10 @@ THD::THD()
 {
   ulong tmp;
 
+#ifdef HAVE_PSI_INTERFACE
+  m_psi= (PSI_server ? PSI_server->new_thread() : NULL);
+#endif
+
   /*
     Pass nominal parameters to init_alloc_root only to ensure that
     the destructor works OK in case of an error. The main_mem_root
@@ -958,6 +962,12 @@ THD::~THD()
 #endif
 
   free_root(&main_mem_root, MYF(0));
+
+#ifdef HAVE_PSI_INTERFACE
+  if (PSI_server)
+    PSI_server->delete_thread(m_psi);
+#endif
+
   DBUG_VOID_RETURN;
 }
 
@@ -1092,6 +1102,11 @@ bool THD::store_globals()
   */
   DBUG_ASSERT(thread_stack);
 
+#ifdef HAVE_PSI_INTERFACE
+  if (PSI_server)
+    PSI_server->set_thread(m_psi);
+#endif
+
   if (my_pthread_setspecific_ptr(THR_THD,  this) ||
       my_pthread_setspecific_ptr(THR_MALLOC, &mem_root))
     return 1;

=== modified file 'sql/sql_class.h'
--- a/sql/sql_class.h	2008-10-10 20:34:55 +0000
+++ b/sql/sql_class.h	2008-10-13 20:42:40 +0000
@@ -2385,6 +2385,11 @@ private:
     tree itself is reused between executions and thus is stored elsewhere.
   */
   MEM_ROOT main_mem_root;
+
+#ifdef HAVE_PSI_INTERFACE
+public:
+  PSI_thread *m_psi;
+#endif
 };
 
 

=== modified file 'storage/perfschema/psm.cc'
--- a/storage/perfschema/psm.cc	2008-10-10 20:34:55 +0000
+++ b/storage/perfschema/psm.cc	2008-10-13 20:42:40 +0000
@@ -1,25 +1,31 @@
 
 #include "psm.h"
 
+pthread_key(PSM_thread*, THR_PSM);
 
 static PSI_mutex_key register_mutex_v1(const char* name, int global)
 {
+  fprintf(stderr, "MUTEX: %s\n", name);
   return 0;
 }
 
 static PSI_rwlock_key register_rwlock_v1(const char* name, int global)
 {
+  fprintf(stderr, "RWLOCK: %s\n", name);
   return 0;
 }
 
 static PSI_cond_key register_cond_v1(const char* name, int global)
 {
+  fprintf(stderr, "COND: %s\n", name);
   return 0;
 }
 
 static PSI_mutex* init_mutex_v1(PSI_mutex_key key, void *identity)
 {
-  return 0;
+  static PSM_mutex dummy;
+  PSM_mutex *psm= & dummy;
+  return (PSI_mutex*) psm;
 }
 
 static void destroy_mutex_v1(PSI_mutex* mutex, void *identity)
@@ -28,7 +34,9 @@ static void destroy_mutex_v1(PSI_mutex* 
 
 static PSI_rwlock* init_rwlock_v1(PSI_rwlock_key key, void *identity)
 {
-  return 0;
+  static PSM_rwlock dummy;
+  PSM_rwlock *psm= & dummy;
+  return (PSI_rwlock*) psm;
 }
 
 static void destroy_rwlock_v1(PSI_rwlock* rwlock, void *identity)
@@ -37,7 +45,9 @@ static void destroy_rwlock_v1(PSI_rwlock
 
 static PSI_cond* init_cond_v1(PSI_cond_key key, void *identity)
 {
-  return 0;
+  static PSM_cond dummy;
+  PSM_cond *psm= & dummy;
+  return (PSI_cond*) psm;
 }
 
 static void destroy_cond_v1(PSI_cond* cond, void *identity)
@@ -46,21 +56,43 @@ static void destroy_cond_v1(PSI_cond* co
 
 static PSI_thread* new_thread_v1()
 {
-  return 0;
+  static PSM_thread dummy;
+  PSM_thread *psm= & dummy;
+
+  my_pthread_setspecific_ptr(THR_PSM, psm);
+  return (PSI_thread*) psm;
 }
 
 static PSI_thread* get_thread_v1()
 {
-  return 0;
+  PSM_thread *psm;
+  psm= my_pthread_getspecific_ptr(PSM_thread*, THR_PSM);
+  return (PSI_thread*) psm;
+}
+
+static void set_thread_v1(struct PSI_thread* thread)
+{
+  PSM_thread *psm= (PSM_thread*) thread;
+  my_pthread_setspecific_ptr(THR_PSM, psm);
 }
 
 static void delete_thread_v1(PSI_thread *thread)
 {
+  my_pthread_setspecific_ptr(THR_PSM, NULL);
+}
+
+static PSI_locker* get_thread_locker_v1()
+{
+  PSM_locker dummy;
+  PSM_locker *psm= & dummy;
+  return (PSI_locker*) psm;
 }
 
 static PSI_locker* get_locker_v1(PSI_thread *thread)
 {
-  return 0;
+  PSM_locker dummy;
+  PSM_locker *psm= & dummy;
+  return (PSI_locker*) psm;
 }
 
 static void unlock_mutex_v1(PSI_thread *thread, PSI_mutex* mutex)
@@ -124,7 +156,9 @@ struct PSI_v1 PSM_v1=
   destroy_cond_v1,
   new_thread_v1,
   get_thread_v1,
+  set_thread_v1,
   delete_thread_v1,
+  get_thread_locker_v1,
   get_locker_v1,
   unlock_mutex_v1,
   unlock_rwlock_v1,

=== modified file 'storage/perfschema/psm.h'
--- a/storage/perfschema/psm.h	2008-10-10 20:34:55 +0000
+++ b/storage/perfschema/psm.h	2008-10-13 20:42:40 +0000
@@ -10,5 +10,33 @@
 extern struct PSI_v1 PSM_v1;
 extern struct PSI_v2 PSM_v2;
 
+struct PSM_mutex
+{
+  int todo;
+};
+
+struct PSM_rwlock
+{
+  int todo;
+};
+
+struct PSM_cond
+{
+  int todo;
+};
+
+struct PSM_thread
+{
+  int todo;
+};
+
+struct PSM_locker
+{
+  int todo;
+};
+
+#include "mysql_priv.h"
+extern pthread_key(PSM_thread*, THR_PSM);
+
 #endif
 

=== modified file 'storage/perfschema/psm_server.cc'
--- a/storage/perfschema/psm_server.cc	2008-10-10 20:34:55 +0000
+++ b/storage/perfschema/psm_server.cc	2008-10-13 20:42:40 +0000
@@ -18,6 +18,9 @@ struct PSI_bootstrap PSM_boostrap=
 
 struct PSI_bootstrap* initialize_performance_schema()
 {
+  if (pthread_key_create(&THR_PSM, NULL))
+    return NULL;
+
   return & PSM_boostrap;
 }
 

Thread
bzr push into mysql-6.0-perf branch (marc.alff:2694 to 2695) Marc Alff13 Oct