components/mysql-5-1/patches/00dtrace.patch
changeset 444 a2a87847a213
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/mysql-5-1/patches/00dtrace.patch	Mon Aug 01 02:24:31 2011 -0700
@@ -0,0 +1,5072 @@
+diff -Nru config/ac-macros/dtrace.m4 config/ac-macros/dtrace.m4
+--- config/ac-macros/dtrace.m4	1970-01-01 01:00:00.000000000 +0100
++++ config/ac-macros/dtrace.m4	2011-05-27 10:50:57.000000000 +0200
+@@ -0,0 +1,43 @@
++dnl ---------------------------------------------------------------------------
++dnl Macro: DTRACE_TEST
++dnl ---------------------------------------------------------------------------
++AC_ARG_ENABLE(dtrace,
++    AC_HELP_STRING([--enable-dtrace],[Build with support for DTrace.]),
++    [
++      ENABLE_DTRACE="$enable_dtrace"
++    ],
++    [
++      ENABLE_DTRACE="yes" 
++    ]
++)
++DTRACEFLAGS=""
++HAVE_DTRACE=""
++HAVE_DTRACE_DASH_G=""
++if test "$ENABLE_DTRACE" = "yes"; then
++  AC_PATH_PROG(DTRACE, dtrace, [not found], [$PATH:/usr/sbin])
++  if test "$DTRACE" = "not found"; then
++    ENABLE_DTRACE="no"
++  else
++    AC_DEFINE([HAVE_DTRACE], [1], [Defined to 1 if DTrace support is enabled])
++    case "$target_os" in
++      *solaris*)
++        HAVE_DTRACE_DASH_G="yes"
++        case "$CFLAGS" in
++          *-m64*)
++            DTRACEFLAGS="$DTRACEFLAGS -64"
++            ;;
++        esac
++        ;;
++      *)
++        HAVE_DTRACE_DASH_G="no"
++        ;;
++    esac
++  fi
++fi
++AC_SUBST(DTRACEFLAGS)
++AC_SUBST(HAVE_DTRACE)
++AM_CONDITIONAL([HAVE_DTRACE], [ test "$ENABLE_DTRACE" = "yes" ])
++AM_CONDITIONAL([HAVE_DTRACE_DASH_G], [ test "$HAVE_DTRACE_DASH_G" = "yes" ])
++dnl ---------------------------------------------------------------------------
++dnl End Macro: DTRACE_TEST
++dnl ---------------------------------------------------------------------------
+diff -Nru config.h.in config.h.in
+--- config.h.in	2011-05-27 11:03:51.000000000 +0200
++++ config.h.in	2011-05-27 10:51:57.000000000 +0200
+@@ -268,6 +268,9 @@
+ /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
+ #undef HAVE_DOPRNT
+ 
++/* Defined to 1 if DTrace support is enabled */
++#undef HAVE_DTRACE
++
+ /* Access checks in embedded library */
+ #undef HAVE_EMBEDDED_PRIVILEGE_CONTROL
+ 
+diff -Nru configure configure
+--- configure	2011-05-27 11:04:09.000000000 +0200
++++ configure	2011-05-27 10:52:16.000000000 +0200
+@@ -1047,6 +1047,13 @@
+ MAKEINDEX
+ PDFLATEX
+ DOXYGEN
++HAVE_DTRACE_DASH_G_FALSE
++HAVE_DTRACE_DASH_G_TRUE
++HAVE_DTRACE_FALSE
++HAVE_DTRACE_TRUE
++HAVE_DTRACE
++DTRACEFLAGS
++DTRACE
+ am__untar
+ am__tar
+ AMTAR
+@@ -1127,6 +1134,7 @@
+ with_extra_charsets
+ with_uca
+ with_experimental_collations
++enable_dtrace
+ with_system_type
+ with_machine_type
+ with_darwin_mwcc
+@@ -1832,6 +1840,7 @@
+   --disable-option-checking  ignore unrecognized --enable/--with options
+   --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
++  --enable-dtrace         Build with support for DTrace.
+   --disable-dependency-tracking  speeds up one-time build
+   --enable-dependency-tracking   do not reject slow dependency extractors
+   --enable-shared[=PKGS]  build shared libraries [default=yes]
+@@ -3870,6 +3879,106 @@
+ 
+ 
+ 
++# Check whether --enable-dtrace was given.
++if test "${enable_dtrace+set}" = set; then
++  enableval=$enable_dtrace;
++      ENABLE_DTRACE="$enable_dtrace"
++
++else
++
++      ENABLE_DTRACE="yes"
++
++
++fi
++
++DTRACEFLAGS=""
++HAVE_DTRACE=""
++HAVE_DTRACE_DASH_G=""
++if test "$ENABLE_DTRACE" = "yes"; then
++  # Extract the first word of "dtrace", so it can be a program name with args.
++set dummy dtrace; ac_word=$2
++{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_path_DTRACE+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  case $DTRACE in
++  [\\/]* | ?:[\\/]*)
++  ac_cv_path_DTRACE="$DTRACE" # Let the user override the test with a path.
++  ;;
++  *)
++  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++as_dummy="$PATH:/usr/sbin"
++for as_dir in $as_dummy
++do
++  IFS=$as_save_IFS
++  test -z "$as_dir" && as_dir=.
++  for ac_exec_ext in '' $ac_executable_extensions; do
++  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++    ac_cv_path_DTRACE="$as_dir/$ac_word$ac_exec_ext"
++    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
++    break 2
++  fi
++done
++done
++IFS=$as_save_IFS
++
++  test -z "$ac_cv_path_DTRACE" && ac_cv_path_DTRACE="not found"
++  ;;
++esac
++fi
++DTRACE=$ac_cv_path_DTRACE
++if test -n "$DTRACE"; then
++  { $as_echo "$as_me:$LINENO: result: $DTRACE" >&5
++$as_echo "$DTRACE" >&6; }
++else
++  { $as_echo "$as_me:$LINENO: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++  if test "$DTRACE" = "not found"; then
++    ENABLE_DTRACE="no"
++  else
++
++cat >>confdefs.h <<\_ACEOF
++#define HAVE_DTRACE 1
++_ACEOF
++
++    case "$target_os" in
++      *solaris*)
++        HAVE_DTRACE_DASH_G="yes"
++        case "$CFLAGS" in
++          *-m64*)
++            DTRACEFLAGS="$DTRACEFLAGS -64"
++            ;;
++        esac
++        ;;
++      *)
++        HAVE_DTRACE_DASH_G="no"
++        ;;
++    esac
++  fi
++fi
++
++
++ if  test "$ENABLE_DTRACE" = "yes" ; then
++  HAVE_DTRACE_TRUE=
++  HAVE_DTRACE_FALSE='#'
++else
++  HAVE_DTRACE_TRUE='#'
++  HAVE_DTRACE_FALSE=
++fi
++
++ if  test "$HAVE_DTRACE_DASH_G" = "yes" ; then
++  HAVE_DTRACE_DASH_G_TRUE=
++  HAVE_DTRACE_DASH_G_FALSE='#'
++else
++  HAVE_DTRACE_DASH_G_TRUE='#'
++  HAVE_DTRACE_DASH_G_FALSE=
++fi
++
++
+ 
+ 
+ 
+@@ -45566,6 +45675,20 @@
+ LTLIBOBJS=$ac_ltlibobjs
+ 
+ 
++if test -z "${HAVE_DTRACE_TRUE}" && test -z "${HAVE_DTRACE_FALSE}"; then
++  { { $as_echo "$as_me:$LINENO: error: conditional \"HAVE_DTRACE\" was never defined.
++Usually this means the macro was only invoked conditionally." >&5
++$as_echo "$as_me: error: conditional \"HAVE_DTRACE\" was never defined.
++Usually this means the macro was only invoked conditionally." >&2;}
++   { (exit 1); exit 1; }; }
++fi
++if test -z "${HAVE_DTRACE_DASH_G_TRUE}" && test -z "${HAVE_DTRACE_DASH_G_FALSE}"; then
++  { { $as_echo "$as_me:$LINENO: error: conditional \"HAVE_DTRACE_DASH_G\" was never defined.
++Usually this means the macro was only invoked conditionally." >&5
++$as_echo "$as_me: error: conditional \"HAVE_DTRACE_DASH_G\" was never defined.
++Usually this means the macro was only invoked conditionally." >&2;}
++   { (exit 1); exit 1; }; }
++fi
+ if test -z "${DARWIN_MWCC_TRUE}" && test -z "${DARWIN_MWCC_FALSE}"; then
+   { { $as_echo "$as_me:$LINENO: error: conditional \"DARWIN_MWCC\" was never defined.
+ Usually this means the macro was only invoked conditionally." >&5
+diff -Nru configure.in configure.in
+--- configure.in	2011-05-27 11:02:46.000000000 +0200
++++ configure.in	2011-05-27 10:50:57.000000000 +0200
+@@ -50,6 +50,7 @@
+ sinclude(config/ac-macros/check_cpu.m4)
+ sinclude(config/ac-macros/character_sets.m4)
+ sinclude(config/ac-macros/compiler_flag.m4)
++sinclude(config/ac-macros/dtrace.m4)
+ sinclude(config/ac-macros/plugins.m4)
+ sinclude(config/ac-macros/ha_ndbcluster.m4)
+ sinclude(config/ac-macros/large_file.m4)
+diff -Nru include/Makefile.am include/Makefile.am
+--- include/Makefile.am	2011-05-27 11:02:47.000000000 +0200
++++ include/Makefile.am	2011-05-27 10:50:57.000000000 +0200
+@@ -67,5 +67,18 @@
+ dist-hook:
+ 	$(RM) -f $(distdir)/mysql_version.h $(distdir)/my_config.h
+ 
++
++if HAVE_DTRACE
++BUILT_SOURCES += probes_mysql_dtrace.h
++CLEANFILES += probes_mysql_dtrace.h
++DTRACEPROVIDER = $(top_srcdir)/sql/probes_mysql.d
++
++probes_mysql_dtrace.h: $(DTRACEPROVIDER)
++	$(DTRACE) $(DTRACEFLAGS) -h -s $^ -o $@
++endif
++
++probes_mysql_nodtrace.h: $(DTRACEPROVIDER)
++	$(top_srcdir)/scripts/dheadgen.pl -f $^ > $@
++
+ # Don't update the files from bitkeeper
+ %::SCCS/s.%
+diff -Nru include/Makefile.in include/Makefile.in
+--- include/Makefile.in	2011-05-27 11:03:55.000000000 +0200
++++ include/Makefile.in	2011-05-27 10:52:01.000000000 +0200
+@@ -50,6 +50,8 @@
+ build_triplet = @build@
+ host_triplet = @host@
+ target_triplet = @target@
++@HAVE_DTRACE_TRUE@am__append_1 = probes_mysql_dtrace.h
++@HAVE_DTRACE_TRUE@am__append_2 = probes_mysql_dtrace.h
+ subdir = include
+ DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
+ 	$(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+@@ -59,6 +61,7 @@
+ 	$(top_srcdir)/config/ac-macros/check_cpu.m4 \
+ 	$(top_srcdir)/config/ac-macros/character_sets.m4 \
+ 	$(top_srcdir)/config/ac-macros/compiler_flag.m4 \
++	$(top_srcdir)/config/ac-macros/dtrace.m4 \
+ 	$(top_srcdir)/config/ac-macros/plugins.m4 \
+ 	$(top_srcdir)/config/ac-macros/ha_ndbcluster.m4 \
+ 	$(top_srcdir)/config/ac-macros/large_file.m4 \
+@@ -130,6 +133,8 @@
+ DOT_FRM_VERSION = @DOT_FRM_VERSION@
+ DOXYGEN = @DOXYGEN@
+ DSYMUTIL = @DSYMUTIL@
++DTRACE = @DTRACE@
++DTRACEFLAGS = @DTRACEFLAGS@
+ DUMPBIN = @DUMPBIN@
+ DVIS = @DVIS@
+ ECHO_C = @ECHO_C@
+@@ -142,6 +147,7 @@
+ GETCONF = @GETCONF@
+ GREP = @GREP@
+ GXX = @GXX@
++HAVE_DTRACE = @HAVE_DTRACE@
+ HOSTNAME = @HOSTNAME@
+ INNODB_DYNAMIC_CFLAGS = @INNODB_DYNAMIC_CFLAGS@
+ INSTALL = @INSTALL@
+@@ -386,7 +392,7 @@
+ yassl_libs = @yassl_libs@
+ yassl_taocrypt_extra_cxxflags = @yassl_taocrypt_extra_cxxflags@
+ zlib_dir = @zlib_dir@
+-BUILT_SOURCES = $(HEADERS_GEN_MAKE) link_sources
++BUILT_SOURCES = $(HEADERS_GEN_MAKE) link_sources $(am__append_1)
+ HEADERS_GEN_CONFIGURE = mysql_version.h
+ HEADERS_GEN_MAKE = my_config.h
+ HEADERS_ABI = mysql.h mysql_com.h mysql_time.h \
+@@ -416,10 +422,11 @@
+ EXTRA_DIST = mysql.h.pp mysql/plugin.h.pp
+ 
+ # Remove built files and the symlinked directories
+-CLEANFILES = $(BUILT_SOURCES) readline openssl
++CLEANFILES = $(BUILT_SOURCES) readline openssl $(am__append_2)
+ 
+ # Some include files that may be moved and patched by configure
+ DISTCLEANFILES = sched.h $(CLEANFILES) $(HEADERS_GEN_CONFIGURE)
++@HAVE_DTRACE_TRUE@DTRACEPROVIDER = $(top_srcdir)/sql/probes_mysql.d
+ all: $(BUILT_SOURCES) config.h
+ 	$(MAKE) $(AM_MAKEFLAGS) all-am
+ 
+@@ -696,6 +703,12 @@
+ dist-hook:
+ 	$(RM) -f $(distdir)/mysql_version.h $(distdir)/my_config.h
+ 
++@HAVE_DTRACE_TRUE@probes_mysql_dtrace.h: $(DTRACEPROVIDER)
++@HAVE_DTRACE_TRUE@	$(DTRACE) $(DTRACEFLAGS) -h -s $^ -o $@
++
++probes_mysql_nodtrace.h: $(DTRACEPROVIDER)
++	$(top_srcdir)/scripts/dheadgen.pl -f $^ > $@
++
+ # Don't update the files from bitkeeper
+ %::SCCS/s.%
+ # Tell versions [3.59,3.63) of GNU make to not export all variables.
+diff -Nru libmysql/Makefile.in libmysql/Makefile.in
+--- libmysql/Makefile.in	2011-05-27 11:03:55.000000000 +0200
++++ libmysql/Makefile.in	2011-05-27 10:52:01.000000000 +0200
+@@ -89,6 +89,7 @@
+ 	$(top_srcdir)/config/ac-macros/check_cpu.m4 \
+ 	$(top_srcdir)/config/ac-macros/character_sets.m4 \
+ 	$(top_srcdir)/config/ac-macros/compiler_flag.m4 \
++	$(top_srcdir)/config/ac-macros/dtrace.m4 \
+ 	$(top_srcdir)/config/ac-macros/plugins.m4 \
+ 	$(top_srcdir)/config/ac-macros/ha_ndbcluster.m4 \
+ 	$(top_srcdir)/config/ac-macros/large_file.m4 \
+@@ -187,13 +188,16 @@
+ 			-DDEFAULT_HOME_ENV=MYSQL_HOME \
+ 			-DDEFAULT_GROUP_SUFFIX_ENV=MYSQL_GROUP_SUFFIX \
+ 			-DDEFAULT_SYSCONFDIR="\"$(sysconfdir)\"" \
+-			-DSHAREDIR="\"$(MYSQLSHAREdir)\"" $(target_defs)
++			-DSHAREDIR="\"$(MYSQLSHAREdir)\"" -DDISABLE_DTRACE \
++			$(target_defs)
+ 
+ DEPDIR = @DEPDIR@
+ DIFF = @DIFF@
+ DOT_FRM_VERSION = @DOT_FRM_VERSION@
+ DOXYGEN = @DOXYGEN@
+ DSYMUTIL = @DSYMUTIL@
++DTRACE = @DTRACE@
++DTRACEFLAGS = @DTRACEFLAGS@
+ DUMPBIN = @DUMPBIN@
+ DVIS = @DVIS@
+ ECHO_C = @ECHO_C@
+@@ -206,6 +210,7 @@
+ GETCONF = @GETCONF@
+ GREP = @GREP@
+ GXX = @GXX@
++HAVE_DTRACE = @HAVE_DTRACE@
+ HOSTNAME = @HOSTNAME@
+ INNODB_DYNAMIC_CFLAGS = @INNODB_DYNAMIC_CFLAGS@
+ INSTALL = @INSTALL@
+diff -Nru libmysql/Makefile.shared libmysql/Makefile.shared
+--- libmysql/Makefile.shared	2011-05-27 11:02:47.000000000 +0200
++++ libmysql/Makefile.shared	2011-05-27 10:50:57.000000000 +0200
+@@ -89,7 +89,8 @@
+ 			-DDEFAULT_HOME_ENV=MYSQL_HOME \
+ 			-DDEFAULT_GROUP_SUFFIX_ENV=MYSQL_GROUP_SUFFIX \
+ 			-DDEFAULT_SYSCONFDIR="\"$(sysconfdir)\"" \
+-			-DSHAREDIR="\"$(MYSQLSHAREdir)\"" $(target_defs)
++			-DSHAREDIR="\"$(MYSQLSHAREdir)\"" -DDISABLE_DTRACE \
++			$(target_defs)
+ 
+ if HAVE_YASSL
+ yassl_las = $(top_builddir)/extra/yassl/src/libyassl.la \
+diff -Nru libmysql_r/Makefile.in libmysql_r/Makefile.in
+--- libmysql_r/Makefile.in	2011-05-27 11:03:55.000000000 +0200
++++ libmysql_r/Makefile.in	2011-05-27 10:52:01.000000000 +0200
+@@ -87,6 +87,7 @@
+ 	$(top_srcdir)/config/ac-macros/check_cpu.m4 \
+ 	$(top_srcdir)/config/ac-macros/character_sets.m4 \
+ 	$(top_srcdir)/config/ac-macros/compiler_flag.m4 \
++	$(top_srcdir)/config/ac-macros/dtrace.m4 \
+ 	$(top_srcdir)/config/ac-macros/plugins.m4 \
+ 	$(top_srcdir)/config/ac-macros/ha_ndbcluster.m4 \
+ 	$(top_srcdir)/config/ac-macros/large_file.m4 \
+@@ -184,13 +185,16 @@
+ 			-DDEFAULT_HOME_ENV=MYSQL_HOME \
+ 			-DDEFAULT_GROUP_SUFFIX_ENV=MYSQL_GROUP_SUFFIX \
+ 			-DDEFAULT_SYSCONFDIR="\"$(sysconfdir)\"" \
+-			-DSHAREDIR="\"$(MYSQLSHAREdir)\"" $(target_defs)
++			-DSHAREDIR="\"$(MYSQLSHAREdir)\"" -DDISABLE_DTRACE \
++			$(target_defs)
+ 
+ DEPDIR = @DEPDIR@
+ DIFF = @DIFF@
+ DOT_FRM_VERSION = @DOT_FRM_VERSION@
+ DOXYGEN = @DOXYGEN@
+ DSYMUTIL = @DSYMUTIL@
++DTRACE = @DTRACE@
++DTRACEFLAGS = @DTRACEFLAGS@
+ DUMPBIN = @DUMPBIN@
+ DVIS = @DVIS@
+ ECHO_C = @ECHO_C@
+@@ -203,6 +207,7 @@
+ GETCONF = @GETCONF@
+ GREP = @GREP@
+ GXX = @GXX@
++HAVE_DTRACE = @HAVE_DTRACE@
+ HOSTNAME = @HOSTNAME@
+ INNODB_DYNAMIC_CFLAGS = @INNODB_DYNAMIC_CFLAGS@
+ INSTALL = @INSTALL@
+diff -Nru mysys/Makefile.am mysys/Makefile.am
+--- mysys/Makefile.am	2011-05-27 11:02:47.000000000 +0200
++++ mysys/Makefile.am	2011-05-27 10:50:57.000000000 +0200
+@@ -126,5 +126,21 @@
+ 	$(LINK) $(FLAGS) -DMAIN  ./test_base64.c $(LDADD) $(LIBS)
+ 	$(RM) -f ./test_base64.c
+ 
++if HAVE_DTRACE_DASH_G
++abs_top_srcdir = @abs_top_srcdir@
++libmysys_a_LIBADD += probes_mysql.o
++libmysys_a_DEPENDENCIES += probes_mysql.o dtrace_files dtrace_providers
++CLEANFILES = probes_mysql.o dtrace_files dtrace_providers
++DTRACEFILES = mf_keycache.o
++DTRACEPROVIDER = $(abs_top_srcdir)/sql/probes_mysql.d
++
++dtrace_files:
++	echo $(DTRACEFILES) > $@
++dtrace_providers:
++	echo $(DTRACEPROVIDER) > $@
++probes_mysql.o: $(DTRACEPROVIDER) $(DTRACEFILES)
++	$(DTRACE) $(DTRACEFLAGS) -G -s $< $(DTRACEFILES) -o $@
++endif
++
+ # Don't update the files from bitkeeper
+ %::SCCS/s.%
+diff -Nru mysys/Makefile.in mysys/Makefile.in
+--- mysys/Makefile.in	2011-05-27 11:03:56.000000000 +0200
++++ mysys/Makefile.in	2011-05-27 10:52:02.000000000 +0200
+@@ -49,6 +49,8 @@
+ build_triplet = @build@
+ host_triplet = @host@
+ target_triplet = @target@
++@HAVE_DTRACE_DASH_G_TRUE@am__append_1 = probes_mysql.o
++@HAVE_DTRACE_DASH_G_TRUE@am__append_2 = probes_mysql.o dtrace_files dtrace_providers
+ subdir = mysys
+ DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
+ 	$(srcdir)/Makefile.in ChangeLog
+@@ -57,6 +59,7 @@
+ 	$(top_srcdir)/config/ac-macros/check_cpu.m4 \
+ 	$(top_srcdir)/config/ac-macros/character_sets.m4 \
+ 	$(top_srcdir)/config/ac-macros/compiler_flag.m4 \
++	$(top_srcdir)/config/ac-macros/dtrace.m4 \
+ 	$(top_srcdir)/config/ac-macros/plugins.m4 \
+ 	$(top_srcdir)/config/ac-macros/ha_ndbcluster.m4 \
+ 	$(top_srcdir)/config/ac-macros/large_file.m4 \
+@@ -201,6 +204,8 @@
+ DOT_FRM_VERSION = @DOT_FRM_VERSION@
+ DOXYGEN = @DOXYGEN@
+ DSYMUTIL = @DSYMUTIL@
++DTRACE = @DTRACE@
++DTRACEFLAGS = @DTRACEFLAGS@
+ DUMPBIN = @DUMPBIN@
+ DVIS = @DVIS@
+ ECHO_C = @ECHO_C@
+@@ -213,6 +218,7 @@
+ GETCONF = @GETCONF@
+ GREP = @GREP@
+ GXX = @GXX@
++HAVE_DTRACE = @HAVE_DTRACE@
+ HOSTNAME = @HOSTNAME@
+ INNODB_DYNAMIC_CFLAGS = @INNODB_DYNAMIC_CFLAGS@
+ INSTALL = @INSTALL@
+@@ -324,6 +330,7 @@
+ abs_builddir = @abs_builddir@
+ abs_srcdir = @abs_srcdir@
+ abs_top_builddir = @abs_top_builddir@
++@HAVE_DTRACE_DASH_G_TRUE@abs_top_srcdir = @abs_top_srcdir@
+ abs_top_srcdir = @abs_top_srcdir@
+ ac_ct_CC = @ac_ct_CC@
+ ac_ct_CXX = @ac_ct_CXX@
+@@ -504,11 +511,14 @@
+ 			CMakeLists.txt mf_soundex.c \
+ 			my_conio.c my_wincond.c my_winthread.c
+ 
+-libmysys_a_LIBADD = @THREAD_LOBJECTS@
+-libmysys_a_DEPENDENCIES = @THREAD_LOBJECTS@
++libmysys_a_LIBADD = @THREAD_LOBJECTS@ $(am__append_1)
++libmysys_a_DEPENDENCIES = @THREAD_LOBJECTS@ $(am__append_2)
+ 
+ # I hope this always does the right thing. Otherwise this is only test programs
+ FLAGS = $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) @NOINST_LDFLAGS@
++@HAVE_DTRACE_DASH_G_TRUE@CLEANFILES = probes_mysql.o dtrace_files dtrace_providers
++@HAVE_DTRACE_DASH_G_TRUE@DTRACEFILES = mf_keycache.o
++@HAVE_DTRACE_DASH_G_TRUE@DTRACEPROVIDER = $(abs_top_srcdir)/sql/probes_mysql.d
+ all: all-am
+ 
+ .SUFFIXES:
+@@ -836,6 +846,7 @@
+ mostlyclean-generic:
+ 
+ clean-generic:
++	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+ 
+ distclean-generic:
+ 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+@@ -969,6 +980,13 @@
+ 	$(LINK) $(FLAGS) -DMAIN  ./test_base64.c $(LDADD) $(LIBS)
+ 	$(RM) -f ./test_base64.c
+ 
++@HAVE_DTRACE_DASH_G_TRUE@dtrace_files:
++@HAVE_DTRACE_DASH_G_TRUE@	echo $(DTRACEFILES) > $@
++@HAVE_DTRACE_DASH_G_TRUE@dtrace_providers:
++@HAVE_DTRACE_DASH_G_TRUE@	echo $(DTRACEPROVIDER) > $@
++@HAVE_DTRACE_DASH_G_TRUE@probes_mysql.o: $(DTRACEPROVIDER) $(DTRACEFILES)
++@HAVE_DTRACE_DASH_G_TRUE@	$(DTRACE) $(DTRACEFLAGS) -G -s $< $(DTRACEFILES) -o $@
++
+ # Don't update the files from bitkeeper
+ %::SCCS/s.%
+ # Tell versions [3.59,3.63) of GNU make to not export all variables.
+diff -Nru mysys/mf_keycache.c mysys/mf_keycache.c
+--- mysys/mf_keycache.c	2011-05-27 11:02:47.000000000 +0200
++++ mysys/mf_keycache.c	2011-05-27 10:50:57.000000000 +0200
+@@ -109,6 +109,7 @@
+ #include <my_bit.h>
+ #include <errno.h>
+ #include <stdarg.h>
++#include "probes_mysql.h"
+ 
+ /*
+   Some compilation flags have been added specifically for this module
+@@ -2539,6 +2540,15 @@
+     uint status;
+     int page_st;
+ 
++    if (MYSQL_KEYCACHE_READ_START_ENABLED())
++      {
++	MYSQL_KEYCACHE_READ_START(my_filename(file), length,
++				  (ulong) (keycache->blocks_used *
++					   keycache->key_cache_block_size),
++				  (ulong) (keycache->blocks_unused *
++					   keycache->key_cache_block_size));
++      }
++
+     /*
+       When the key cache is once initialized, we use the cache_lock to
+       reliably distinguish the cases of normal operation, resizing, and
+@@ -2588,6 +2598,9 @@
+ 
+       /* Request the cache block that matches file/pos. */
+       keycache->global_cache_r_requests++;
++
++      MYSQL_KEYCACHE_READ_BLOCK(keycache->key_cache_block_size);
++
+       block=find_key_block(keycache, file, filepos, level, 0, &page_st);
+       if (!block)
+       {
+@@ -2607,6 +2620,7 @@
+       {
+         if (page_st != PAGE_READ)
+         {
++	  MYSQL_KEYCACHE_READ_MISS();
+           /* The requested page is to be read into the block buffer */
+           read_block(keycache, block,
+                      keycache->key_cache_block_size, read_length+offset,
+@@ -2631,6 +2645,10 @@
+           my_errno= -1;
+           block->status|= BLOCK_ERROR;
+         }
++	else
++	  {
++	    MYSQL_KEYCACHE_READ_HIT();
++	  }
+       }
+ 
+       /* block status may have added BLOCK_ERROR in the above 'if'. */
+@@ -2675,14 +2693,31 @@
+ #ifndef THREAD
+       /* This is only true if we where able to read everything in one block */
+       if (return_buffer)
+-	DBUG_RETURN(block->buffer);
++	{
++	  if (MYSQL_KEYCACHE_READ_DONE_ENABLED())
++	    {
++	      MYSQL_KEYCACHE_READ_DONE((ulong) (keycache->blocks_used *
++						keycache->key_cache_block_size),
++				       (ulong) (keycache->blocks_unused *
++						keycache->key_cache_block_size));
++	    }
++	  DBUG_RETURN(block->buffer);
++	}
++    }
+ #endif
+   next_block:
+       buff+= read_length;
+       filepos+= read_length+offset;
+       offset= 0;
+ 
+-    } while ((length-= read_length));
++  } while ((length-= read_length));
++  if (MYSQL_KEYCACHE_READ_DONE_ENABLED())
++  {
++    MYSQL_KEYCACHE_READ_DONE((ulong) (keycache->blocks_used *
++				      keycache->key_cache_block_size),
++			     (ulong) (keycache->blocks_unused *
++				      keycache->key_cache_block_size));
++  }
+     goto end;
+   }
+ 
+@@ -3011,6 +3046,15 @@
+     uint offset;
+     int page_st;
+ 
++    if (MYSQL_KEYCACHE_WRITE_START_ENABLED())
++      {
++	MYSQL_KEYCACHE_WRITE_START(my_filename(file), length,
++				   (ulong) (keycache->blocks_used *
++					    keycache->key_cache_block_size),
++				   (ulong) (keycache->blocks_unused *
++					    keycache->key_cache_block_size));
++      }
++
+     /*
+       When the key cache is once initialized, we use the cache_lock to
+       reliably distinguish the cases of normal operation, resizing, and
+@@ -3046,6 +3090,9 @@
+       /* Cache could be disabled in a later iteration. */
+       if (!keycache->can_be_used)
+ 	goto no_key_cache;
++
++      MYSQL_KEYCACHE_WRITE_BLOCK(keycache->key_cache_block_size);
++
+       /* Start writing at the beginning of the cache block. */
+       filepos-= offset;
+       /* Do not write beyond the end of the cache block. */
+@@ -3249,6 +3296,15 @@
+     dec_counter_for_resize_op(keycache);
+     keycache_pthread_mutex_unlock(&keycache->cache_lock);
+   }
++
++  if (MYSQL_KEYCACHE_WRITE_DONE_ENABLED())
++    {
++      MYSQL_KEYCACHE_WRITE_DONE((ulong) (keycache->blocks_used *
++					 keycache->key_cache_block_size),
++				(ulong) (keycache->blocks_unused *
++					 keycache->key_cache_block_size));
++    }
++
+ #if !defined(DBUG_OFF) && defined(EXTRA_DEBUG)
+   DBUG_EXECUTE("exec",
+                test_key_cache(keycache, "end of key_cache_write", 1););
+diff -Nru server-tools/instance-manager/Makefile.am server-tools/instance-manager/Makefile.am
+--- server-tools/instance-manager/Makefile.am	2011-05-27 11:02:47.000000000 +0200
++++ server-tools/instance-manager/Makefile.am	2011-05-27 10:50:57.000000000 +0200
+@@ -49,6 +49,7 @@
+ 	$(top_builddir)/sql/client.$(OBJEXT)
+ 
+ CLEANFILES= net_serv.cc client_settings.h
++DEFS = -DMYSQL_INSTANCE_MANAGER -DMYSQL_SERVER -DDISABLE_DTRACE
+ 
+ net_serv.cc:
+ 	rm -f net_serv.cc
+diff -Nru server-tools/instance-manager/Makefile.in server-tools/instance-manager/Makefile.in
+--- server-tools/instance-manager/Makefile.in	2011-05-27 11:03:57.000000000 +0200
++++ server-tools/instance-manager/Makefile.in	2011-05-27 10:52:04.000000000 +0200
+@@ -58,6 +58,7 @@
+ 	$(top_srcdir)/config/ac-macros/check_cpu.m4 \
+ 	$(top_srcdir)/config/ac-macros/character_sets.m4 \
+ 	$(top_srcdir)/config/ac-macros/compiler_flag.m4 \
++	$(top_srcdir)/config/ac-macros/dtrace.m4 \
+ 	$(top_srcdir)/config/ac-macros/plugins.m4 \
+ 	$(top_srcdir)/config/ac-macros/ha_ndbcluster.m4 \
+ 	$(top_srcdir)/config/ac-macros/large_file.m4 \
+@@ -182,12 +183,14 @@
+ CXXLDFLAGS = @CXXLDFLAGS@
+ CXX_VERSION = @CXX_VERSION@
+ CYGPATH_W = @CYGPATH_W@
+-DEFS = -DMYSQL_INSTANCE_MANAGER -DMYSQL_SERVER
++DEFS = -DMYSQL_INSTANCE_MANAGER -DMYSQL_SERVER -DDISABLE_DTRACE
+ DEPDIR = @DEPDIR@
+ DIFF = @DIFF@
+ DOT_FRM_VERSION = @DOT_FRM_VERSION@
+ DOXYGEN = @DOXYGEN@
+ DSYMUTIL = @DSYMUTIL@
++DTRACE = @DTRACE@
++DTRACEFLAGS = @DTRACEFLAGS@
+ DUMPBIN = @DUMPBIN@
+ DVIS = @DVIS@
+ ECHO_C = @ECHO_C@
+@@ -200,6 +203,7 @@
+ GETCONF = @GETCONF@
+ GREP = @GREP@
+ GXX = @GXX@
++HAVE_DTRACE = @HAVE_DTRACE@
+ HOSTNAME = @HOSTNAME@
+ INNODB_DYNAMIC_CFLAGS = @INNODB_DYNAMIC_CFLAGS@
+ INSTALL = @INSTALL@
+diff -Nru sql/Makefile.am sql/Makefile.am
+--- sql/Makefile.am	2011-05-27 11:02:47.000000000 +0200
++++ sql/Makefile.am	2011-05-27 10:50:57.000000000 +0200
+@@ -28,6 +28,22 @@
+ libexec_PROGRAMS =	mysqld
+ EXTRA_PROGRAMS =	gen_lex_hash
+ bin_PROGRAMS =		mysql_tzinfo_to_sql
++DTRACEFILES =           filesort.o \
++                        .libs/libndb_la-ha_ndbcluster.o \
++                        handler.o \
++                        mysqld.o \
++                        net_serv.o \
++                        scheduler.o \
++                        sp_head.o \
++                        sql_cache.o \
++                        sql_connect.o \
++                        sql_cursor.o \
++                        sql_delete.o \
++                        sql_insert.o \
++                        sql_parse.o \
++                        sql_prepare.o \
++                        sql_select.o \
++                        sql_update.o
+ 
+ noinst_LTLIBRARIES=	libndb.la \
+ 			udf_example.la
+@@ -122,7 +138,7 @@
+ 			sql_builtin.cc sql_tablespace.cc partition_info.cc \
+ 			sql_servers.cc event_parse_data.cc
+ 
+-nodist_mysqld_SOURCES =	mini_client_errors.c pack.c client.c my_time.c my_user.c 
++nodist_mysqld_SOURCES =	mini_client_errors.c pack.c client.c my_time.c my_user.c
+ 
+ libndb_la_CPPFLAGS=	@ndbcluster_includes@
+ libndb_la_SOURCES=	ha_ndbcluster.cc \
+@@ -188,5 +204,32 @@
+ 	test ! -f mysqld-debug.sym.gz   || $(INSTALL_DATA)    mysqld-debug.sym.gz   $(DESTDIR)$(pkglibdir)
+ 	test ! -f mysqld.sym.gz         || $(INSTALL_DATA)    mysqld.sym.gz         $(DESTDIR)$(pkglibdir)
+ 
++if HAVE_DTRACE_DASH_G
++libndb_la_LIBADD = probes_libndb.o
++libndb_la_DEPENDENCIES = dtrace_files dtrace_providers probes_libndb.o
++abs_top_srcdir = @abs_top_srcdir@
++mysqld_LDADD += probes_all.o
++mysqld_DEPENDENCIES += dtrace_files dtrace_providers probes_all.o
++CLEANFILES += dtrace_files dtrace_providers probes_all.o
++DTRACEPROVIDER = $(abs_top_srcdir)/sql/probes_mysql.d
++
++dtrace_files:
++	echo $(DTRACEFILES) > $@
++dtrace_providers:
++	echo $(DTRACEPROVIDER) > $@
++
++DTRACEDIRS = . ../mysys $(patsubst %,$(top_builddir)/storage/%,@mysql_se_dirs@) backup
++
++.libs/libndb_la-ha_ndbcluster.o : libndb_la-ha_ndbcluster.lo
++
++probes_all.o: probes_mysql.d $(DTRACEFILES)
++	providers=`(for i in $(DTRACEDIRS); do cat $$i/dtrace_providers 2>/dev/null; done) | tr " " "\n" | sort | uniq | sed -e '/^$$/d' -e 's/^/-s /'`; \
++	objects=`for i in $(DTRACEDIRS); do f=\`cat $$i/dtrace_files 2>/dev/null\`; for j in $$f; do test -f $$i/$$j && echo "$$i/$$j "; done; done`; \
++	$(DTRACE) $(DTRACEFLAGS) -G $$providers $$objects -o $@
++
++probes_libndb.o: probes_mysql.d .libs/libndb_la-ha_ndbcluster.o
++	$(DTRACE) $(DTRACEFLAGS) -G -s $< .libs/libndb_la-ha_ndbcluster.o -o $@
++endif
++
+ # Don't update the files from bitkeeper
+ %::SCCS/s.%
+diff -Nru sql/Makefile.in sql/Makefile.in
+--- sql/Makefile.in	2011-05-27 11:03:58.000000000 +0200
++++ sql/Makefile.in	2011-05-27 10:52:04.000000000 +0200
+@@ -55,6 +55,9 @@
+ libexec_PROGRAMS = mysqld$(EXEEXT)
+ EXTRA_PROGRAMS = gen_lex_hash$(EXEEXT)
+ bin_PROGRAMS = mysql_tzinfo_to_sql$(EXEEXT)
++@HAVE_DTRACE_DASH_G_TRUE@am__append_1 = probes_all.o
++@HAVE_DTRACE_DASH_G_TRUE@am__append_2 = dtrace_files dtrace_providers probes_all.o
++@HAVE_DTRACE_DASH_G_TRUE@am__append_3 = dtrace_files dtrace_providers probes_all.o
+ subdir = sql
+ DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
+ 	$(srcdir)/Makefile.in $(srcdir)/sql_builtin.cc.in sql_yacc.cc \
+@@ -64,6 +67,7 @@
+ 	$(top_srcdir)/config/ac-macros/check_cpu.m4 \
+ 	$(top_srcdir)/config/ac-macros/character_sets.m4 \
+ 	$(top_srcdir)/config/ac-macros/compiler_flag.m4 \
++	$(top_srcdir)/config/ac-macros/dtrace.m4 \
+ 	$(top_srcdir)/config/ac-macros/plugins.m4 \
+ 	$(top_srcdir)/config/ac-macros/ha_ndbcluster.m4 \
+ 	$(top_srcdir)/config/ac-macros/large_file.m4 \
+@@ -78,7 +82,6 @@
+ CONFIG_HEADER = $(top_builddir)/include/config.h
+ CONFIG_CLEAN_FILES = sql_builtin.cc
+ LTLIBRARIES = $(noinst_LTLIBRARIES)
+-libndb_la_LIBADD =
+ am_libndb_la_OBJECTS = libndb_la-ha_ndbcluster.lo \
+ 	libndb_la-ha_ndbcluster_binlog.lo \
+ 	libndb_la-ha_ndbcluster_cond.lo
+@@ -255,6 +258,8 @@
+ DOT_FRM_VERSION = @DOT_FRM_VERSION@
+ DOXYGEN = @DOXYGEN@
+ DSYMUTIL = @DSYMUTIL@
++DTRACE = @DTRACE@
++DTRACEFLAGS = @DTRACEFLAGS@
+ DUMPBIN = @DUMPBIN@
+ DVIS = @DVIS@
+ ECHO_C = @ECHO_C@
+@@ -267,6 +272,7 @@
+ GETCONF = @GETCONF@
+ GREP = @GREP@
+ GXX = @GXX@
++HAVE_DTRACE = @HAVE_DTRACE@
+ HOSTNAME = @HOSTNAME@
+ INNODB_DYNAMIC_CFLAGS = @INNODB_DYNAMIC_CFLAGS@
+ INSTALL = @INSTALL@
+@@ -378,6 +384,7 @@
+ abs_builddir = @abs_builddir@
+ abs_srcdir = @abs_srcdir@
+ abs_top_builddir = @abs_top_builddir@
++@HAVE_DTRACE_DASH_G_TRUE@abs_top_srcdir = @abs_top_srcdir@
+ abs_top_srcdir = @abs_top_srcdir@
+ ac_ct_CC = @ac_ct_CC@
+ ac_ct_CXX = @ac_ct_CXX@
+@@ -521,6 +528,23 @@
+ 			-I$(top_srcdir)/regex -I$(srcdir) $(openssl_includes)
+ 
+ SUBDIRS = share
++DTRACEFILES = filesort.o \
++                        .libs/libndb_la-ha_ndbcluster.o \
++                        handler.o \
++                        mysqld.o \
++                        net_serv.o \
++                        scheduler.o \
++                        sp_head.o \
++                        sql_cache.o \
++                        sql_connect.o \
++                        sql_cursor.o \
++                        sql_delete.o \
++                        sql_insert.o \
++                        sql_parse.o \
++                        sql_prepare.o \
++                        sql_select.o \
++                        sql_update.o
++
+ noinst_LTLIBRARIES = libndb.la \
+ 			udf_example.la
+ 
+@@ -530,15 +554,13 @@
+ 			$(top_builddir)/regex/libregex.a \
+ 			$(top_builddir)/strings/libmystrings.a
+ 
+-mysqld_DEPENDENCIES = @mysql_plugin_libs@ $(SUPPORTING_LIBS) libndb.la
++mysqld_DEPENDENCIES = @mysql_plugin_libs@ $(SUPPORTING_LIBS) libndb.la \
++	$(am__append_2)
+ LDADD = $(SUPPORTING_LIBS) @ZLIB_LIBS@ @NDB_SCI_LIBS@
+-mysqld_LDADD = libndb.la \
+-			@MYSQLD_EXTRA_LDFLAGS@ \
+-			@pstack_libs@ \
+-			@mysql_plugin_libs@ \
+-			$(LDADD)  $(CXXLDFLAGS) $(WRAPLIBS) @LIBDL@ \
+-			$(yassl_libs) $(openssl_libs) @MYSQLD_EXTRA_LIBS@
+-
++mysqld_LDADD = libndb.la @MYSQLD_EXTRA_LDFLAGS@ @pstack_libs@ \
++	@mysql_plugin_libs@ $(LDADD) $(CXXLDFLAGS) $(WRAPLIBS) @LIBDL@ \
++	$(yassl_libs) $(openssl_libs) @MYSQLD_EXTRA_LIBS@ \
++	$(am__append_1)
+ noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \
+ 			item_strfunc.h item_timefunc.h \
+ 			item_xmlfunc.h \
+@@ -615,7 +637,7 @@
+ 			sql_builtin.cc sql_tablespace.cc partition_info.cc \
+ 			sql_servers.cc event_parse_data.cc
+ 
+-nodist_mysqld_SOURCES = mini_client_errors.c pack.c client.c my_time.c my_user.c 
++nodist_mysqld_SOURCES = mini_client_errors.c pack.c client.c my_time.c my_user.c
+ libndb_la_CPPFLAGS = @ndbcluster_includes@
+ libndb_la_SOURCES = ha_ndbcluster.cc \
+ 			ha_ndbcluster_binlog.cc \
+@@ -632,7 +654,7 @@
+ 			message.mc  message.h message.rc MSG00001.bin \
+ 			CMakeLists.txt
+ 
+-CLEANFILES = lex_hash.h sql_yacc.output link_sources
++CLEANFILES = lex_hash.h sql_yacc.output link_sources $(am__append_3)
+ DISTCLEANFILES = $(EXTRA_PROGRAMS)
+ MAINTAINERCLEANFILES = $(BUILT_MAINT_SRC)
+ AM_YFLAGS = -d --verbose
+@@ -640,6 +662,10 @@
+ # For testing of udf_example.so
+ udf_example_la_SOURCES = udf_example.c
+ udf_example_la_LDFLAGS = -module -rpath $(pkglibdir)
++@HAVE_DTRACE_DASH_G_TRUE@libndb_la_LIBADD = probes_libndb.o
++@HAVE_DTRACE_DASH_G_TRUE@libndb_la_DEPENDENCIES = dtrace_files dtrace_providers probes_libndb.o
++@HAVE_DTRACE_DASH_G_TRUE@DTRACEPROVIDER = $(abs_top_srcdir)/sql/probes_mysql.d
++@HAVE_DTRACE_DASH_G_TRUE@DTRACEDIRS = . ../mysys $(patsubst %,$(top_builddir)/storage/%,@mysql_se_dirs@) backup
+ all: $(BUILT_SOURCES)
+ 	$(MAKE) $(AM_MAKEFLAGS) all-recursive
+ 
+@@ -1310,6 +1336,21 @@
+ 	test ! -f mysqld-debug.sym.gz   || $(INSTALL_DATA)    mysqld-debug.sym.gz   $(DESTDIR)$(pkglibdir)
+ 	test ! -f mysqld.sym.gz         || $(INSTALL_DATA)    mysqld.sym.gz         $(DESTDIR)$(pkglibdir)
+ 
++@HAVE_DTRACE_DASH_G_TRUE@dtrace_files:
++@HAVE_DTRACE_DASH_G_TRUE@	echo $(DTRACEFILES) > $@
++@HAVE_DTRACE_DASH_G_TRUE@dtrace_providers:
++@HAVE_DTRACE_DASH_G_TRUE@	echo $(DTRACEPROVIDER) > $@
++
++@[email protected]/libndb_la-ha_ndbcluster.o : libndb_la-ha_ndbcluster.lo
++
++@HAVE_DTRACE_DASH_G_TRUE@probes_all.o: probes_mysql.d $(DTRACEFILES)
++@HAVE_DTRACE_DASH_G_TRUE@	providers=`(for i in $(DTRACEDIRS); do cat $$i/dtrace_providers 2>/dev/null; done) | tr " " "\n" | sort | uniq | sed -e '/^$$/d' -e 's/^/-s /'`; \
++@HAVE_DTRACE_DASH_G_TRUE@	objects=`for i in $(DTRACEDIRS); do f=\`cat $$i/dtrace_files 2>/dev/null\`; for j in $$f; do test -f $$i/$$j && echo "$$i/$$j "; done; done`; \
++@HAVE_DTRACE_DASH_G_TRUE@	$(DTRACE) $(DTRACEFLAGS) -G $$providers $$objects -o $@
++
++@HAVE_DTRACE_DASH_G_TRUE@probes_libndb.o: probes_mysql.d .libs/libndb_la-ha_ndbcluster.o
++@HAVE_DTRACE_DASH_G_TRUE@	$(DTRACE) $(DTRACEFLAGS) -G -s $< .libs/libndb_la-ha_ndbcluster.o -o $@
++
+ # Don't update the files from bitkeeper
+ %::SCCS/s.%
+ # Tell versions [3.59,3.63) of GNU make to not export all variables.
+diff -Nru sql/filesort.cc sql/filesort.cc
+--- sql/filesort.cc	2011-05-27 11:02:46.000000000 +0200
++++ sql/filesort.cc	2011-05-27 10:50:57.000000000 +0200
+@@ -27,6 +27,7 @@
+ #endif
+ #include <m_ctype.h>
+ #include "sql_sort.h"
++#include "probes_mysql.h"
+ 
+ #ifndef THREAD
+ #define SKIP_DBUG_IN_FILESORT
+@@ -121,6 +122,7 @@
+   TABLE_LIST *tab= table->pos_in_table_list;
+   Item_subselect *subselect= tab ? tab->containing_subselect() : 0;
+ 
++  MYSQL_FILESORT_START(table->s->db.str, table->s->table_name.str);
+   /*
+    Release InnoDB's adaptive hash index latch (if holding) before
+    running a sort.
+@@ -331,7 +333,10 @@
+ #endif
+   memcpy(&table->sort, &table_sort, sizeof(FILESORT_INFO));
+   DBUG_PRINT("exit",("records: %ld", (long) records));
+-  DBUG_RETURN(error ? HA_POS_ERROR : records);
++  if (error)
++    records= HA_POS_ERROR;
++  MYSQL_FILESORT_DONE(error, records);
++  DBUG_RETURN(records);
+ } /* filesort */
+ 
+ 
+diff -Nru sql/ha_ndbcluster.cc sql/ha_ndbcluster.cc
+--- sql/ha_ndbcluster.cc	2011-05-27 11:02:46.000000000 +0200
++++ sql/ha_ndbcluster.cc	2011-05-27 10:50:57.000000000 +0200
+@@ -41,6 +41,7 @@
+ #include "ha_ndbcluster_tables.h"
+ 
+ #include <mysql/plugin.h>
++#include "probes_mysql.h"
+ 
+ #ifdef ndb_dynamite
+ #undef assert
+@@ -3601,7 +3602,9 @@
+ {
+   key_range start_key;
+   bool descending= FALSE;
++  int rc;
+   DBUG_ENTER("ha_ndbcluster::index_read");
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   DBUG_PRINT("enter", ("active_index: %u, key_len: %u, find_flag: %d", 
+                        active_index, key_len, find_flag));
+ 
+@@ -3619,43 +3622,61 @@
+   default:
+     break;
+   }
+-  DBUG_RETURN(read_range_first_to_buf(&start_key, 0, descending,
+-                                      m_sorted, buf));
++  rc= read_range_first_to_buf(&start_key, 0, descending,
++			      m_sorted, buf);
++  MYSQL_INDEX_READ_ROW_DONE(rc);
++  DBUG_RETURN(rc);
+ }
+ 
+ 
+ int ha_ndbcluster::index_next(uchar *buf)
+ {
++  int rc;
+   DBUG_ENTER("ha_ndbcluster::index_next");
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   ha_statistic_increment(&SSV::ha_read_next_count);
+-  DBUG_RETURN(next_result(buf));
++  rc= next_result(buf);
++  MYSQL_INDEX_READ_ROW_DONE(rc);
++  DBUG_RETURN(rc);
+ }
+ 
+ 
+ int ha_ndbcluster::index_prev(uchar *buf)
+ {
++  int rc;
+   DBUG_ENTER("ha_ndbcluster::index_prev");
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   ha_statistic_increment(&SSV::ha_read_prev_count);
+-  DBUG_RETURN(next_result(buf));
++  rc= next_result(buf);
++  MYSQL_INDEX_READ_ROW_DONE(rc);
++  DBUG_RETURN(rc);
+ }
+ 
+ 
+ int ha_ndbcluster::index_first(uchar *buf)
+ {
++  int rc;
+   DBUG_ENTER("ha_ndbcluster::index_first");
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   ha_statistic_increment(&SSV::ha_read_first_count);
+   // Start the ordered index scan and fetch the first row
+ 
+   // Only HA_READ_ORDER indexes get called by index_first
+-  DBUG_RETURN(ordered_index_scan(0, 0, TRUE, FALSE, buf, NULL));
++  rc= ordered_index_scan(0, 0, TRUE, FALSE, buf, NULL);
++  MYSQL_INDEX_READ_ROW_DONE(rc);
++  DBUG_RETURN(rc);
+ }
+ 
+ 
+ int ha_ndbcluster::index_last(uchar *buf)
+ {
++  int rc;
+   DBUG_ENTER("ha_ndbcluster::index_last");
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   ha_statistic_increment(&SSV::ha_read_last_count);
+-  DBUG_RETURN(ordered_index_scan(0, 0, TRUE, TRUE, buf, NULL));
++  rc= ordered_index_scan(0, 0, TRUE, TRUE, buf, NULL);
++  MYSQL_INDEX_READ_ROW_DONE(rc);
++  DBUG_RETURN(rc);
+ }
+ 
+ int ha_ndbcluster::index_read_last(uchar * buf, const uchar * key, uint key_len)
+@@ -3748,15 +3769,23 @@
+                                     bool eq_r, bool sorted)
+ {
+   uchar* buf= table->record[0];
++  int rc;
+   DBUG_ENTER("ha_ndbcluster::read_range_first");
+-  DBUG_RETURN(read_range_first_to_buf(start_key, end_key, FALSE,
+-                                      sorted, buf));
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
++  rc= read_range_first_to_buf(start_key, end_key, FALSE,
++                              sorted, buf);
++  MYSQL_INDEX_READ_ROW_DONE(rc);
++  DBUG_RETURN(rc);
+ }
+ 
+ int ha_ndbcluster::read_range_next()
+ {
++  int rc;
+   DBUG_ENTER("ha_ndbcluster::read_range_next");
+-  DBUG_RETURN(next_result(table->record[0]));
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
++  rc= next_result(table->record[0]);
++  MYSQL_INDEX_READ_ROW_DONE(rc);
++  DBUG_RETURN(rc);
+ }
+ 
+ 
+@@ -3839,12 +3868,18 @@
+ 
+ int ha_ndbcluster::rnd_next(uchar *buf)
+ {
++  int rc;
+   DBUG_ENTER("rnd_next");
++  MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str, 0);
++
+   ha_statistic_increment(&SSV::ha_read_rnd_next_count);
+ 
+   if (!m_active_cursor)
+-    DBUG_RETURN(full_table_scan(buf));
+-  DBUG_RETURN(next_result(buf));
++    rc= full_table_scan(buf);
++  else
++    rc= next_result(buf);
++  MYSQL_READ_ROW_DONE(rc);
++  DBUG_RETURN(rc);
+ }
+ 
+ 
+@@ -3857,12 +3892,14 @@
+ int ha_ndbcluster::rnd_pos(uchar *buf, uchar *pos)
+ {
+   DBUG_ENTER("rnd_pos");
++  MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str, 0);
+   ha_statistic_increment(&SSV::ha_read_rnd_count);
+   // The primary key for the record is stored in pos
+   // Perform a pk_read using primary key "index"
+   {
+     part_id_range part_spec;
+     uint key_length= ref_length;
++    int rc;
+     if (m_use_partition_function)
+     {
+       if (table_share->primary_key == MAX_KEY)
+@@ -3889,7 +3926,9 @@
+       DBUG_PRINT("info", ("partition id %u", part_spec.start_part));
+     }
+     DBUG_DUMP("key", pos, key_length);
+-    DBUG_RETURN(pk_read(pos, key_length, buf, part_spec.start_part));
++    rc= pk_read(pos, key_length, buf, part_spec.start_part);
++    MYSQL_READ_ROW_DONE(rc);
++    DBUG_RETURN(rc);
+   }
+ }
+ 
+diff -Nru sql/handler.cc sql/handler.cc
+--- sql/handler.cc	2011-05-27 11:02:46.000000000 +0200
++++ sql/handler.cc	2011-05-27 10:50:57.000000000 +0200
+@@ -27,6 +27,7 @@
+ #include "rpl_filter.h"
+ #include <myisampack.h>
+ #include <errno.h>
++#include <probes_mysql.h>
+ 
+ #ifdef WITH_PARTITION_STORAGE_ENGINE
+ #include "ha_partition.h"
+@@ -4556,6 +4557,27 @@
+   */
+   DBUG_ASSERT(next_insert_id == 0);
+ 
++  if (MYSQL_HANDLER_RDLOCK_START_ENABLED() ||
++      MYSQL_HANDLER_WRLOCK_START_ENABLED() ||
++      MYSQL_HANDLER_UNLOCK_START_ENABLED())
++    {
++      if (lock_type == F_RDLCK)
++	{
++	  MYSQL_HANDLER_RDLOCK_START(table_share->db.str,
++				     table_share->table_name.str);
++	}
++      else if (lock_type == F_WRLCK)
++	{
++	  MYSQL_HANDLER_WRLOCK_START(table_share->db.str,
++				     table_share->table_name.str);
++	}
++      else if (lock_type == F_UNLCK)
++	{
++	  MYSQL_HANDLER_UNLOCK_START(table_share->db.str,
++				     table_share->table_name.str);
++	}
++    }
++
+   /*
+     We cache the table flags if the locking succeeded. Otherwise, we
+     keep them as they were when they were fetched in ha_open().
+@@ -4563,6 +4585,25 @@
+   int error= external_lock(thd, lock_type);
+   if (error == 0)
+     cached_table_flags= table_flags();
++
++  if (MYSQL_HANDLER_RDLOCK_DONE_ENABLED() ||
++      MYSQL_HANDLER_WRLOCK_DONE_ENABLED() ||
++      MYSQL_HANDLER_UNLOCK_DONE_ENABLED())
++    {
++      if (lock_type == F_RDLCK)
++	{
++	  MYSQL_HANDLER_RDLOCK_DONE(error);
++	}
++      else if (lock_type == F_WRLCK)
++	{
++	  MYSQL_HANDLER_WRLOCK_DONE(error);
++	}
++      else if (lock_type == F_UNLCK)
++	{
++	  MYSQL_HANDLER_UNLOCK_DONE(error);
++	}
++    }
++
+   DBUG_RETURN(error);
+ }
+ 
+@@ -4595,9 +4636,13 @@
+   Log_func *log_func= Write_rows_log_event::binlog_row_logging_function;
+   DBUG_ENTER("handler::ha_write_row");
+ 
++  MYSQL_INSERT_ROW_START(table_share->db.str, table_share->table_name.str);
+   mark_trx_read_write();
+ 
+-  if (unlikely(error= write_row(buf)))
++  error= write_row(buf);
++  MYSQL_INSERT_ROW_DONE(error);
++
++  if (unlikely(error != 0))
+     DBUG_RETURN(error);
+   if (unlikely(error= binlog_log_row(table, 0, buf, log_func)))
+     DBUG_RETURN(error); /* purecov: inspected */
+@@ -4614,14 +4659,18 @@
+     Some storage engines require that the new record is in record[0]
+     (and the old record is in record[1]).
+    */
++  DBUG_ENTER("handler::ha_update_row");
+   DBUG_ASSERT(new_data == table->record[0]);
++  MYSQL_UPDATE_ROW_START(table_share->db.str, table_share->table_name.str);
+ 
+   mark_trx_read_write();
++  error= update_row(old_data, new_data);
++  MYSQL_UPDATE_ROW_DONE(error);
+ 
+-  if (unlikely(error= update_row(old_data, new_data)))
++  if (unlikely(error != 0))
+     return error;
+   if (unlikely(error= binlog_log_row(table, old_data, new_data, log_func)))
+-    return error;
++    return(error);
+   return 0;
+ }
+ 
+@@ -4630,9 +4679,12 @@
+   int error;
+   Log_func *log_func= Delete_rows_log_event::binlog_row_logging_function;
+ 
++  MYSQL_DELETE_ROW_START(table_share->db.str, table_share->table_name.str);
+   mark_trx_read_write();
++  error= delete_row(buf);
++  MYSQL_DELETE_ROW_DONE(error);
+ 
+-  if (unlikely(error= delete_row(buf)))
++  if (unlikely(error != 0))
+     return error;
+   if (unlikely(error= binlog_log_row(table, buf, 0, log_func)))
+     return error;
+@@ -4640,7 +4692,6 @@
+ }
+ 
+ 
+-
+ /** @brief
+   use_hidden_primary_key() is called in case of an update/delete when
+   (table_flags() and HA_PRIMARY_KEY_REQUIRED_FOR_DELETE) is defined
+diff -Nru sql/mysqld.cc sql/mysqld.cc
+--- sql/mysqld.cc	2011-05-27 11:02:47.000000000 +0200
++++ sql/mysqld.cc	2011-05-27 10:50:57.000000000 +0200
+@@ -31,6 +31,8 @@
+ 
+ #include "rpl_injector.h"
+ 
++#include "probes_mysql.h"
++
+ #ifdef HAVE_SYS_PRCTL_H
+ #include <sys/prctl.h>
+ #endif
+@@ -1786,6 +1788,12 @@
+   }
+   if (lock)
+     (void) pthread_mutex_unlock(&LOCK_thread_count);
++  /* Workaround for problem with DTrace probes and tail call optimization */
++  if (MYSQL_CONNECTION_DONE_ENABLED())
++    {
++      MYSQL_CONNECTION_DONE((int) errcode, thd->thread_id);
++      sleep(0);
++    }
+   DBUG_VOID_RETURN;
+ }
+ #endif /* EMBEDDED_LIBRARY */
+diff -Nru sql/net_serv.cc sql/net_serv.cc
+--- sql/net_serv.cc	2011-05-27 11:02:48.000000000 +0200
++++ sql/net_serv.cc	2011-05-27 10:50:57.000000000 +0200
+@@ -58,6 +58,7 @@
+ #define MYSQL_CLIENT
+ #endif /*EMBEDDED_LIBRARY */
+ 
++#include <probes_mysql.h>
+ 
+ /*
+   The following handles the differences when this is linked between the
+@@ -368,6 +369,10 @@
+ my_net_write(NET *net,const uchar *packet,size_t len)
+ {
+   uchar buff[NET_HEADER_SIZE];
++  my_bool rc;
++
++  MYSQL_NET_WRITE_START(len);
++
+   if (unlikely(!net->vio)) /* nowhere to write */
+     return 0;
+   /*
+@@ -382,7 +387,10 @@
+     buff[3]= (uchar) net->pkt_nr++;
+     if (net_write_buff(net, buff, NET_HEADER_SIZE) ||
+ 	net_write_buff(net, packet, z_size))
+-      return 1;
++      {
++	MYSQL_NET_WRITE_DONE(1);
++	return 1;
++      }
+     packet += z_size;
+     len-=     z_size;
+   }
+@@ -390,11 +398,16 @@
+   int3store(buff,len);
+   buff[3]= (uchar) net->pkt_nr++;
+   if (net_write_buff(net, buff, NET_HEADER_SIZE))
+-    return 1;
++    {
++      MYSQL_NET_WRITE_DONE(1);
++      return 1;
++    }
+ #ifndef DEBUG_DATA_PACKETS
+   DBUG_DUMP("packet_header", buff, NET_HEADER_SIZE);
+ #endif
+-  return test(net_write_buff(net,packet,len));
++  rc= test(net_write_buff(net,packet,len));
++  MYSQL_NET_WRITE_DONE(rc);
++  return rc;
+ }
+ 
+ /**
+@@ -432,9 +445,12 @@
+   size_t length=len+1+head_len;			/* 1 extra byte for command */
+   uchar buff[NET_HEADER_SIZE+1];
+   uint header_size=NET_HEADER_SIZE+1;
++  my_bool rc;
+   DBUG_ENTER("net_write_command");
+   DBUG_PRINT("enter",("length: %lu", (ulong) len));
+ 
++  MYSQL_NET_WRITE_START(length);
++
+   buff[4]=command;				/* For first packet */
+ 
+   if (length >= MAX_PACKET_LENGTH)
+@@ -448,7 +464,10 @@
+       if (net_write_buff(net, buff, header_size) ||
+ 	  net_write_buff(net, header, head_len) ||
+ 	  net_write_buff(net, packet, len))
+-	DBUG_RETURN(1);
++	{
++	  MYSQL_NET_WRITE_DONE(1);
++	  DBUG_RETURN(1);
++	}
+       packet+= len;
+       length-= MAX_PACKET_LENGTH;
+       len= MAX_PACKET_LENGTH;
+@@ -459,9 +478,11 @@
+   }
+   int3store(buff,length);
+   buff[3]= (uchar) net->pkt_nr++;
+-  DBUG_RETURN(test(net_write_buff(net, buff, header_size) ||
+-                   (head_len && net_write_buff(net, header, head_len)) ||
+-                   net_write_buff(net, packet, len) || net_flush(net)));
++  rc = test(net_write_buff(net, buff, header_size) ||
++	    (head_len && net_write_buff(net, header, head_len)) ||
++	    net_write_buff(net, packet, len) || net_flush(net));
++  MYSQL_NET_WRITE_DONE(rc);
++  DBUG_RETURN(rc);
+ }
+ 
+ /**
+@@ -989,6 +1010,8 @@
+ {
+   size_t len, complen;
+ 
++  MYSQL_NET_READ_START();
++
+ #ifdef HAVE_COMPRESS
+   if (!net->compress)
+   {
+@@ -1012,6 +1035,7 @@
+     net->read_pos = net->buff + net->where_b;
+     if (len != packet_error)
+       net->read_pos[len]=0;		/* Safeguard for mysql_use_result */
++    MYSQL_NET_READ_DONE(0,len);
+     return len;
+ #ifdef HAVE_COMPRESS
+   }
+@@ -1095,7 +1119,10 @@
+ 
+       net->where_b=buf_length;
+       if ((packet_len = my_real_read(net,&complen)) == packet_error)
++      {
++	MYSQL_NET_READ_DONE(1,0);
+ 	return packet_error;
++      }
+       if (my_uncompress(net->buff + net->where_b, packet_len,
+ 			&complen))
+       {
+@@ -1104,6 +1131,7 @@
+ #ifdef MYSQL_SERVER
+ 	my_error(ER_NET_UNCOMPRESS_ERROR, MYF(0));
+ #endif
++	MYSQL_NET_READ_DONE(1,0);
+ 	return packet_error;
+       }
+       buf_length+= complen;
+@@ -1118,6 +1146,7 @@
+     net->read_pos[len]=0;		/* Safeguard for mysql_use_result */
+   }
+ #endif /* HAVE_COMPRESS */
++  MYSQL_NET_READ_DONE(0,len);
+   return len;
+ }
+ 
+diff -Nru sql/sp_head.cc sql/sp_head.cc
+--- sql/sp_head.cc	2011-05-27 11:02:48.000000000 +0200
++++ sql/sp_head.cc	2011-05-27 10:50:57.000000000 +0200
+@@ -22,6 +22,7 @@
+ #include "sp_pcontext.h"
+ #include "sp_rcontext.h"
+ #include "sp_cache.h"
++#include "probes_mysql.h"
+ 
+ /*
+   Sufficient max length of printed destinations and frame offsets (all uints).
+@@ -2904,7 +2905,14 @@
+ int
+ sp_instr_stmt::exec_core(THD *thd, uint *nextp)
+ {
++  MYSQL_QUERY_EXEC_START(thd->query,
++                         thd->thread_id,
++                         (char *) (thd->db ? thd->db: ""),
++                         thd->security_ctx->priv_user,
++                         (char *) thd->security_ctx->host_or_ip,
++                         3);
+   int res= mysql_execute_command(thd);
++  MYSQL_QUERY_EXEC_DONE(res);
+   *nextp= m_ip+1;
+   return res;
+ }
+diff -Nru sql/sql_cache.cc sql/sql_cache.cc
+--- sql/sql_cache.cc	2011-05-27 11:02:49.000000000 +0200
++++ sql/sql_cache.cc	2011-05-27 10:50:57.000000000 +0200
+@@ -327,6 +327,7 @@
+ */
+ 
+ #include "mysql_priv.h"
++#include "probes_mysql.h"
+ #ifdef HAVE_QUERY_CACHE
+ #include <m_ctype.h>
+ #include <my_dir.h>
+@@ -1624,11 +1625,13 @@
+   thd->main_da.disable_status();
+ 
+   BLOCK_UNLOCK_RD(query_block);
++  MYSQL_QUERY_CACHE_HIT(thd->query, (ulong) thd->limit_found_rows);
+   DBUG_RETURN(1);				// Result sent to client
+ 
+ err_unlock:
+   unlock();
+ err:
++  MYSQL_QUERY_CACHE_MISS(thd->query);
+   DBUG_RETURN(0);				// Query was not cached
+ }
+ 
+diff -Nru sql/sql_connect.cc sql/sql_connect.cc
+--- sql/sql_connect.cc	2011-05-27 11:02:49.000000000 +0200
++++ sql/sql_connect.cc	2011-05-27 10:50:57.000000000 +0200
+@@ -38,6 +38,8 @@
+ #define MIN_HANDSHAKE_SIZE      6
+ #endif /* HAVE_OPENSSL */
+ 
++#include "probes.h"
++
+ #ifdef __WIN__
+ extern void win_install_sigabrt_handler();
+ #endif
+@@ -1119,6 +1121,9 @@
+     if (login_connection(thd))
+       goto end_thread;
+ 
++    MYSQL_CONNECTION_START(thd->thread_id, thd->security_ctx->priv_user,
++                           (char *) thd->security_ctx->host_or_ip);
++
+     prepare_new_connection_state(thd);
+ 
+     while (!net->error && net->vio != 0 &&
+diff -Nru sql/sql_cursor.cc sql/sql_cursor.cc
+--- sql/sql_cursor.cc	2011-05-27 11:02:49.000000000 +0200
++++ sql/sql_cursor.cc	2011-05-27 10:50:57.000000000 +0200
+@@ -19,6 +19,7 @@
+ #include "mysql_priv.h"
+ #include "sql_cursor.h"
+ #include "sql_select.h"
++#include "probes_mysql.h"
+ 
+ /****************************************************************************
+   Declarations.
+@@ -168,8 +169,14 @@
+     thd->lock_id= sensitive_cursor->get_lock_id();
+     thd->cursor= sensitive_cursor;
+   }
+-
++  MYSQL_QUERY_EXEC_START(thd->query,
++                         thd->thread_id,
++                         (char *) (thd->db ? thd->db : ""),
++                         thd->security_ctx->priv_user,
++                         (char *) thd->security_ctx->host_or_ip,
++                         2);
+   rc= mysql_execute_command(thd);
++  MYSQL_QUERY_EXEC_DONE(rc);
+ 
+   lex->result= save_result;
+   thd->lock_id= &thd->main_lock_id;
+diff -Nru sql/sql_delete.cc sql/sql_delete.cc
+--- sql/sql_delete.cc	2011-05-27 11:02:49.000000000 +0200
++++ sql/sql_delete.cc	2011-05-27 10:50:57.000000000 +0200
+@@ -23,6 +23,7 @@
+ #include "sql_select.h"
+ #include "sp_head.h"
+ #include "sql_trigger.h"
++#include "probes_mysql.h"
+ 
+ /**
+   Implement DELETE SQL word.
+@@ -753,7 +754,10 @@
+       if (table->triggers &&
+           table->triggers->process_triggers(thd, TRG_EVENT_DELETE,
+                                             TRG_ACTION_BEFORE, FALSE))
+-        DBUG_RETURN(1);
++	{
++	  MYSQL_MULTI_DELETE_DONE(1, 0);
++	  DBUG_RETURN(1);
++	}
+       table->status|= STATUS_DELETED;
+       if (!(error=table->file->ha_delete_row(table->record[0])))
+       {
+@@ -781,10 +785,12 @@
+       if (error)
+       {
+ 	error= 1;                               // Fatal error
++	MYSQL_MULTI_DELETE_DONE(1, 0);
+ 	DBUG_RETURN(1);
+       }
+     }
+   }
++  MYSQL_MULTI_DELETE_DONE(0, (ulong) deleted);
+   DBUG_RETURN(0);
+ }
+ 
+@@ -1028,7 +1034,9 @@
+   table_list->lock_type= TL_WRITE;
+   mysql_init_select(thd->lex);
+   thd->clear_current_stmt_binlog_row_based();
++  MYSQL_DELETE_START(thd->query);
+   error= mysql_delete(thd, table_list, NULL, NULL, HA_POS_ERROR, LL(0), TRUE);
++  MYSQL_DELETE_DONE(error, (ulong) thd->row_count_func);
+   ha_autocommit_or_rollback(thd, error);
+   end_trans(thd, error ? ROLLBACK : COMMIT);
+   thd->current_stmt_binlog_row_based= save_binlog_row_based;
+diff -Nru sql/sql_insert.cc sql/sql_insert.cc
+--- sql/sql_insert.cc	2011-05-27 11:02:49.000000000 +0200
++++ sql/sql_insert.cc	2011-05-27 10:50:57.000000000 +0200
+@@ -61,6 +61,7 @@
+ #include "sql_show.h"
+ #include "slave.h"
+ #include "rpl_mi.h"
++#include "probes_mysql.h"
+ 
+ #ifndef EMBEDDED_LIBRARY
+ static bool delayed_get_table(THD *thd, TABLE_LIST *table_list);
+@@ -598,18 +599,25 @@
+   {
+     my_error(ER_DELAYED_INSERT_TABLE_LOCKED, MYF(0),
+              table_list->table_name);
++    MYSQL_INSERT_DONE(1, 0);
+     DBUG_RETURN(TRUE);
+   }
+ 
+   if (table_list->lock_type == TL_WRITE_DELAYED)
+   {
+     if (open_and_lock_for_insert_delayed(thd, table_list))
+-      DBUG_RETURN(TRUE);
++      {
++	MYSQL_INSERT_DONE(1, 0);
++	DBUG_RETURN(TRUE);
++      }
+   }
+   else
+   {
+     if (open_and_lock_tables(thd, table_list))
+-      DBUG_RETURN(TRUE);
++      {
++	MYSQL_INSERT_DONE(1, 0);
++	DBUG_RETURN(TRUE);
++      }
+   }
+   lock_type= table_list->lock_type;
+ 
+@@ -957,6 +965,7 @@
+     ::my_ok(thd, (ulong) thd->row_count_func, id, buff);
+   }
+   thd->abort_on_warning= 0;
++  MYSQL_INSERT_DONE(1, (ulong) thd->row_count_func);
+   DBUG_RETURN(FALSE);
+ 
+ abort:
+@@ -969,6 +978,7 @@
+   if (!joins_freed)
+     free_underlaid_joins(thd, &thd->lex->select_lex);
+   thd->abort_on_warning= 0;
++  MYSQL_INSERT_DONE(1, 0);
+   DBUG_RETURN(TRUE);
+ }
+ 
+@@ -3249,6 +3259,7 @@
+   if (error)
+   {
+     table->file->print_error(error,MYF(0));
++    MYSQL_INSERT_SELECT_DONE(error, 0);
+     DBUG_RETURN(1);
+   }
+   char buff[160];
+@@ -3268,6 +3279,7 @@
+      thd->first_successful_insert_id_in_prev_stmt :
+      (info.copied ? autoinc_value_of_last_inserted_row : 0));
+   ::my_ok(thd, (ulong) thd->row_count_func, id, buff);
++  MYSQL_INSERT_DONE(0, (ulong) thd->row_count_func);
+   DBUG_RETURN(0);
+ }
+ 
+@@ -3324,6 +3336,12 @@
+     table->file->ha_release_auto_increment();
+   }
+ 
++  if (MYSQL_INSERT_SELECT_DONE_ENABLED())
++    {
++      MYSQL_INSERT_SELECT_DONE(1, (ulong) (info.copied + info.deleted +
++					   info.updated));
++    }
++
+   DBUG_VOID_RETURN;
+ }
+ 
+diff -Nru sql/sql_parse.cc sql/sql_parse.cc
+--- sql/sql_parse.cc	2011-05-27 11:02:49.000000000 +0200
++++ sql/sql_parse.cc	2011-05-27 10:50:57.000000000 +0200
+@@ -27,7 +27,7 @@
+ #include "sp_cache.h"
+ #include "events.h"
+ #include "sql_trigger.h"
+-
++#include "probes_mysql.h"
+ /**
+   @defgroup Runtime_Environment Runtime Environment
+   @{
+@@ -794,6 +794,7 @@
+   net_new_transaction(net);
+ 
+   packet_length= my_net_read(net);
++
+ #if defined(ENABLED_PROFILING) && defined(COMMUNITY_SERVER)
+   thd->profiling.start_new_query();
+ #endif
+@@ -958,6 +959,10 @@
+   DBUG_ENTER("dispatch_command");
+   DBUG_PRINT("info",("packet: '%*.s'; command: %d", packet_length, packet, command));
+ 
++  MYSQL_COMMAND_START(thd->thread_id, command,
++                      thd->security_ctx->priv_user,
++                      (char *) thd->security_ctx->host_or_ip);
++
+   thd->command=command;
+   /*
+     Commands which always take a long time are logged into
+@@ -1197,6 +1202,11 @@
+   {
+     if (alloc_query(thd, packet, packet_length))
+       break;					// fatal error is set
++    MYSQL_QUERY_START(thd->query, thd->thread_id,
++                      (char *) (thd->db ? thd->db : ""),
++                      thd->security_ctx->priv_user,
++                      (char *) thd->security_ctx->host_or_ip);
++
+     char *packet_end= thd->query + thd->query_length;
+     /* 'b' stands for 'buffer' parameter', special for 'my_snprintf' */
+     const char* end_of_stmt= NULL;
+@@ -1233,12 +1243,22 @@
+         length--;
+       }
+ 
++      if (MYSQL_QUERY_DONE_ENABLED())
++	{
++	  MYSQL_QUERY_DONE(thd->is_error());
++	}
++
+ #if defined(ENABLED_PROFILING) && defined(COMMUNITY_SERVER)
+       thd->profiling.finish_current_query();
+       thd->profiling.start_new_query("continuing");
+       thd->profiling.set_query_source(beginning_of_next_stmt, length);
+ #endif
+ 
++      MYSQL_QUERY_START(beginning_of_next_stmt, thd->thread_id,
++                        (char *) (thd->db ? thd->db : ""),
++                        thd->security_ctx->priv_user,
++                        (char *) thd->security_ctx->host_or_ip);
++
+       VOID(pthread_mutex_lock(&LOCK_thread_count));
+       thd->query_length= length;
+       thd->query= beginning_of_next_stmt;
+@@ -1598,6 +1618,16 @@
+   VOID(pthread_mutex_unlock(&LOCK_thread_count));
+   thd->packet.shrink(thd->variables.net_buffer_length);	// Reclaim some memory
+   free_root(thd->mem_root,MYF(MY_KEEP_PREALLOC));
++  if (MYSQL_QUERY_DONE_ENABLED() || MYSQL_COMMAND_DONE_ENABLED())
++    {
++      int res;
++      res= (int) thd->is_error();
++      if (command == COM_QUERY)
++	{
++	  MYSQL_QUERY_DONE(res);
++	}
++      MYSQL_COMMAND_DONE(res);
++    }
+   DBUG_RETURN(error);
+ }
+ 
+@@ -3014,6 +3044,7 @@
+       goto error;
+     DBUG_ASSERT(select_lex->offset_limit == 0);
+     unit->set_limit(select_lex);
++    MYSQL_UPDATE_START(thd->query);
+     res= (up_result= mysql_update(thd, all_tables,
+                                   select_lex->item_list,
+                                   lex->value_list,
+@@ -3082,7 +3113,7 @@
+ #ifdef HAVE_REPLICATION
+     }  /* unlikely */
+ #endif
+-
++    MYSQL_MULTI_UPDATE_START(thd->query);
+     res= mysql_multi_update(thd, all_tables,
+                             &select_lex->item_list,
+                             &lex->value_list,
+@@ -3134,7 +3165,7 @@
+       res= 1;
+       break;
+     }
+-
++    MYSQL_INSERT_START(thd->query);
+     res= mysql_insert(thd, all_tables, lex->field_list, lex->many_values,
+ 		      lex->update_list, lex->value_list,
+                       lex->duplicates, lex->ignore);
+@@ -3177,6 +3208,7 @@
+ 
+     if (!(res= open_and_lock_tables(thd, all_tables)))
+     {
++      MYSQL_INSERT_SELECT_START(thd->query);
+       /* Skip first table, which is the table we are inserting in */
+       TABLE_LIST *second_table= first_table->next_local;
+       select_lex->table_list.first= (uchar*) second_table;
+@@ -3262,11 +3294,12 @@
+       res= 1;
+       break;
+     }
+-
++    MYSQL_DELETE_START(thd->query);
+     res = mysql_delete(thd, all_tables, select_lex->where,
+                        &select_lex->order_list,
+                        unit->select_limit_cnt, select_lex->options,
+                        FALSE);
++    MYSQL_DELETE_DONE(res, (ulong) thd->row_count_func);
+     break;
+   }
+   case SQLCOM_DELETE_MULTI:
+@@ -3293,6 +3326,7 @@
+       goto error;
+ 
+     thd_proc_info(thd, "init");
++    MYSQL_MULTI_DELETE_START(thd->query);
+     if ((res= open_and_lock_tables(thd, all_tables)))
+       break;
+ 
+@@ -5008,6 +5042,7 @@
+     {
+       if (!result && !(result= new select_send()))
+         return 1;                               /* purecov: inspected */
++      MYSQL_SELECT_START(thd->query);
+       query_cache_store_query(thd, all_tables);
+       res= handle_select(thd, lex, result, 0);
+       if (result != lex->result)
+@@ -5861,6 +5896,7 @@
+ void mysql_parse(THD *thd, const char *inBuf, uint length,
+                  const char ** found_semicolon)
+ {
++  int error;
+   DBUG_ENTER("mysql_parse");
+ 
+   DBUG_EXECUTE_IF("parser_debug", turn_parser_debug_on(););
+@@ -5929,7 +5965,16 @@
+             thd->server_status|= SERVER_MORE_RESULTS_EXISTS;
+           }
+           lex->set_trg_event_type_for_tables();
+-          mysql_execute_command(thd);
++          MYSQL_QUERY_EXEC_START(thd->query,
++                                 thd->thread_id,
++                                 (char *) (thd->db ? thd->db : ""),
++                                 thd->security_ctx->priv_user,
++                                 (char *) thd->security_ctx->host_or_ip,
++                                 0);
++
++          error= mysql_execute_command(thd);
++          MYSQL_QUERY_EXEC_DONE(error);
++
+ 	}
+       }
+     }
+@@ -7784,6 +7829,8 @@
+ {
+   DBUG_ASSERT(thd->m_parser_state == NULL);
+ 
++  MYSQL_QUERY_PARSE_START(thd->query);
++
+   /* Backup creation context. */
+ 
+   Object_creation_ctx *backup_ctx= NULL;
+@@ -7815,6 +7862,8 @@
+ 
+   /* That's it. */
+ 
++  MYSQL_QUERY_PARSE_DONE(mysql_parse_status || thd->is_fatal_error);
++
+   return mysql_parse_status || thd->is_fatal_error;
+ }
+ 
+diff -Nru sql/sql_prepare.cc sql/sql_prepare.cc
+--- sql/sql_prepare.cc	2011-05-27 11:02:49.000000000 +0200
++++ sql/sql_prepare.cc	2011-05-27 10:50:57.000000000 +0200
+@@ -85,6 +85,7 @@
+ 
+ #include "mysql_priv.h"
+ #include "sql_select.h" // for JOIN
++#include "probes_mysql.h"
+ #include "sql_cursor.h"
+ #include "sp_head.h"
+ #include "sp.h"
+@@ -3567,7 +3568,14 @@
+     if (query_cache_send_result_to_client(thd, thd->query,
+                                           thd->query_length) <= 0)
+     {
++      MYSQL_QUERY_EXEC_START(thd->query,
++                             thd->thread_id,
++                             (char *) (thd->db ? thd->db : ""),
++                             thd->security_ctx->priv_user,
++                             (char *) thd->security_ctx->host_or_ip,
++                             1);
+       error= mysql_execute_command(thd);
++      MYSQL_QUERY_EXEC_DONE(error);
+     }
+   }
+ 
+diff -Nru sql/sql_select.cc sql/sql_select.cc
+--- sql/sql_select.cc	2011-05-27 11:02:49.000000000 +0200
++++ sql/sql_select.cc	2011-05-27 10:50:57.000000000 +0200
+@@ -31,6 +31,7 @@
+ #include "mysql_priv.h"
+ #include "sql_select.h"
+ #include "sql_cursor.h"
++#include "probes_mysql.h"
+ 
+ #include <m_ctype.h>
+ #include <my_bit.h>
+@@ -240,6 +241,7 @@
+   bool res;
+   register SELECT_LEX *select_lex = &lex->select_lex;
+   DBUG_ENTER("handle_select");
++  MYSQL_SELECT_START(thd->query);
+ 
+   if (select_lex->master_unit()->is_union() || 
+       select_lex->master_unit()->fake_select_lex)
+@@ -273,6 +275,8 @@
+   if (unlikely(res))
+     result->abort();
+ 
++  MYSQL_SELECT_DONE((int) res, (ulong) thd->limit_found_rows);
++
+   DBUG_RETURN(res);
+ }
+ 
+diff -Nru sql/sql_update.cc sql/sql_update.cc
+--- sql/sql_update.cc	2011-05-27 11:02:49.000000000 +0200
++++ sql/sql_update.cc	2011-05-27 10:50:57.000000000 +0200
+@@ -24,6 +24,8 @@
+ #include "sp_head.h"
+ #include "sql_trigger.h"
+ 
++#include "probes_mysql.h"
++
+ /* Return 0 if row hasn't changed */
+ 
+ bool compare_record(TABLE *table)
+@@ -209,7 +211,10 @@
+   for ( ; ; )
+   {
+     if (open_tables(thd, &table_list, &table_count, 0))
+-      DBUG_RETURN(1);
++      {
++	MYSQL_UPDATE_DONE(1, 0, 0);
++	DBUG_RETURN(1);
++      }
+ 
+     if (table_list->multitable_view)
+     {
+@@ -218,19 +223,26 @@
+       /* pass counter value */
+       thd->lex->table_count= table_count;
+       /* convert to multiupdate */
++      MYSQL_UPDATE_DONE(2, 0, 0);
+       DBUG_RETURN(2);
+     }
+     if (!lock_tables(thd, table_list, table_count, &need_reopen))
+       break;
+     if (!need_reopen)
+-      DBUG_RETURN(1);
++      {
++	MYSQL_UPDATE_DONE(1, 0, 0);
++	DBUG_RETURN(1);
++      }
+     close_tables_for_reopen(thd, &table_list);
+   }
+ 
+   if (mysql_handle_derived(thd->lex, &mysql_derived_prepare) ||
+       (thd->fill_derived_tables() &&
+        mysql_handle_derived(thd->lex, &mysql_derived_filling)))
+-    DBUG_RETURN(1);
++    {
++	MYSQL_UPDATE_DONE(1, 0, 0);
++	DBUG_RETURN(1);
++    }
+ 
+   thd_proc_info(thd, "init");
+   table= table_list->table;
+@@ -292,7 +304,10 @@
+ 
+   if (select_lex->inner_refs_list.elements &&
+     fix_inner_refs(thd, all_fields, select_lex, select_lex->ref_pointer_array))
+-    DBUG_RETURN(-1);
++    {
++	MYSQL_UPDATE_DONE(1, 0, 0);
++	DBUG_RETURN(-1);
++    }
+ 
+   if (conds)
+   {
+@@ -320,6 +335,7 @@
+   {
+     free_underlaid_joins(thd, select_lex);
+     my_ok(thd);				// No matching records
++    MYSQL_UPDATE_DONE(1, 0, 0);
+     DBUG_RETURN(0);
+   }
+ #endif
+@@ -333,10 +349,9 @@
+     delete select;
+     free_underlaid_joins(thd, select_lex);
+     if (error)
+-    {
+-      DBUG_RETURN(1);				// Error in where
+-    }
++      goto abort;
+     my_ok(thd);				// No matching records
++    MYSQL_UPDATE_DONE(1, 0, 0);
+     DBUG_RETURN(0);
+   }
+   if (!select && limit != HA_POS_ERROR)
+@@ -830,7 +845,9 @@
+   }
+   thd->count_cuted_fields= CHECK_FIELD_IGNORE;		/* calc cuted fields */
+   thd->abort_on_warning= 0;
+-  DBUG_RETURN((error >= 0 || thd->is_error()) ? 1 : 0);
++  res= (error >= 0 || thd->is_error()) ? 1 : 0;
++  MYSQL_UPDATE_DONE(res, (ulong) found, (ulong) updated);
++  DBUG_RETURN(res);
+ 
+ err:
+   delete select;
+@@ -841,6 +858,9 @@
+     table->file->extra(HA_EXTRA_NO_KEYREAD);
+   }
+   thd->abort_on_warning= 0;
++
++abort:
++  MYSQL_UPDATE_DONE(1, 0, 0);
+   DBUG_RETURN(1);
+ }
+ 
+@@ -1686,7 +1706,10 @@
+                                                *values_for_table[offset], 0,
+                                                table->triggers,
+                                                TRG_EVENT_UPDATE))
+-	DBUG_RETURN(1);
++	{
++	  MYSQL_MULTI_UPDATE_DONE(1, 0, 0);
++	  DBUG_RETURN(1);
++	}
+ 
+       found++;
+       if (!can_compare_record || compare_record(table))
+@@ -1699,7 +1722,10 @@
+           if (error == VIEW_CHECK_SKIP)
+             continue;
+           else if (error == VIEW_CHECK_ERROR)
+-            DBUG_RETURN(1);
++	    {
++	      MYSQL_MULTI_UPDATE_DONE(1, 0, 0);
++	      DBUG_RETURN(1);
++	    }
+         }
+         if (!updated++)
+         {
+@@ -1727,6 +1753,7 @@
+ 
+             prepare_record_for_error_message(error, table);
+             table->file->print_error(error,MYF(0));
++	    MYSQL_MULTI_UPDATE_DONE(1, 0, 0);
+             DBUG_RETURN(1);
+           }
+         }
+@@ -1751,7 +1778,10 @@
+       if (table->triggers &&
+           table->triggers->process_triggers(thd, TRG_EVENT_UPDATE,
+                                             TRG_ACTION_AFTER, TRUE))
+-        DBUG_RETURN(1);
++	{
++	  MYSQL_MULTI_UPDATE_DONE(1, 0, 0);
++	  DBUG_RETURN(1);
++	}
+     }
+     else
+     {
+@@ -1792,12 +1822,14 @@
+                                     tmp_table_param + offset, error, 1))
+         {
+           do_update= 0;
++	  MYSQL_MULTI_UPDATE_DONE(1, 0, 0);
+           DBUG_RETURN(1);			// Not a table_is_full error
+         }
+         found++;
+       }
+     }
+   }
++  MYSQL_MULTI_UPDATE_DONE(0, (ulong) found, (ulong) updated);
+   DBUG_RETURN(0);
+ }
+ 
+diff -Nru storage/archive/Makefile.am storage/archive/Makefile.am
+--- storage/archive/Makefile.am	2011-05-27 11:02:47.000000000 +0200
++++ storage/archive/Makefile.am	2011-05-27 10:50:57.000000000 +0200
+@@ -66,5 +66,22 @@
+ 
+ 
+ EXTRA_DIST =		CMakeLists.txt plug.in
++
++if HAVE_DTRACE_DASH_G
++abs_top_srcdir = @abs_top_srcdir@
++libarchive_a_LIBADD = probes_mysql.o
++libarchive_a_DEPENDENCIES = probes_mysql.o dtrace_files dtrace_providers
++CLEANFILES = probes_mysql.o dtrace_files dtrace_providers
++DTRACEFILES = libarchive_a-ha_archive.o
++DTRACEPROVIDER = $(abs_top_srcdir)/sql/probes_mysql.d
++
++dtrace_files:
++	echo $(DTRACEFILES) > $@
++dtrace_providers:
++	echo $(DTRACEPROVIDER) > $@
++probes_mysql.o: $(DTRACEPROVIDER) $(DTRACEFILES)
++	$(DTRACE) $(DTRACEFLAGS) -G -s $< $(DTRACEFILES) -o $@
++endif
++
+ # Don't update the files from bitkeeper
+ %::SCCS/s.%
+diff -Nru storage/archive/Makefile.in storage/archive/Makefile.in
+--- storage/archive/Makefile.in	2011-05-27 11:03:58.000000000 +0200
++++ storage/archive/Makefile.in	2011-05-27 10:52:05.000000000 +0200
+@@ -62,6 +62,7 @@
+ 	$(top_srcdir)/config/ac-macros/check_cpu.m4 \
+ 	$(top_srcdir)/config/ac-macros/character_sets.m4 \
+ 	$(top_srcdir)/config/ac-macros/compiler_flag.m4 \
++	$(top_srcdir)/config/ac-macros/dtrace.m4 \
+ 	$(top_srcdir)/config/ac-macros/plugins.m4 \
+ 	$(top_srcdir)/config/ac-macros/ha_ndbcluster.m4 \
+ 	$(top_srcdir)/config/ac-macros/large_file.m4 \
+@@ -77,7 +78,6 @@
+ CONFIG_CLEAN_FILES =
+ LIBRARIES = $(noinst_LIBRARIES)
+ libarchive_a_AR = $(AR) $(ARFLAGS)
+-libarchive_a_LIBADD =
+ am_libarchive_a_OBJECTS = libarchive_a-ha_archive.$(OBJEXT) \
+ 	libarchive_a-azio.$(OBJEXT)
+ libarchive_a_OBJECTS = $(am_libarchive_a_OBJECTS)
+@@ -189,6 +189,8 @@
+ DOT_FRM_VERSION = @DOT_FRM_VERSION@
+ DOXYGEN = @DOXYGEN@
+ DSYMUTIL = @DSYMUTIL@
++DTRACE = @DTRACE@
++DTRACEFLAGS = @DTRACEFLAGS@
+ DUMPBIN = @DUMPBIN@
+ DVIS = @DVIS@
+ ECHO_C = @ECHO_C@
+@@ -201,6 +203,7 @@
+ GETCONF = @GETCONF@
+ GREP = @GREP@
+ GXX = @GXX@
++HAVE_DTRACE = @HAVE_DTRACE@
+ HOSTNAME = @HOSTNAME@
+ INNODB_DYNAMIC_CFLAGS = @INNODB_DYNAMIC_CFLAGS@
+ INSTALL = @INSTALL@
+@@ -312,6 +315,7 @@
+ abs_builddir = @abs_builddir@
+ abs_srcdir = @abs_srcdir@
+ abs_top_builddir = @abs_top_builddir@
++@HAVE_DTRACE_DASH_G_TRUE@abs_top_srcdir = @abs_top_srcdir@
+ abs_top_srcdir = @abs_top_srcdir@
+ ac_ct_CC = @ac_ct_CC@
+ ac_ct_CXX = @ac_ct_CXX@
+@@ -485,6 +489,11 @@
+ 
+ archive_reader_LDFLAGS = @NOINST_LDFLAGS@
+ EXTRA_DIST = CMakeLists.txt plug.in
++@HAVE_DTRACE_DASH_G_TRUE@libarchive_a_LIBADD = probes_mysql.o
++@HAVE_DTRACE_DASH_G_TRUE@libarchive_a_DEPENDENCIES = probes_mysql.o dtrace_files dtrace_providers
++@HAVE_DTRACE_DASH_G_TRUE@CLEANFILES = probes_mysql.o dtrace_files dtrace_providers
++@HAVE_DTRACE_DASH_G_TRUE@DTRACEFILES = libarchive_a-ha_archive.o
++@HAVE_DTRACE_DASH_G_TRUE@DTRACEPROVIDER = $(abs_top_srcdir)/sql/probes_mysql.d
+ all: all-am
+ 
+ .SUFFIXES:
+@@ -826,6 +835,7 @@
+ mostlyclean-generic:
+ 
+ clean-generic:
++	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+ 
+ distclean-generic:
+ 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+@@ -909,6 +919,14 @@
+ 	mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \
+ 	uninstall-am uninstall-pkgpluginLTLIBRARIES
+ 
++
++@HAVE_DTRACE_DASH_G_TRUE@dtrace_files:
++@HAVE_DTRACE_DASH_G_TRUE@	echo $(DTRACEFILES) > $@
++@HAVE_DTRACE_DASH_G_TRUE@dtrace_providers:
++@HAVE_DTRACE_DASH_G_TRUE@	echo $(DTRACEPROVIDER) > $@
++@HAVE_DTRACE_DASH_G_TRUE@probes_mysql.o: $(DTRACEPROVIDER) $(DTRACEFILES)
++@HAVE_DTRACE_DASH_G_TRUE@	$(DTRACE) $(DTRACEFLAGS) -G -s $< $(DTRACEFILES) -o $@
++
+ # Don't update the files from bitkeeper
+ %::SCCS/s.%
+ # Tell versions [3.59,3.63) of GNU make to not export all variables.
+diff -Nru storage/archive/ha_archive.cc storage/archive/ha_archive.cc
+--- storage/archive/ha_archive.cc	2011-05-27 11:02:46.000000000 +0200
++++ storage/archive/ha_archive.cc	2011-05-27 10:50:57.000000000 +0200
+@@ -25,6 +25,8 @@
+ 
+ #include <mysql/plugin.h>
+ 
++#include "probes_mysql.h"
++
+ /*
+   First, if you want to understand storage engines you should look at 
+   ha_example.cc and ha_example.h. 
+@@ -917,7 +919,9 @@
+ {
+   int rc;
+   DBUG_ENTER("ha_archive::index_read");
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   rc= index_read_idx(buf, active_index, key, key_len, find_flag);
++  MYSQL_INDEX_READ_ROW_DONE(rc);
+   DBUG_RETURN(rc);
+ }
+ 
+@@ -960,8 +964,10 @@
+ int ha_archive::index_next(uchar * buf) 
+ { 
+   bool found= 0;
++  int rc;
+ 
+   DBUG_ENTER("ha_archive::index_next");
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+ 
+   while (!(get_row(&archive, buf)))
+   {
+@@ -972,7 +978,9 @@
+     }
+   }
+ 
+-  DBUG_RETURN(found ? 0 : HA_ERR_END_OF_FILE); 
++  rc= found ? 0 : HA_ERR_END_OF_FILE;
++  MYSQL_INDEX_READ_ROW_DONE(rc);
++  DBUG_RETURN(rc);
+ }
+ 
+ /*
+@@ -1198,12 +1206,19 @@
+ {
+   int rc;
+   DBUG_ENTER("ha_archive::rnd_next");
++  MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str, 0);
+ 
+   if (share->crashed)
++    {
++      MYSQL_READ_ROW_DONE(HA_ERR_CRASHED_ON_USAGE);
+       DBUG_RETURN(HA_ERR_CRASHED_ON_USAGE);
++    }
+ 
+   if (!scan_rows)
+-    DBUG_RETURN(HA_ERR_END_OF_FILE);
++    {
++      MYSQL_READ_ROW_DONE(HA_ERR_END_OF_FILE);
++      DBUG_RETURN(HA_ERR_END_OF_FILE);
++    }
+   scan_rows--;
+ 
+   ha_statistic_increment(&SSV::ha_read_rnd_next_count);
+@@ -1212,6 +1227,7 @@
+ 
+   table->status=rc ? STATUS_NOT_FOUND: 0;
+ 
++  MYSQL_READ_ROW_DONE(rc);
+   DBUG_RETURN(rc);
+ }
+ 
+@@ -1239,12 +1255,17 @@
+ 
+ int ha_archive::rnd_pos(uchar * buf, uchar *pos)
+ {
++  int rc;
+   DBUG_ENTER("ha_archive::rnd_pos");
++  MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str, 1);
+   ha_statistic_increment(&SSV::ha_read_rnd_next_count);
+   current_position= (my_off_t)my_get_ptr(pos, ref_length);
+   if (azseek(&archive, current_position, SEEK_SET) == (my_off_t)(-1L))
+     DBUG_RETURN(HA_ERR_CRASHED_ON_USAGE);
+-  DBUG_RETURN(get_row(&archive, buf));
++  else
++    rc= get_row(&archive, buf);
++  MYSQL_READ_ROW_DONE(rc);
++  DBUG_RETURN(rc);
+ }
+ 
+ /*
+diff -Nru storage/blackhole/Makefile.am storage/blackhole/Makefile.am
+--- storage/blackhole/Makefile.am	2011-05-27 11:02:47.000000000 +0200
++++ storage/blackhole/Makefile.am	2011-05-27 10:50:57.000000000 +0200
+@@ -48,5 +48,22 @@
+ 
+ 
+ EXTRA_DIST =		CMakeLists.txt plug.in
++
++if HAVE_DTRACE_DASH_G
++abs_top_srcdir = @abs_top_srcdir@
++libblackhole_a_LIBADD = probes_mysql.o
++libblackhole_a_DEPENDENCIES = probes_mysql.o dtrace_files dtrace_providers
++CLEANFILES = probes_mysql.o dtrace_files dtrace_providers
++DTRACEFILES = libblackhole_a-ha_blackhole.o
++DTRACEPROVIDER = $(abs_top_srcdir)/sql/probes_mysql.d
++
++dtrace_files:
++	echo $(DTRACEFILES) > $@
++dtrace_providers:
++	echo $(DTRACEPROVIDER) > $@
++probes_mysql.o: $(DTRACEPROVIDER) $(DTRACEFILES)
++	$(DTRACE) $(DTRACEFLAGS) -G -s $< $(DTRACEFILES) -o $@
++endif
++
+ # Don't update the files from bitkeeper
+ %::SCCS/s.%
+diff -Nru storage/blackhole/Makefile.in storage/blackhole/Makefile.in
+--- storage/blackhole/Makefile.in	2011-05-27 11:03:58.000000000 +0200
++++ storage/blackhole/Makefile.in	2011-05-27 10:52:05.000000000 +0200
+@@ -60,6 +60,7 @@
+ 	$(top_srcdir)/config/ac-macros/check_cpu.m4 \
+ 	$(top_srcdir)/config/ac-macros/character_sets.m4 \
+ 	$(top_srcdir)/config/ac-macros/compiler_flag.m4 \
++	$(top_srcdir)/config/ac-macros/dtrace.m4 \
+ 	$(top_srcdir)/config/ac-macros/plugins.m4 \
+ 	$(top_srcdir)/config/ac-macros/ha_ndbcluster.m4 \
+ 	$(top_srcdir)/config/ac-macros/large_file.m4 \
+@@ -75,7 +76,6 @@
+ CONFIG_CLEAN_FILES =
+ LIBRARIES = $(noinst_LIBRARIES)
+ libblackhole_a_AR = $(AR) $(ARFLAGS)
+-libblackhole_a_LIBADD =
+ am_libblackhole_a_OBJECTS = libblackhole_a-ha_blackhole.$(OBJEXT)
+ libblackhole_a_OBJECTS = $(am_libblackhole_a_OBJECTS)
+ am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+@@ -156,6 +156,8 @@
+ DOT_FRM_VERSION = @DOT_FRM_VERSION@
+ DOXYGEN = @DOXYGEN@
+ DSYMUTIL = @DSYMUTIL@
++DTRACE = @DTRACE@
++DTRACEFLAGS = @DTRACEFLAGS@
+ DUMPBIN = @DUMPBIN@
+ DVIS = @DVIS@
+ ECHO_C = @ECHO_C@
+@@ -168,6 +170,7 @@
+ GETCONF = @GETCONF@
+ GREP = @GREP@
+ GXX = @GXX@
++HAVE_DTRACE = @HAVE_DTRACE@
+ HOSTNAME = @HOSTNAME@
+ INNODB_DYNAMIC_CFLAGS = @INNODB_DYNAMIC_CFLAGS@
+ INSTALL = @INSTALL@
+@@ -279,6 +282,7 @@
+ abs_builddir = @abs_builddir@
+ abs_srcdir = @abs_srcdir@
+ abs_top_builddir = @abs_top_builddir@
++@HAVE_DTRACE_DASH_G_TRUE@abs_top_srcdir = @abs_top_srcdir@
+ abs_top_srcdir = @abs_top_srcdir@
+ ac_ct_CC = @ac_ct_CC@
+ ac_ct_CXX = @ac_ct_CXX@
+@@ -436,6 +440,11 @@
+ libblackhole_a_CFLAGS = $(AM_CFLAGS)
+ libblackhole_a_SOURCES = ha_blackhole.cc
+ EXTRA_DIST = CMakeLists.txt plug.in
++@HAVE_DTRACE_DASH_G_TRUE@libblackhole_a_LIBADD = probes_mysql.o
++@HAVE_DTRACE_DASH_G_TRUE@libblackhole_a_DEPENDENCIES = probes_mysql.o dtrace_files dtrace_providers
++@HAVE_DTRACE_DASH_G_TRUE@CLEANFILES = probes_mysql.o dtrace_files dtrace_providers
++@HAVE_DTRACE_DASH_G_TRUE@DTRACEFILES = libblackhole_a-ha_blackhole.o
++@HAVE_DTRACE_DASH_G_TRUE@DTRACEPROVIDER = $(abs_top_srcdir)/sql/probes_mysql.d
+ all: all-am
+ 
+ .SUFFIXES:
+@@ -660,6 +669,7 @@
+ mostlyclean-generic:
+ 
+ clean-generic:
++	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+ 
+ distclean-generic:
+ 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+@@ -743,6 +753,14 @@
+ 	pdf pdf-am ps ps-am tags uninstall uninstall-am \
+ 	uninstall-pkgpluginLTLIBRARIES
+ 
++
++@HAVE_DTRACE_DASH_G_TRUE@dtrace_files:
++@HAVE_DTRACE_DASH_G_TRUE@	echo $(DTRACEFILES) > $@
++@HAVE_DTRACE_DASH_G_TRUE@dtrace_providers:
++@HAVE_DTRACE_DASH_G_TRUE@	echo $(DTRACEPROVIDER) > $@
++@HAVE_DTRACE_DASH_G_TRUE@probes_mysql.o: $(DTRACEPROVIDER) $(DTRACEFILES)
++@HAVE_DTRACE_DASH_G_TRUE@	$(DTRACE) $(DTRACEFLAGS) -G -s $< $(DTRACEFILES) -o $@
++
+ # Don't update the files from bitkeeper
+ %::SCCS/s.%
+ # Tell versions [3.59,3.63) of GNU make to not export all variables.
+diff -Nru storage/blackhole/ha_blackhole.cc storage/blackhole/ha_blackhole.cc
+--- storage/blackhole/ha_blackhole.cc	2011-05-27 11:02:46.000000000 +0200
++++ storage/blackhole/ha_blackhole.cc	2011-05-27 10:50:57.000000000 +0200
+@@ -21,6 +21,7 @@
+ #define MYSQL_SERVER 1
+ #include "mysql_priv.h"
+ #include "ha_blackhole.h"
++#include "probes_mysql.h"
+ 
+ /* Static declarations for handlerton */
+ 
+@@ -128,18 +129,25 @@
+ 
+ int ha_blackhole::rnd_next(uchar *buf)
+ {
++  int rc;
+   DBUG_ENTER("ha_blackhole::rnd_next");
++  MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str, 0);
+   THD *thd= ha_thd();
+   if (thd->system_thread == SYSTEM_THREAD_SLAVE_SQL && thd->query == NULL)
+-    DBUG_RETURN(0);
+-  DBUG_RETURN(HA_ERR_END_OF_FILE);
++    rc= 0;
++  else
++    rc= HA_ERR_END_OF_FILE;
++  MYSQL_READ_ROW_DONE(rc);
++  DBUG_RETURN(rc);
+ }
+ 
+ 
+ int ha_blackhole::rnd_pos(uchar * buf, uchar *pos)
+ {
+   DBUG_ENTER("ha_blackhole::rnd_pos");
++  MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str, 1);
+   DBUG_ASSERT(0);
++  MYSQL_READ_ROW_DONE(0);
+   DBUG_RETURN(0);
+ }
+ 
+@@ -210,11 +218,14 @@
+                                  key_part_map keypart_map,
+                              enum ha_rkey_function find_flag)
+ {
++  int rc;
+   DBUG_ENTER("ha_blackhole::index_read");
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   THD *thd= ha_thd();
+-  if (thd->system_thread == SYSTEM_THREAD_SLAVE_SQL && thd->query == NULL)
+-    DBUG_RETURN(0);
+-  DBUG_RETURN(HA_ERR_END_OF_FILE);
++  rc= (thd->system_thread == SYSTEM_THREAD_SLAVE_SQL && thd->query == NULL) ?
++    0 : HA_ERR_END_OF_FILE;
++  MYSQL_INDEX_READ_ROW_DONE(rc);
++  DBUG_RETURN(rc);
+ }
+ 
+ 
+@@ -222,28 +233,36 @@
+                                  key_part_map keypart_map,
+                                  enum ha_rkey_function find_flag)
+ {
++  int rc;
+   DBUG_ENTER("ha_blackhole::index_read_idx");
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   THD *thd= ha_thd();
+-  if (thd->system_thread == SYSTEM_THREAD_SLAVE_SQL && thd->query == NULL)
+-    DBUG_RETURN(0);
+-  DBUG_RETURN(HA_ERR_END_OF_FILE);
++  rc= (thd->system_thread == SYSTEM_THREAD_SLAVE_SQL && thd->query == NULL) ?
++    0 : HA_ERR_END_OF_FILE;
++  MYSQL_INDEX_READ_ROW_DONE(rc);
++  DBUG_RETURN(rc);
+ }
+ 
+ 
+ int ha_blackhole::index_read_last_map(uchar * buf, const uchar * key,
+                                       key_part_map keypart_map)
+ {
++  int rc;
+   DBUG_ENTER("ha_blackhole::index_read_last");
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   THD *thd= ha_thd();
+-  if (thd->system_thread == SYSTEM_THREAD_SLAVE_SQL && thd->query == NULL)
+-    DBUG_RETURN(0);
+-  DBUG_RETURN(HA_ERR_END_OF_FILE);
++  rc= (thd->system_thread == SYSTEM_THREAD_SLAVE_SQL && thd->query == NULL) ?
++    0 : HA_ERR_END_OF_FILE;
++  MYSQL_INDEX_READ_ROW_DONE(rc);
++  DBUG_RETURN(rc);
+ }
+ 
+ 
+ int ha_blackhole::index_next(uchar * buf)
+ {
+   DBUG_ENTER("ha_blackhole::index_next");
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
++  MYSQL_INDEX_READ_ROW_DONE(HA_ERR_END_OF_FILE);
+   DBUG_RETURN(HA_ERR_END_OF_FILE);
+ }
+ 
+@@ -251,6 +270,8 @@
+ int ha_blackhole::index_prev(uchar * buf)
+ {
+   DBUG_ENTER("ha_blackhole::index_prev");
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
++  MYSQL_INDEX_READ_ROW_DONE(HA_ERR_END_OF_FILE);
+   DBUG_RETURN(HA_ERR_END_OF_FILE);
+ }
+ 
+@@ -258,6 +279,8 @@
+ int ha_blackhole::index_first(uchar * buf)
+ {
+   DBUG_ENTER("ha_blackhole::index_first");
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
++  MYSQL_INDEX_READ_ROW_DONE(HA_ERR_END_OF_FILE);
+   DBUG_RETURN(HA_ERR_END_OF_FILE);
+ }
+ 
+@@ -265,6 +288,8 @@
+ int ha_blackhole::index_last(uchar * buf)
+ {
+   DBUG_ENTER("ha_blackhole::index_last");
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
++  MYSQL_INDEX_READ_ROW_DONE(HA_ERR_END_OF_FILE);
+   DBUG_RETURN(HA_ERR_END_OF_FILE);
+ }
+ 
+diff -Nru storage/csv/Makefile.am storage/csv/Makefile.am
+--- storage/csv/Makefile.am	2011-05-27 11:02:47.000000000 +0200
++++ storage/csv/Makefile.am	2011-05-27 10:50:57.000000000 +0200
+@@ -41,5 +41,22 @@
+ libcsv_a_SOURCES =	transparent_file.cc ha_tina.cc
+ 
+ EXTRA_DIST =		CMakeLists.txt plug.in
++	
++if HAVE_DTRACE_DASH_G
++abs_top_srcdir = @abs_top_srcdir@
++libcsv_a_LIBADD = probes_mysql.o
++libcsv_a_DEPENDENCIES = probes_mysql.o dtrace_files dtrace_providers
++CLEANFILES = probes_mysql.o dtrace_files dtrace_providers
++DTRACEFILES = libcsv_a-ha_tina.o
++DTRACEPROVIDER = $(abs_top_srcdir)/sql/probes_mysql.d
++
++dtrace_files:
++	echo $(DTRACEFILES) > $@
++dtrace_providers:
++	echo $(DTRACEPROVIDER) > $@
++probes_mysql.o: $(DTRACEPROVIDER) $(DTRACEFILES)
++	$(DTRACE) $(DTRACEFLAGS) -G -s $< $(DTRACEFILES) -o $@
++endif
++
+ # Don't update the files from bitkeeper
+ %::SCCS/s.%
+diff -Nru storage/csv/Makefile.in storage/csv/Makefile.in
+--- storage/csv/Makefile.in	2011-05-27 11:03:58.000000000 +0200
++++ storage/csv/Makefile.in	2011-05-27 10:52:05.000000000 +0200
+@@ -60,6 +60,7 @@
+ 	$(top_srcdir)/config/ac-macros/check_cpu.m4 \
+ 	$(top_srcdir)/config/ac-macros/character_sets.m4 \
+ 	$(top_srcdir)/config/ac-macros/compiler_flag.m4 \
++	$(top_srcdir)/config/ac-macros/dtrace.m4 \
+ 	$(top_srcdir)/config/ac-macros/plugins.m4 \
+ 	$(top_srcdir)/config/ac-macros/ha_ndbcluster.m4 \
+ 	$(top_srcdir)/config/ac-macros/large_file.m4 \
+@@ -75,7 +76,6 @@
+ CONFIG_CLEAN_FILES =
+ LIBRARIES = $(noinst_LIBRARIES)
+ libcsv_a_AR = $(AR) $(ARFLAGS)
+-libcsv_a_LIBADD =
+ am_libcsv_a_OBJECTS = libcsv_a-transparent_file.$(OBJEXT) \
+ 	libcsv_a-ha_tina.$(OBJEXT)
+ libcsv_a_OBJECTS = $(am_libcsv_a_OBJECTS)
+@@ -157,6 +157,8 @@
+ DOT_FRM_VERSION = @DOT_FRM_VERSION@
+ DOXYGEN = @DOXYGEN@
+ DSYMUTIL = @DSYMUTIL@
++DTRACE = @DTRACE@
++DTRACEFLAGS = @DTRACEFLAGS@
+ DUMPBIN = @DUMPBIN@
+ DVIS = @DVIS@
+ ECHO_C = @ECHO_C@
+@@ -169,6 +171,7 @@
+ GETCONF = @GETCONF@
+ GREP = @GREP@
+ GXX = @GXX@
++HAVE_DTRACE = @HAVE_DTRACE@
+ HOSTNAME = @HOSTNAME@
+ INNODB_DYNAMIC_CFLAGS = @INNODB_DYNAMIC_CFLAGS@
+ INSTALL = @INSTALL@
+@@ -280,6 +283,7 @@
+ abs_builddir = @abs_builddir@
+ abs_srcdir = @abs_srcdir@
+ abs_top_builddir = @abs_top_builddir@
++@HAVE_DTRACE_DASH_G_TRUE@abs_top_srcdir = @abs_top_srcdir@
+ abs_top_srcdir = @abs_top_srcdir@
+ ac_ct_CC = @ac_ct_CC@
+ ac_ct_CXX = @ac_ct_CXX@
+@@ -435,6 +439,11 @@
+ libcsv_a_CXXFLAGS = $(AM_CFLAGS)
+ libcsv_a_SOURCES = transparent_file.cc ha_tina.cc
+ EXTRA_DIST = CMakeLists.txt plug.in
++@HAVE_DTRACE_DASH_G_TRUE@libcsv_a_LIBADD = probes_mysql.o
++@HAVE_DTRACE_DASH_G_TRUE@libcsv_a_DEPENDENCIES = probes_mysql.o dtrace_files dtrace_providers
++@HAVE_DTRACE_DASH_G_TRUE@CLEANFILES = probes_mysql.o dtrace_files dtrace_providers
++@HAVE_DTRACE_DASH_G_TRUE@DTRACEFILES = libcsv_a-ha_tina.o
++@HAVE_DTRACE_DASH_G_TRUE@DTRACEPROVIDER = $(abs_top_srcdir)/sql/probes_mysql.d
+ all: all-am
+ 
+ .SUFFIXES:
+@@ -682,6 +691,7 @@
+ mostlyclean-generic:
+ 
+ clean-generic:
++	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+ 
+ distclean-generic:
+ 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+@@ -765,6 +775,14 @@
+ 	pdf pdf-am ps ps-am tags uninstall uninstall-am \
+ 	uninstall-pkglibLTLIBRARIES
+ 
++
++@HAVE_DTRACE_DASH_G_TRUE@dtrace_files:
++@HAVE_DTRACE_DASH_G_TRUE@	echo $(DTRACEFILES) > $@
++@HAVE_DTRACE_DASH_G_TRUE@dtrace_providers:
++@HAVE_DTRACE_DASH_G_TRUE@	echo $(DTRACEPROVIDER) > $@
++@HAVE_DTRACE_DASH_G_TRUE@probes_mysql.o: $(DTRACEPROVIDER) $(DTRACEFILES)
++@HAVE_DTRACE_DASH_G_TRUE@	$(DTRACE) $(DTRACEFLAGS) -G -s $< $(DTRACEFILES) -o $@
++
+ # Don't update the files from bitkeeper
+ %::SCCS/s.%
+ # Tell versions [3.59,3.63) of GNU make to not export all variables.
+diff -Nru storage/csv/ha_tina.cc storage/csv/ha_tina.cc
+--- storage/csv/ha_tina.cc	2011-05-27 11:02:46.000000000 +0200
++++ storage/csv/ha_tina.cc	2011-05-27 10:50:57.000000000 +0200
+@@ -48,6 +48,7 @@
+ #include "mysql_priv.h"
+ #include <mysql/plugin.h>
+ #include "ha_tina.h"
++#include "probes_mysql.h"
+ 
+ 
+ /*
+@@ -1095,6 +1096,7 @@
+ {
+   int rc;
+   DBUG_ENTER("ha_tina::rnd_next");
++  MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str, 0);
+ 
+   if (share->crashed)
+       DBUG_RETURN(HA_ERR_CRASHED_ON_USAGE);
+@@ -1105,13 +1107,19 @@
+ 
+   /* don't scan an empty file */
+   if (!local_saved_data_file_length)
+-    DBUG_RETURN(HA_ERR_END_OF_FILE);
++    {
++      rc= HA_ERR_END_OF_FILE;
++      goto end;
++    }
+ 
+   if ((rc= find_current_row(buf)))
+-    DBUG_RETURN(rc);
++    goto end;
+ 
+   stats.records++;
+-  DBUG_RETURN(0);
++
++ end:
++  MYSQL_READ_ROW_DONE(rc);
++  DBUG_RETURN(rc);
+ }
+ 
+ /*
+diff -Nru storage/example/Makefile.am storage/example/Makefile.am
+--- storage/example/Makefile.am	2011-05-27 11:02:47.000000000 +0200
++++ storage/example/Makefile.am	2011-05-27 10:50:57.000000000 +0200
+@@ -48,5 +48,23 @@
+ 
+ 
+ EXTRA_DIST =		CMakeLists.txt plug.in
++
++if HAVE_DTRACE_DASH_G
++libexample_a_LIBADD = probes_mysql.o
++libexample_a_DEPENDENCIES = probes_mysql.o
++CLEANFILES =
++BUILT_SOURCES =
++DTRACEFILES = libexample_a-ha_example.o
++DTRACEPROVIDER = $(abs_top_srcdir)/sql/probes_mysql.d
++
++dtrace_files:
++	echo $(DTRACEFILES) > $@
++dtrace_providers:
++	echo $(DTRACEPROVIDER) > $@
++probes_mysql.o: $(DTRACEPROVIDER) $(DTRACEFILES)
++	$(DTRACE) $(DTRACEFLAGS) -G -s $< $(DTRACEFILES) -o $@
++endif
++
++
+ # Don't update the files from bitkeeper
+ %::SCCS/s.%
+diff -Nru storage/example/Makefile.in storage/example/Makefile.in
+--- storage/example/Makefile.in	2011-05-27 11:03:59.000000000 +0200
++++ storage/example/Makefile.in	2011-05-27 10:52:05.000000000 +0200
+@@ -60,6 +60,7 @@
+ 	$(top_srcdir)/config/ac-macros/check_cpu.m4 \
+ 	$(top_srcdir)/config/ac-macros/character_sets.m4 \
+ 	$(top_srcdir)/config/ac-macros/compiler_flag.m4 \
++	$(top_srcdir)/config/ac-macros/dtrace.m4 \
+ 	$(top_srcdir)/config/ac-macros/plugins.m4 \
+ 	$(top_srcdir)/config/ac-macros/ha_ndbcluster.m4 \
+ 	$(top_srcdir)/config/ac-macros/large_file.m4 \
+@@ -75,7 +76,6 @@
+ CONFIG_CLEAN_FILES =
+ LIBRARIES = $(noinst_LIBRARIES)
+ libexample_a_AR = $(AR) $(ARFLAGS)
+-libexample_a_LIBADD =
+ am_libexample_a_OBJECTS = libexample_a-ha_example.$(OBJEXT)
+ libexample_a_OBJECTS = $(am_libexample_a_OBJECTS)
+ am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+@@ -155,6 +155,8 @@
+ DOT_FRM_VERSION = @DOT_FRM_VERSION@
+ DOXYGEN = @DOXYGEN@
+ DSYMUTIL = @DSYMUTIL@
++DTRACE = @DTRACE@
++DTRACEFLAGS = @DTRACEFLAGS@
+ DUMPBIN = @DUMPBIN@
+ DVIS = @DVIS@
+ ECHO_C = @ECHO_C@
+@@ -167,6 +169,7 @@
+ GETCONF = @GETCONF@
+ GREP = @GREP@
+ GXX = @GXX@
++HAVE_DTRACE = @HAVE_DTRACE@
+ HOSTNAME = @HOSTNAME@
+ INNODB_DYNAMIC_CFLAGS = @INNODB_DYNAMIC_CFLAGS@
+ INSTALL = @INSTALL@
+@@ -435,7 +438,14 @@
+ libexample_a_CFLAGS = $(AM_CFLAGS)
+ libexample_a_SOURCES = ha_example.cc
+ EXTRA_DIST = CMakeLists.txt plug.in
+-all: all-am
++@HAVE_DTRACE_DASH_G_TRUE@libexample_a_LIBADD = probes_mysql.o
++@HAVE_DTRACE_DASH_G_TRUE@libexample_a_DEPENDENCIES = probes_mysql.o
++@HAVE_DTRACE_DASH_G_TRUE@CLEANFILES = 
++@HAVE_DTRACE_DASH_G_TRUE@BUILT_SOURCES = 
++@HAVE_DTRACE_DASH_G_TRUE@DTRACEFILES = libexample_a-ha_example.o
++@HAVE_DTRACE_DASH_G_TRUE@DTRACEPROVIDER = $(abs_top_srcdir)/sql/probes_mysql.d
++all: $(BUILT_SOURCES)
++	$(MAKE) $(AM_MAKEFLAGS) all-am
+ 
+ .SUFFIXES:
+ .SUFFIXES: .cc .lo .o .obj
+@@ -636,13 +646,15 @@
+ 	  fi; \
+ 	done
+ check-am: all-am
+-check: check-am
++check: $(BUILT_SOURCES)
++	$(MAKE) $(AM_MAKEFLAGS) check-am
+ all-am: Makefile $(LIBRARIES) $(LTLIBRARIES) $(HEADERS)
+ installdirs:
+ 	for dir in "$(DESTDIR)$(pkgplugindir)"; do \
+ 	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ 	done
+-install: install-am
++install: $(BUILT_SOURCES)
++	$(MAKE) $(AM_MAKEFLAGS) install-am
+ install-exec: install-exec-am
+ install-data: install-data-am
+ uninstall: uninstall-am
+@@ -659,6 +671,7 @@
+ mostlyclean-generic:
+ 
+ clean-generic:
++	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+ 
+ distclean-generic:
+ 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+@@ -666,6 +679,7 @@
+ maintainer-clean-generic:
+ 	@echo "This command is intended for maintainers to use"
+ 	@echo "it deletes files that may require special tools to rebuild."
++	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+ clean: clean-am
+ 
+ clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \
+@@ -742,6 +756,14 @@
+ 	pdf pdf-am ps ps-am tags uninstall uninstall-am \
+ 	uninstall-pkgpluginLTLIBRARIES
+ 
++
++@HAVE_DTRACE_DASH_G_TRUE@dtrace_files:
++@HAVE_DTRACE_DASH_G_TRUE@	echo $(DTRACEFILES) > $@
++@HAVE_DTRACE_DASH_G_TRUE@dtrace_providers:
++@HAVE_DTRACE_DASH_G_TRUE@	echo $(DTRACEPROVIDER) > $@
++@HAVE_DTRACE_DASH_G_TRUE@probes_mysql.o: $(DTRACEPROVIDER) $(DTRACEFILES)
++@HAVE_DTRACE_DASH_G_TRUE@	$(DTRACE) $(DTRACEFLAGS) -G -s $< $(DTRACEFILES) -o $@
++
+ # Don't update the files from bitkeeper
+ %::SCCS/s.%
+ # Tell versions [3.59,3.63) of GNU make to not export all variables.
+diff -Nru storage/example/ha_example.cc storage/example/ha_example.cc
+--- storage/example/ha_example.cc	2011-05-27 11:02:46.000000000 +0200
++++ storage/example/ha_example.cc	2011-05-27 10:50:57.000000000 +0200
+@@ -95,6 +95,7 @@
+ #include "mysql_priv.h"
+ #include "ha_example.h"
+ #include <mysql/plugin.h>
++#include "probes_mysql.h"
+ 
+ static handler *example_create_handler(handlerton *hton,
+                                        TABLE_SHARE *table, 
+@@ -429,6 +430,8 @@
+                                __attribute__((unused)))
+ {
+   DBUG_ENTER("ha_example::index_read");
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
++  MYSQL_INDEX_READ_ROW_DONE(HA_ERR_WRONG_COMMAND);
+   DBUG_RETURN(HA_ERR_WRONG_COMMAND);
+ }
+ 
+@@ -441,6 +444,8 @@
+ int ha_example::index_next(uchar *buf)
+ {
+   DBUG_ENTER("ha_example::index_next");
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
++  MYSQL_INDEX_READ_ROW_DONE(HA_ERR_WRONG_COMMAND);
+   DBUG_RETURN(HA_ERR_WRONG_COMMAND);
+ }
+ 
+@@ -453,6 +458,8 @@
+ int ha_example::index_prev(uchar *buf)
+ {
+   DBUG_ENTER("ha_example::index_prev");
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
++  MYSQL_INDEX_READ_ROW_DONE(HA_ERR_WRONG_COMMAND);
+   DBUG_RETURN(HA_ERR_WRONG_COMMAND);
+ }
+ 
+@@ -470,6 +477,8 @@
+ int ha_example::index_first(uchar *buf)
+ {
+   DBUG_ENTER("ha_example::index_first");
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
++  MYSQL_INDEX_READ_ROW_DONE(HA_ERR_WRONG_COMMAND);
+   DBUG_RETURN(HA_ERR_WRONG_COMMAND);
+ }
+ 
+@@ -487,6 +496,8 @@
+ int ha_example::index_last(uchar *buf)
+ {
+   DBUG_ENTER("ha_example::index_last");
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
++  MYSQL_INDEX_READ_ROW_DONE(HA_ERR_WRONG_COMMAND);
+   DBUG_RETURN(HA_ERR_WRONG_COMMAND);
+ }
+ 
+@@ -534,6 +545,8 @@
+ int ha_example::rnd_next(uchar *buf)
+ {
+   DBUG_ENTER("ha_example::rnd_next");
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
++  MYSQL_INDEX_READ_ROW_DONE(HA_ERR_WRONG_COMMAND);
+   DBUG_RETURN(HA_ERR_END_OF_FILE);
+ }
+ 
+@@ -582,6 +595,8 @@
+ int ha_example::rnd_pos(uchar *buf, uchar *pos)
+ {
+   DBUG_ENTER("ha_example::rnd_pos");
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
++  MYSQL_INDEX_READ_ROW_DONE(HA_ERR_WRONG_COMMAND);
+   DBUG_RETURN(HA_ERR_WRONG_COMMAND);
+ }
+ 
+diff -Nru storage/federated/Makefile.am storage/federated/Makefile.am
+--- storage/federated/Makefile.am	2011-05-27 11:02:47.000000000 +0200
++++ storage/federated/Makefile.am	2011-05-27 10:50:57.000000000 +0200
+@@ -48,5 +48,22 @@
+ 
+ 
+ EXTRA_DIST =		CMakeLists.txt plug.in
++
++if HAVE_DTRACE_DASH_G
++abs_top_srcdir = @abs_top_srcdir@
++libfederated_a_LIBADD = probes_mysql.o
++libfederated_a_DEPENDENCIES = probes_mysql.o dtrace_files dtrace_providers
++CLEANFILES = probes_mysql.o dtrace_files dtrace_providers
++DTRACEFILES = libfederated_a-ha_federated.o
++DTRACEPROVIDER = $(abs_top_srcdir)/sql/probes_mysql.d
++
++dtrace_files:
++	echo $(DTRACEFILES) > $@
++dtrace_providers:
++	echo $(DTRACEPROVIDER) > $@
++probes_mysql.o: $(DTRACEPROVIDER) $(DTRACEFILES)
++	$(DTRACE) $(DTRACEFLAGS) -G -s $< $(DTRACEFILES) -o $@
++endif
++
+ # Don't update the files from bitkeeper
+ %::SCCS/s.%
+diff -Nru storage/federated/Makefile.in storage/federated/Makefile.in
+--- storage/federated/Makefile.in	2011-05-27 11:03:59.000000000 +0200
++++ storage/federated/Makefile.in	2011-05-27 10:52:05.000000000 +0200
+@@ -60,6 +60,7 @@
+ 	$(top_srcdir)/config/ac-macros/check_cpu.m4 \
+ 	$(top_srcdir)/config/ac-macros/character_sets.m4 \
+ 	$(top_srcdir)/config/ac-macros/compiler_flag.m4 \
++	$(top_srcdir)/config/ac-macros/dtrace.m4 \
+ 	$(top_srcdir)/config/ac-macros/plugins.m4 \
+ 	$(top_srcdir)/config/ac-macros/ha_ndbcluster.m4 \
+ 	$(top_srcdir)/config/ac-macros/large_file.m4 \
+@@ -75,7 +76,6 @@
+ CONFIG_CLEAN_FILES =
+ LIBRARIES = $(noinst_LIBRARIES)
+ libfederated_a_AR = $(AR) $(ARFLAGS)
+-libfederated_a_LIBADD =
+ am_libfederated_a_OBJECTS = libfederated_a-ha_federated.$(OBJEXT)
+ libfederated_a_OBJECTS = $(am_libfederated_a_OBJECTS)
+ am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+@@ -156,6 +156,8 @@
+ DOT_FRM_VERSION = @DOT_FRM_VERSION@
+ DOXYGEN = @DOXYGEN@
+ DSYMUTIL = @DSYMUTIL@
++DTRACE = @DTRACE@
++DTRACEFLAGS = @DTRACEFLAGS@
+ DUMPBIN = @DUMPBIN@
+ DVIS = @DVIS@
+ ECHO_C = @ECHO_C@
+@@ -168,6 +170,7 @@
+ GETCONF = @GETCONF@
+ GREP = @GREP@
+ GXX = @GXX@
++HAVE_DTRACE = @HAVE_DTRACE@
+ HOSTNAME = @HOSTNAME@
+ INNODB_DYNAMIC_CFLAGS = @INNODB_DYNAMIC_CFLAGS@
+ INSTALL = @INSTALL@
+@@ -279,6 +282,7 @@
+ abs_builddir = @abs_builddir@
+ abs_srcdir = @abs_srcdir@
+ abs_top_builddir = @abs_top_builddir@
++@HAVE_DTRACE_DASH_G_TRUE@abs_top_srcdir = @abs_top_srcdir@
+ abs_top_srcdir = @abs_top_srcdir@
+ ac_ct_CC = @ac_ct_CC@
+ ac_ct_CXX = @ac_ct_CXX@
+@@ -436,6 +440,11 @@
+ libfederated_a_CFLAGS = $(AM_CFLAGS)
+ libfederated_a_SOURCES = ha_federated.cc
+ EXTRA_DIST = CMakeLists.txt plug.in
++@HAVE_DTRACE_DASH_G_TRUE@libfederated_a_LIBADD = probes_mysql.o
++@HAVE_DTRACE_DASH_G_TRUE@libfederated_a_DEPENDENCIES = probes_mysql.o dtrace_files dtrace_providers
++@HAVE_DTRACE_DASH_G_TRUE@CLEANFILES = probes_mysql.o dtrace_files dtrace_providers
++@HAVE_DTRACE_DASH_G_TRUE@DTRACEFILES = libfederated_a-ha_federated.o
++@HAVE_DTRACE_DASH_G_TRUE@DTRACEPROVIDER = $(abs_top_srcdir)/sql/probes_mysql.d
+ all: all-am
+ 
+ .SUFFIXES:
+@@ -660,6 +669,7 @@
+ mostlyclean-generic:
+ 
+ clean-generic:
++	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+ 
+ distclean-generic:
+ 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+@@ -743,6 +753,14 @@
+ 	pdf pdf-am ps ps-am tags uninstall uninstall-am \
+ 	uninstall-pkgpluginLTLIBRARIES
+ 
++
++@HAVE_DTRACE_DASH_G_TRUE@dtrace_files:
++@HAVE_DTRACE_DASH_G_TRUE@	echo $(DTRACEFILES) > $@
++@HAVE_DTRACE_DASH_G_TRUE@dtrace_providers:
++@HAVE_DTRACE_DASH_G_TRUE@	echo $(DTRACEPROVIDER) > $@
++@HAVE_DTRACE_DASH_G_TRUE@probes_mysql.o: $(DTRACEPROVIDER) $(DTRACEFILES)
++@HAVE_DTRACE_DASH_G_TRUE@	$(DTRACE) $(DTRACEFLAGS) -G -s $< $(DTRACEFILES) -o $@
++
+ # Don't update the files from bitkeeper
+ %::SCCS/s.%
+ # Tell versions [3.59,3.63) of GNU make to not export all variables.
+diff -Nru storage/federated/ha_federated.cc storage/federated/ha_federated.cc
+--- storage/federated/ha_federated.cc	2011-05-27 11:02:46.000000000 +0200
++++ storage/federated/ha_federated.cc	2011-05-27 10:50:57.000000000 +0200
+@@ -385,6 +385,8 @@
+ 
+ #include <mysql/plugin.h>
+ 
++#include "probes_mysql.h"
++
+ /* Variables for federated share methods */
+ static HASH federated_open_tables;              // To track open tables
+ pthread_mutex_t federated_mutex;                // To init the hash
+@@ -2324,13 +2326,17 @@
+ int ha_federated::index_read(uchar *buf, const uchar *key,
+                              uint key_len, ha_rkey_function find_flag)
+ {
++  int rc;
+   DBUG_ENTER("ha_federated::index_read");
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+ 
+   if (stored_result)
+     mysql_free_result(stored_result);
+-  DBUG_RETURN(index_read_idx_with_result_set(buf, active_index, key,
+-                                             key_len, find_flag,
+-                                             &stored_result));
++  rc= index_read_idx_with_result_set(buf, active_index, key,
++				     key_len, find_flag,
++				     &stored_result);
++  MYSQL_INDEX_READ_ROW_DONE(rc);
++  DBUG_RETURN(rc);
+ }
+ 
+ 
+@@ -2353,12 +2359,17 @@
+   int retval;
+   MYSQL_RES *mysql_result;
+   DBUG_ENTER("ha_federated::index_read_idx");
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+ 
+   if ((retval= index_read_idx_with_result_set(buf, index, key,
+                                               key_len, find_flag,
+                                               &mysql_result)))
+-    DBUG_RETURN(retval);
++    {
++      MYSQL_INDEX_READ_ROW_DONE(retval);
++      DBUG_RETURN(retval);
++    }
+   mysql_free_result(mysql_result);
++  MYSQL_INDEX_READ_ROW_DONE(0);
+   DBUG_RETURN(retval);
+ }
+ 
+@@ -2478,6 +2489,7 @@
+                    sizeof(sql_query_buffer),
+                    &my_charset_bin);
+   DBUG_ENTER("ha_federated::read_range_first");
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+ 
+   DBUG_ASSERT(!(start_key == NULL && end_key == NULL));
+ 
+@@ -2506,10 +2518,12 @@
+   }
+ 
+   retval= read_next(table->record[0], stored_result);
++  MYSQL_INDEX_READ_ROW_DONE(retval);
+   DBUG_RETURN(retval);
+ 
+ error:
+   table->status= STATUS_NOT_FOUND;
++  MYSQL_INDEX_READ_ROW_DONE(retval);
+   DBUG_RETURN(retval);
+ }
+ 
+@@ -2518,7 +2532,9 @@
+ {
+   int retval;
+   DBUG_ENTER("ha_federated::read_range_next");
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   retval= rnd_next(table->record[0]);
++  MYSQL_INDEX_READ_ROW_DONE(retval);
+   DBUG_RETURN(retval);
+ }
+ 
+@@ -2637,7 +2653,9 @@
+ 
+ int ha_federated::rnd_next(uchar *buf)
+ {
++  int rc;
+   DBUG_ENTER("ha_federated::rnd_next");
++  MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str, 0);
+ 
+   if (stored_result == 0)
+   {
+@@ -2646,9 +2664,12 @@
+       so we can get here _even_ if there is _no_ pre-fetched result-set!
+       TODO: fix it. We can delete this in 5.1 when rnd_init() is checked.
+     */
++    MYSQL_READ_ROW_DONE(1);
+     DBUG_RETURN(1);
+   }
+-  DBUG_RETURN(read_next(buf, stored_result));
++  rc= read_next(buf, stored_result);
++  MYSQL_READ_ROW_DONE(rc);
++  DBUG_RETURN(rc);
+ }
+ 
+ 
+@@ -2726,6 +2747,8 @@
+ {
+   int result;
+   DBUG_ENTER("ha_federated::rnd_pos");
++  MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str, 1);
++
+   ha_statistic_increment(&SSV::ha_read_rnd_count);
+   if (table->s->primary_key != MAX_KEY)
+   {
+@@ -2740,6 +2763,7 @@
+     result= 0;
+   }
+   table->status= result ? STATUS_NOT_FOUND : 0;
++  MYSQL_READ_ROW_DONE(result);
+   DBUG_RETURN(result);
+ }
+ 
+diff -Nru storage/heap/Makefile.am storage/heap/Makefile.am
+--- storage/heap/Makefile.am	2011-05-27 11:02:47.000000000 +0200
++++ storage/heap/Makefile.am	2011-05-27 10:50:57.000000000 +0200
+@@ -51,5 +51,21 @@
+ 
+ EXTRA_DIST =		CMakeLists.txt plug.in
+ 
++if HAVE_DTRACE_DASH_G
++abs_top_srcdir = @abs_top_srcdir@
++libheap_a_LIBADD = probes_mysql.o
++libheap_a_DEPENDENCIES = probes_mysql.o dtrace_files dtrace_providers
++CLEANFILES = probes_mysql.o dtrace_files dtrace_providers
++DTRACEFILES = ha_heap.o
++DTRACEPROVIDER = $(abs_top_srcdir)/sql/probes_mysql.d
++
++dtrace_files:
++	echo $(DTRACEFILES) > $@
++dtrace_providers:
++	echo $(DTRACEPROVIDER) > $@
++probes_mysql.o: $(DTRACEPROVIDER) $(DTRACEFILES)
++	$(DTRACE) $(DTRACEFLAGS) -G -s $< $(DTRACEFILES) -o $@
++endif
++
+ # Don't update the files from bitkeeper
+ %::SCCS/s.%
+diff -Nru storage/heap/Makefile.in storage/heap/Makefile.in
+--- storage/heap/Makefile.in	2011-05-27 11:03:59.000000000 +0200
++++ storage/heap/Makefile.in	2011-05-27 10:52:06.000000000 +0200
+@@ -59,6 +59,7 @@
+ 	$(top_srcdir)/config/ac-macros/check_cpu.m4 \
+ 	$(top_srcdir)/config/ac-macros/character_sets.m4 \
+ 	$(top_srcdir)/config/ac-macros/compiler_flag.m4 \
++	$(top_srcdir)/config/ac-macros/dtrace.m4 \
+ 	$(top_srcdir)/config/ac-macros/plugins.m4 \
+ 	$(top_srcdir)/config/ac-macros/ha_ndbcluster.m4 \
+ 	$(top_srcdir)/config/ac-macros/large_file.m4 \
+@@ -82,7 +83,6 @@
+ pkglibLIBRARIES_INSTALL = $(INSTALL_DATA)
+ LIBRARIES = $(noinst_LIBRARIES) $(pkglib_LIBRARIES)
+ libheap_a_AR = $(AR) $(ARFLAGS)
+-libheap_a_LIBADD =
+ am_libheap_a_OBJECTS = hp_open.$(OBJEXT) hp_extra.$(OBJEXT) \
+ 	hp_close.$(OBJEXT) hp_panic.$(OBJEXT) hp_info.$(OBJEXT) \
+ 	hp_rrnd.$(OBJEXT) hp_scan.$(OBJEXT) hp_update.$(OBJEXT) \
+@@ -181,6 +181,8 @@
+ DOT_FRM_VERSION = @DOT_FRM_VERSION@
+ DOXYGEN = @DOXYGEN@
+ DSYMUTIL = @DSYMUTIL@
++DTRACE = @DTRACE@
++DTRACEFLAGS = @DTRACEFLAGS@
+ DUMPBIN = @DUMPBIN@
+ DVIS = @DVIS@
+ ECHO_C = @ECHO_C@
+@@ -193,6 +195,7 @@
+ GETCONF = @GETCONF@
+ GREP = @GREP@
+ GXX = @GXX@
++HAVE_DTRACE = @HAVE_DTRACE@
+ HOSTNAME = @HOSTNAME@
+ INNODB_DYNAMIC_CFLAGS = @INNODB_DYNAMIC_CFLAGS@
+ INSTALL = @INSTALL@
+@@ -304,6 +307,7 @@
+ abs_builddir = @abs_builddir@
+ abs_srcdir = @abs_srcdir@
+ abs_top_builddir = @abs_top_builddir@
++@HAVE_DTRACE_DASH_G_TRUE@abs_top_srcdir = @abs_top_srcdir@
+ abs_top_srcdir = @abs_top_srcdir@
+ ac_ct_CC = @ac_ct_CC@
+ ac_ct_CXX = @ac_ct_CXX@
+@@ -471,6 +475,11 @@
+ 			hp_hash.c _check.c _rectest.c hp_static.c
+ 
+ EXTRA_DIST = CMakeLists.txt plug.in
++@HAVE_DTRACE_DASH_G_TRUE@libheap_a_LIBADD = probes_mysql.o
++@HAVE_DTRACE_DASH_G_TRUE@libheap_a_DEPENDENCIES = probes_mysql.o dtrace_files dtrace_providers
++@HAVE_DTRACE_DASH_G_TRUE@CLEANFILES = probes_mysql.o dtrace_files dtrace_providers
++@HAVE_DTRACE_DASH_G_TRUE@DTRACEFILES = ha_heap.o
++@HAVE_DTRACE_DASH_G_TRUE@DTRACEPROVIDER = $(abs_top_srcdir)/sql/probes_mysql.d
+ all: all-am
+ 
+ .SUFFIXES:
+@@ -733,6 +742,7 @@
+ mostlyclean-generic:
+ 
+ clean-generic:
++	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+ 
+ distclean-generic:
+ 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+@@ -817,6 +827,13 @@
+ 	uninstall-am uninstall-pkglibLIBRARIES
+ 
+ 
++@HAVE_DTRACE_DASH_G_TRUE@dtrace_files:
++@HAVE_DTRACE_DASH_G_TRUE@	echo $(DTRACEFILES) > $@
++@HAVE_DTRACE_DASH_G_TRUE@dtrace_providers:
++@HAVE_DTRACE_DASH_G_TRUE@	echo $(DTRACEPROVIDER) > $@
++@HAVE_DTRACE_DASH_G_TRUE@probes_mysql.o: $(DTRACEPROVIDER) $(DTRACEFILES)
++@HAVE_DTRACE_DASH_G_TRUE@	$(DTRACE) $(DTRACEFLAGS) -G -s $< $(DTRACEFILES) -o $@
++
+ # Don't update the files from bitkeeper
+ %::SCCS/s.%
+ # Tell versions [3.59,3.63) of GNU make to not export all variables.
+diff -Nru storage/heap/ha_heap.cc storage/heap/ha_heap.cc
+--- storage/heap/ha_heap.cc	2011-05-27 11:02:46.000000000 +0200
++++ storage/heap/ha_heap.cc	2011-05-27 10:50:57.000000000 +0200
+@@ -23,6 +23,7 @@
+ #include <mysql/plugin.h>
+ #include "ha_heap.h"
+ #include "heapdef.h"
++#include "probes_mysql.h"
+ 
+ static handler *heap_create_handler(handlerton *hton,
+                                     TABLE_SHARE *table, 
+@@ -274,21 +275,25 @@
+                             key_part_map keypart_map,
+                             enum ha_rkey_function find_flag)
+ {
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   DBUG_ASSERT(inited==INDEX);
+   ha_statistic_increment(&SSV::ha_read_key_count);
+   int error = heap_rkey(file,buf,active_index, key, keypart_map, find_flag);
+   table->status = error ? STATUS_NOT_FOUND : 0;
++  MYSQL_INDEX_READ_ROW_DONE(error);
+   return error;
+ }
+ 
+ int ha_heap::index_read_last_map(uchar *buf, const uchar *key,
+                                  key_part_map keypart_map)
+ {
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   DBUG_ASSERT(inited==INDEX);
+   ha_statistic_increment(&SSV::ha_read_key_count);
+   int error= heap_rkey(file, buf, active_index, key, keypart_map,
+ 		       HA_READ_PREFIX_LAST);
+   table->status= error ? STATUS_NOT_FOUND : 0;
++  MYSQL_INDEX_READ_ROW_DONE(error);
+   return error;
+ }
+ 
+@@ -296,45 +301,55 @@
+                                 key_part_map keypart_map,
+                                 enum ha_rkey_function find_flag)
+ {
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   ha_statistic_increment(&SSV::ha_read_key_count);
+   int error = heap_rkey(file, buf, index, key, keypart_map, find_flag);
+   table->status = error ? STATUS_NOT_FOUND : 0;
++  MYSQL_INDEX_READ_ROW_DONE(error);
+   return error;
+ }
+ 
+ int ha_heap::index_next(uchar * buf)
+ {
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   DBUG_ASSERT(inited==INDEX);
+   ha_statistic_increment(&SSV::ha_read_next_count);
+   int error=heap_rnext(file,buf);
+   table->status=error ? STATUS_NOT_FOUND: 0;
++  MYSQL_INDEX_READ_ROW_DONE(error);
+   return error;
+ }
+ 
+ int ha_heap::index_prev(uchar * buf)
+ {
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   DBUG_ASSERT(inited==INDEX);
+   ha_statistic_increment(&SSV::ha_read_prev_count);
+   int error=heap_rprev(file,buf);
+   table->status=error ? STATUS_NOT_FOUND: 0;
++  MYSQL_INDEX_READ_ROW_DONE(error);
+   return error;
+ }
+ 
+ int ha_heap::index_first(uchar * buf)
+ {
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   DBUG_ASSERT(inited==INDEX);
+   ha_statistic_increment(&SSV::ha_read_first_count);
+   int error=heap_rfirst(file, buf, active_index);
+   table->status=error ? STATUS_NOT_FOUND: 0;
++  MYSQL_INDEX_READ_ROW_DONE(error);
+   return error;
+ }
+ 
+ int ha_heap::index_last(uchar * buf)
+ {
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   DBUG_ASSERT(inited==INDEX);
+   ha_statistic_increment(&SSV::ha_read_last_count);
+   int error=heap_rlast(file, buf, active_index);
+   table->status=error ? STATUS_NOT_FOUND: 0;
++  MYSQL_INDEX_READ_ROW_DONE(error);
+   return error;
+ }
+ 
+@@ -345,9 +360,11 @@
+ 
+ int ha_heap::rnd_next(uchar *buf)
+ {
++  MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str, 0);
+   ha_statistic_increment(&SSV::ha_read_rnd_next_count);
+   int error=heap_scan(file, buf);
+   table->status=error ? STATUS_NOT_FOUND: 0;
++  MYSQL_READ_ROW_DONE(error);
+   return error;
+ }
+ 
+@@ -355,10 +372,12 @@
+ {
+   int error;
+   HEAP_PTR heap_position;
++  MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str, 0);
+   ha_statistic_increment(&SSV::ha_read_rnd_count);
+   memcpy_fixed((char*) &heap_position, pos, sizeof(HEAP_PTR));
+   error=heap_rrnd(file, buf, heap_position);
+   table->status=error ? STATUS_NOT_FOUND: 0;
++  MYSQL_READ_ROW_DONE(error);
+   return error;
+ }
+ 
+diff -Nru storage/myisam/Makefile.am storage/myisam/Makefile.am
+--- storage/myisam/Makefile.am	2011-05-27 11:02:47.000000000 +0200
++++ storage/myisam/Makefile.am	2011-05-27 10:50:57.000000000 +0200
+@@ -150,5 +150,21 @@
+ 	@CHMOD@ +x $@-t
+ 	@MV@ $@-t $@
+ 
++if HAVE_DTRACE_DASH_G
++abs_top_srcdir = @abs_top_srcdir@
++libmyisam_a_LIBADD = probes_mysql.o
++libmyisam_a_DEPENDENCIES = probes_mysql.o dtrace_files dtrace_providers
++CLEANFILES += probes_mysql.o dtrace_files dtrace_providers
++DTRACEFILES = ha_myisam.o
++DTRACEPROVIDER = $(abs_top_srcdir)/sql/probes_mysql.d
++
++dtrace_files:
++	echo $(DTRACEFILES) > $@
++dtrace_providers:
++	echo $(DTRACEPROVIDER) > $@
++probes_mysql.o: $(DTRACEPROVIDER) $(DTRACEFILES)
++	$(DTRACE) $(DTRACEFLAGS) -G -s $< $(DTRACEFILES) -o $@
++endif
++
+ # Don't update the files from bitkeeper
+ %::SCCS/s.%
+diff -Nru storage/myisam/Makefile.in storage/myisam/Makefile.in
+--- storage/myisam/Makefile.in	2011-05-27 11:04:00.000000000 +0200
++++ storage/myisam/Makefile.in	2011-05-27 10:52:07.000000000 +0200
+@@ -55,6 +55,7 @@
+ 	myisampack$(EXEEXT) myisam_ftdump$(EXEEXT)
+ noinst_PROGRAMS = mi_test1$(EXEEXT) mi_test2$(EXEEXT) \
+ 	mi_test3$(EXEEXT) rt_test$(EXEEXT) sp_test$(EXEEXT)
++@HAVE_DTRACE_DASH_G_TRUE@am__append_1 = probes_mysql.o dtrace_files dtrace_providers
+ subdir = storage/myisam
+ DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
+ 	$(srcdir)/Makefile.in ChangeLog NEWS TODO
+@@ -63,6 +64,7 @@
+ 	$(top_srcdir)/config/ac-macros/check_cpu.m4 \
+ 	$(top_srcdir)/config/ac-macros/character_sets.m4 \
+ 	$(top_srcdir)/config/ac-macros/compiler_flag.m4 \
++	$(top_srcdir)/config/ac-macros/dtrace.m4 \
+ 	$(top_srcdir)/config/ac-macros/plugins.m4 \
+ 	$(top_srcdir)/config/ac-macros/ha_ndbcluster.m4 \
+ 	$(top_srcdir)/config/ac-macros/large_file.m4 \
+@@ -87,7 +89,6 @@
+ pkglibLIBRARIES_INSTALL = $(INSTALL_DATA)
+ LIBRARIES = $(pkglib_LIBRARIES)
+ libmyisam_a_AR = $(AR) $(ARFLAGS)
+-libmyisam_a_LIBADD =
+ am_libmyisam_a_OBJECTS = mi_open.$(OBJEXT) mi_extra.$(OBJEXT) \
+ 	mi_info.$(OBJEXT) mi_rkey.$(OBJEXT) mi_rnext.$(OBJEXT) \
+ 	mi_rnext_same.$(OBJEXT) mi_search.$(OBJEXT) mi_page.$(OBJEXT) \
+@@ -206,6 +207,8 @@
+ DOT_FRM_VERSION = @DOT_FRM_VERSION@
+ DOXYGEN = @DOXYGEN@
+ DSYMUTIL = @DSYMUTIL@
++DTRACE = @DTRACE@
++DTRACEFLAGS = @DTRACEFLAGS@
+ DUMPBIN = @DUMPBIN@
+ DVIS = @DVIS@
+ ECHO_C = @ECHO_C@
+@@ -218,6 +221,7 @@
+ GETCONF = @GETCONF@
+ GREP = @GREP@
+ GXX = @GXX@
++HAVE_DTRACE = @HAVE_DTRACE@
+ HOSTNAME = @HOSTNAME@
+ INNODB_DYNAMIC_CFLAGS = @INNODB_DYNAMIC_CFLAGS@
+ INSTALL = @INSTALL@
+@@ -329,6 +333,7 @@
+ abs_builddir = @abs_builddir@
+ abs_srcdir = @abs_srcdir@
+ abs_top_builddir = @abs_top_builddir@
++@HAVE_DTRACE_DASH_G_TRUE@abs_top_srcdir = @abs_top_srcdir@
+ abs_top_srcdir = @abs_top_srcdir@
+ ac_ct_CC = @ac_ct_CC@
+ ac_ct_CXX = @ac_ct_CXX@
+@@ -553,8 +558,13 @@
+ 			ha_myisam.cc \
+ 			rt_index.c rt_key.c rt_mbr.c rt_split.c sp_key.c
+ 
+-CLEANFILES = test?.MY? FT?.MY? isam.log mi_test_all rt_test.MY? sp_test.MY?
++CLEANFILES = test?.MY? FT?.MY? isam.log mi_test_all rt_test.MY? \
++	sp_test.MY? $(am__append_1)
+ SUFFIXES = .sh
++@HAVE_DTRACE_DASH_G_TRUE@libmyisam_a_LIBADD = probes_mysql.o
++@HAVE_DTRACE_DASH_G_TRUE@libmyisam_a_DEPENDENCIES = probes_mysql.o dtrace_files dtrace_providers
++@HAVE_DTRACE_DASH_G_TRUE@DTRACEFILES = ha_myisam.o
++@HAVE_DTRACE_DASH_G_TRUE@DTRACEPROVIDER = $(abs_top_srcdir)/sql/probes_mysql.d
+ all: all-am
+ 
+ .SUFFIXES:
+@@ -1048,6 +1058,13 @@
+ 	@CHMOD@ +x $@-t
+ 	@MV@ $@-t $@
+ 
++@HAVE_DTRACE_DASH_G_TRUE@dtrace_files:
++@HAVE_DTRACE_DASH_G_TRUE@	echo $(DTRACEFILES) > $@
++@HAVE_DTRACE_DASH_G_TRUE@dtrace_providers:
++@HAVE_DTRACE_DASH_G_TRUE@	echo $(DTRACEPROVIDER) > $@
++@HAVE_DTRACE_DASH_G_TRUE@probes_mysql.o: $(DTRACEPROVIDER) $(DTRACEFILES)
++@HAVE_DTRACE_DASH_G_TRUE@	$(DTRACE) $(DTRACEFLAGS) -G -s $< $(DTRACEFILES) -o $@
++
+ # Don't update the files from bitkeeper
+ %::SCCS/s.%
+ # Tell versions [3.59,3.63) of GNU make to not export all variables.
+diff -Nru storage/myisam/ha_myisam.cc storage/myisam/ha_myisam.cc
+--- storage/myisam/ha_myisam.cc	2011-05-27 11:02:46.000000000 +0200
++++ storage/myisam/ha_myisam.cc	2011-05-27 10:50:57.000000000 +0200
+@@ -28,6 +28,7 @@
+ #include <stdarg.h>
+ #include "myisamdef.h"
+ #include "rt_index.h"
++#include "probes_mysql.h"
+ 
+ ulong myisam_recover_options= HA_RECOVER_NONE;
+ 
+@@ -1659,10 +1660,12 @@
+                               key_part_map keypart_map,
+                               enum ha_rkey_function find_flag)
+ {
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   DBUG_ASSERT(inited==INDEX);
+   ha_statistic_increment(&SSV::ha_read_key_count);
+   int error=mi_rkey(file, buf, active_index, key, keypart_map, find_flag);
+   table->status=error ? STATUS_NOT_FOUND: 0;
++  MYSQL_INDEX_READ_ROW_DONE(error);
+   return error;
+ }
+ 
+@@ -1670,9 +1673,11 @@
+                                   key_part_map keypart_map,
+                                   enum ha_rkey_function find_flag)
+ {
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   ha_statistic_increment(&SSV::ha_read_key_count);
+   int error=mi_rkey(file, buf, index, key, keypart_map, find_flag);
+   table->status=error ? STATUS_NOT_FOUND: 0;
++  MYSQL_INDEX_READ_ROW_DONE(error);
+   return error;
+ }
+ 
+@@ -1680,47 +1685,57 @@
+                                    key_part_map keypart_map)
+ {
+   DBUG_ENTER("ha_myisam::index_read_last");
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   DBUG_ASSERT(inited==INDEX);
+   ha_statistic_increment(&SSV::ha_read_key_count);
+   int error=mi_rkey(file, buf, active_index, key, keypart_map,
+                     HA_READ_PREFIX_LAST);
+   table->status=error ? STATUS_NOT_FOUND: 0;
++  MYSQL_INDEX_READ_ROW_DONE(error);
+   DBUG_RETURN(error);
+ }
+ 
+ int ha_myisam::index_next(uchar *buf)
+ {
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   DBUG_ASSERT(inited==INDEX);
+   ha_statistic_increment(&SSV::ha_read_next_count);
+   int error=mi_rnext(file,buf,active_index);
+   table->status=error ? STATUS_NOT_FOUND: 0;
++  MYSQL_INDEX_READ_ROW_DONE(error);
+   return error;
+ }
+ 
+ int ha_myisam::index_prev(uchar *buf)
+ {
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   DBUG_ASSERT(inited==INDEX);
+   ha_statistic_increment(&SSV::ha_read_prev_count);
+   int error=mi_rprev(file,buf, active_index);
+   table->status=error ? STATUS_NOT_FOUND: 0;
++  MYSQL_INDEX_READ_ROW_DONE(error);
+   return error;
+ }
+ 
+ int ha_myisam::index_first(uchar *buf)
+ {
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   DBUG_ASSERT(inited==INDEX);
+   ha_statistic_increment(&SSV::ha_read_first_count);
+   int error=mi_rfirst(file, buf, active_index);
+   table->status=error ? STATUS_NOT_FOUND: 0;
++  MYSQL_INDEX_READ_ROW_DONE(error);
+   return error;
+ }
+ 
+ int ha_myisam::index_last(uchar *buf)
+ {
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   DBUG_ASSERT(inited==INDEX);
+   ha_statistic_increment(&SSV::ha_read_last_count);
+   int error=mi_rlast(file, buf, active_index);
+   table->status=error ? STATUS_NOT_FOUND: 0;
++  MYSQL_INDEX_READ_ROW_DONE(error);
+   return error;
+ }
+ 
+@@ -1729,6 +1744,7 @@
+ 			       uint length __attribute__((unused)))
+ {
+   int error;
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   DBUG_ASSERT(inited==INDEX);
+   ha_statistic_increment(&SSV::ha_read_next_count);
+   do
+@@ -1736,6 +1752,7 @@
+     error= mi_rnext_same(file,buf);
+   } while (error == HA_ERR_RECORD_DELETED);
+   table->status=error ? STATUS_NOT_FOUND: 0;
++  MYSQL_INDEX_READ_ROW_DONE(error);
+   return error;
+ }
+ 
+@@ -1749,9 +1766,11 @@
+ 
+ int ha_myisam::rnd_next(uchar *buf)
+ {
++  MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str, 0);
+   ha_statistic_increment(&SSV::ha_read_rnd_next_count);
+   int error=mi_scan(file, buf);
+   table->status=error ? STATUS_NOT_FOUND: 0;
++  MYSQL_READ_ROW_DONE(0);
+   return error;
+ }
+ 
+@@ -1762,9 +1781,11 @@
+ 
+ int ha_myisam::rnd_pos(uchar *buf, uchar *pos)
+ {
++  MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str, 0);
+   ha_statistic_increment(&SSV::ha_read_rnd_count);
+   int error=mi_rrnd(file, buf, my_get_ptr(pos,ref_length));
+   table->status=error ? STATUS_NOT_FOUND: 0;
++  MYSQL_READ_ROW_DONE(0);
+   return error;
+ }
+ 
+diff -Nru storage/myisammrg/Makefile.am storage/myisammrg/Makefile.am
+--- storage/myisammrg/Makefile.am	2011-05-27 11:02:47.000000000 +0200
++++ storage/myisammrg/Makefile.am	2011-05-27 10:50:57.000000000 +0200
+@@ -40,5 +40,22 @@
+ 
+ EXTRA_DIST =		CMakeLists.txt plug.in
+ 
++if HAVE_DTRACE_DASH_G
++abs_top_srcdir = @abs_top_srcdir@
++libmyisammrg_a_LIBADD = probes_mysql.o
++libmyisammrg_a_DEPENDENCIES = probes_mysql.o dtrace_files dtrace_providers
++CLEANFILES = probes_mysql.o dtrace_files dtrace_providers
++DTRACEFILES = ha_myisammrg.o
++DTRACEPROVIDER = $(abs_top_srcdir)/sql/probes_mysql.d
++
++dtrace_files:
++	echo $(DTRACEFILES) > $@
++dtrace_providers:
++	echo $(DTRACEPROVIDER) > $@
++probes_mysql.o: $(DTRACEPROVIDER) $(DTRACEFILES)
++	$(DTRACE) $(DTRACEFLAGS) -G -s $< $(DTRACEFILES) -o $@
++endif
++
++
+ # Don't update the files from bitkeeper
+ %::SCCS/s.%
+diff -Nru storage/myisammrg/Makefile.in storage/myisammrg/Makefile.in
+--- storage/myisammrg/Makefile.in	2011-05-27 11:04:00.000000000 +0200
++++ storage/myisammrg/Makefile.in	2011-05-27 10:52:07.000000000 +0200
+@@ -57,6 +57,7 @@
+ 	$(top_srcdir)/config/ac-macros/check_cpu.m4 \
+ 	$(top_srcdir)/config/ac-macros/character_sets.m4 \
+ 	$(top_srcdir)/config/ac-macros/compiler_flag.m4 \
++	$(top_srcdir)/config/ac-macros/dtrace.m4 \
+ 	$(top_srcdir)/config/ac-macros/plugins.m4 \
+ 	$(top_srcdir)/config/ac-macros/ha_ndbcluster.m4 \
+ 	$(top_srcdir)/config/ac-macros/large_file.m4 \
+@@ -80,7 +81,6 @@
+ pkglibLIBRARIES_INSTALL = $(INSTALL_DATA)
+ LIBRARIES = $(noinst_LIBRARIES) $(pkglib_LIBRARIES)
+ libmyisammrg_a_AR = $(AR) $(ARFLAGS)
+-libmyisammrg_a_LIBADD =
+ am_libmyisammrg_a_OBJECTS = myrg_open.$(OBJEXT) myrg_extra.$(OBJEXT) \
+ 	myrg_info.$(OBJEXT) myrg_locking.$(OBJEXT) myrg_rrnd.$(OBJEXT) \
+ 	myrg_update.$(OBJEXT) myrg_delete.$(OBJEXT) \
+@@ -163,6 +163,8 @@
+ DOT_FRM_VERSION = @DOT_FRM_VERSION@
+ DOXYGEN = @DOXYGEN@
+ DSYMUTIL = @DSYMUTIL@
++DTRACE = @DTRACE@
++DTRACEFLAGS = @DTRACEFLAGS@
+ DUMPBIN = @DUMPBIN@
+ DVIS = @DVIS@
+ ECHO_C = @ECHO_C@
+@@ -175,6 +177,7 @@
+ GETCONF = @GETCONF@
+ GREP = @GREP@
+ GXX = @GXX@
++HAVE_DTRACE = @HAVE_DTRACE@
+ HOSTNAME = @HOSTNAME@
+ INNODB_DYNAMIC_CFLAGS = @INNODB_DYNAMIC_CFLAGS@
+ INSTALL = @INSTALL@
+@@ -286,6 +289,7 @@
+ abs_builddir = @abs_builddir@
+ abs_srcdir = @abs_srcdir@
+ abs_top_builddir = @abs_top_builddir@
++@HAVE_DTRACE_DASH_G_TRUE@abs_top_srcdir = @abs_top_srcdir@
+ abs_top_srcdir = @abs_top_srcdir@
+ ac_ct_CC = @ac_ct_CC@
+ ac_ct_CXX = @ac_ct_CXX@
+@@ -441,6 +445,11 @@
+ 			myrg_rnext_same.c myrg_records.c
+ 
+ EXTRA_DIST = CMakeLists.txt plug.in
++@HAVE_DTRACE_DASH_G_TRUE@libmyisammrg_a_LIBADD = probes_mysql.o
++@HAVE_DTRACE_DASH_G_TRUE@libmyisammrg_a_DEPENDENCIES = probes_mysql.o dtrace_files dtrace_providers
++@HAVE_DTRACE_DASH_G_TRUE@CLEANFILES = probes_mysql.o dtrace_files dtrace_providers
++@HAVE_DTRACE_DASH_G_TRUE@DTRACEFILES = ha_myisammrg.o
++@HAVE_DTRACE_DASH_G_TRUE@DTRACEPROVIDER = $(abs_top_srcdir)/sql/probes_mysql.d
+ all: all-am
+ 
+ .SUFFIXES:
+@@ -686,6 +695,7 @@
+ mostlyclean-generic:
+ 
+ clean-generic:
++	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+ 
+ distclean-generic:
+ 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+@@ -769,6 +779,13 @@
+ 	tags uninstall uninstall-am uninstall-pkglibLIBRARIES
+ 
+ 
++@HAVE_DTRACE_DASH_G_TRUE@dtrace_files:
++@HAVE_DTRACE_DASH_G_TRUE@	echo $(DTRACEFILES) > $@
++@HAVE_DTRACE_DASH_G_TRUE@dtrace_providers:
++@HAVE_DTRACE_DASH_G_TRUE@	echo $(DTRACEPROVIDER) > $@
++@HAVE_DTRACE_DASH_G_TRUE@probes_mysql.o: $(DTRACEPROVIDER) $(DTRACEFILES)
++@HAVE_DTRACE_DASH_G_TRUE@	$(DTRACE) $(DTRACEFLAGS) -G -s $< $(DTRACEFILES) -o $@
++
+ # Don't update the files from bitkeeper
+ %::SCCS/s.%
+ # Tell versions [3.59,3.63) of GNU make to not export all variables.
+diff -Nru storage/myisammrg/ha_myisammrg.cc storage/myisammrg/ha_myisammrg.cc
+--- storage/myisammrg/ha_myisammrg.cc	2011-05-27 11:02:46.000000000 +0200
++++ storage/myisammrg/ha_myisammrg.cc	2011-05-27 10:50:57.000000000 +0200
+@@ -101,7 +101,7 @@
+ #include "../myisam/ha_myisam.h"
+ #include "ha_myisammrg.h"
+ #include "myrg_def.h"
+-
++#include "probes_mysql.h"
+ 
+ static handler *myisammrg_create_handler(handlerton *hton,
+                                          TABLE_SHARE *table,
+@@ -734,10 +734,12 @@
+                                  key_part_map keypart_map,
+                                  enum ha_rkey_function find_flag)
+ {
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   DBUG_ASSERT(this->file->children_attached);
+   ha_statistic_increment(&SSV::ha_read_key_count);
+   int error=myrg_rkey(file,buf,active_index, key, keypart_map, find_flag);
+   table->status=error ? STATUS_NOT_FOUND: 0;
++  MYSQL_INDEX_READ_ROW_DONE(error);
+   return error;
+ }
+ 
+@@ -745,57 +747,69 @@
+                                      key_part_map keypart_map,
+                                      enum ha_rkey_function find_flag)
+ {
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   DBUG_ASSERT(this->file->children_attached);
+   ha_statistic_increment(&SSV::ha_read_key_count);
+   int error=myrg_rkey(file,buf,index, key, keypart_map, find_flag);
+   table->status=error ? STATUS_NOT_FOUND: 0;
++  MYSQL_INDEX_READ_ROW_DONE(error);
+   return error;
+ }
+ 
+ int ha_myisammrg::index_read_last_map(uchar *buf, const uchar *key,
+                                       key_part_map keypart_map)
+ {
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   DBUG_ASSERT(this->file->children_attached);
+   ha_statistic_increment(&SSV::ha_read_key_count);
+   int error=myrg_rkey(file,buf,active_index, key, keypart_map,
+ 		      HA_READ_PREFIX_LAST);
+   table->status=error ? STATUS_NOT_FOUND: 0;
++  MYSQL_INDEX_READ_ROW_DONE(error);
+   return error;
+ }
+ 
+ int ha_myisammrg::index_next(uchar * buf)
+ {
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   DBUG_ASSERT(this->file->children_attached);
+   ha_statistic_increment(&SSV::ha_read_next_count);
+   int error=myrg_rnext(file,buf,active_index);
+   table->status=error ? STATUS_NOT_FOUND: 0;
++  MYSQL_INDEX_READ_ROW_DONE(error);
+   return error;
+ }
+ 
+ int ha_myisammrg::index_prev(uchar * buf)
+ {
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   DBUG_ASSERT(this->file->children_attached);
+   ha_statistic_increment(&SSV::ha_read_prev_count);
+   int error=myrg_rprev(file,buf, active_index);
+   table->status=error ? STATUS_NOT_FOUND: 0;
++  MYSQL_INDEX_READ_ROW_DONE(error);
+   return error;
+ }
+ 
+ int ha_myisammrg::index_first(uchar * buf)
+ {
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   DBUG_ASSERT(this->file->children_attached);
+   ha_statistic_increment(&SSV::ha_read_first_count);
+   int error=myrg_rfirst(file, buf, active_index);
+   table->status=error ? STATUS_NOT_FOUND: 0;
++  MYSQL_INDEX_READ_ROW_DONE(error);
+   return error;
+ }
+ 
+ int ha_myisammrg::index_last(uchar * buf)
+ {
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   DBUG_ASSERT(this->file->children_attached);
+   ha_statistic_increment(&SSV::ha_read_last_count);
+   int error=myrg_rlast(file, buf, active_index);
+   table->status=error ? STATUS_NOT_FOUND: 0;
++  MYSQL_INDEX_READ_ROW_DONE(error);
+   return error;
+ }
+ 
+@@ -804,6 +818,7 @@
+                                   uint length __attribute__((unused)))
+ {
+   int error;
++  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+   DBUG_ASSERT(this->file->children_attached);
+   ha_statistic_increment(&SSV::ha_read_next_count);
+   do
+@@ -811,6 +826,7 @@
+     error= myrg_rnext_same(file,buf);
+   } while (error == HA_ERR_RECORD_DELETED);
+   table->status=error ? STATUS_NOT_FOUND: 0;
++  MYSQL_INDEX_READ_ROW_DONE(error);
+   return error;
+ }
+ 
+@@ -824,20 +840,24 @@
+ 
+ int ha_myisammrg::rnd_next(uchar *buf)
+ {
++  MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str, 0);
+   DBUG_ASSERT(this->file->children_attached);
+   ha_statistic_increment(&SSV::ha_read_rnd_next_count);
+   int error=myrg_rrnd(file, buf, HA_OFFSET_ERROR);
+   table->status=error ? STATUS_NOT_FOUND: 0;
++  MYSQL_READ_ROW_DONE(error);
+   return error;
+ }
+ 
+ 
+ int ha_myisammrg::rnd_pos(uchar * buf, uchar *pos)
+ {
++  MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str, 0);
+   DBUG_ASSERT(this->file->children_attached);
+   ha_statistic_increment(&SSV::ha_read_rnd_count);
+   int error=myrg_rrnd(file, buf, my_get_ptr(pos,ref_length));
+   table->status=error ? STATUS_NOT_FOUND: 0;
++  MYSQL_READ_ROW_DONE(error);
+   return error;
+ }
+ 
+=== added file 'include/probes.h'
+--- include/probes.h	1970-01-01 00:00:00 +0000
++++ include/probes.h	2011-05-26 16:14:02 +0000
+@@ -0,0 +1,981 @@
++/*
++ * Generated by dtrace(1M).
++ */
++
++#ifndef	_PROBES_H
++#define	_PROBES_H
++
++
++
++#ifdef	__cplusplus
++extern "C" {
++#endif
++
++#if _DTRACE_VERSION
++
++#define	MYSQL_COMMAND_DONE(arg0) \
++	__dtrace_mysql___command__done(arg0)
++#ifndef	__sparc
++#define	MYSQL_COMMAND_DONE_ENABLED() \
++	__dtraceenabled_mysql___command__done()
++#else
++#define	MYSQL_COMMAND_DONE_ENABLED() \
++	__dtraceenabled_mysql___command__done(0)
++#endif
++#define	MYSQL_COMMAND_START(arg0, arg1, arg2, arg3) \
++	__dtrace_mysql___command__start(arg0, arg1, arg2, arg3)
++#ifndef	__sparc
++#define	MYSQL_COMMAND_START_ENABLED() \
++	__dtraceenabled_mysql___command__start()
++#else
++#define	MYSQL_COMMAND_START_ENABLED() \
++	__dtraceenabled_mysql___command__start(0)
++#endif
++#define	MYSQL_CONNECTION_DONE(arg0, arg1) \
++	__dtrace_mysql___connection__done(arg0, arg1)
++#ifndef	__sparc
++#define	MYSQL_CONNECTION_DONE_ENABLED() \
++	__dtraceenabled_mysql___connection__done()
++#else
++#define	MYSQL_CONNECTION_DONE_ENABLED() \
++	__dtraceenabled_mysql___connection__done(0)
++#endif
++#define	MYSQL_CONNECTION_START(arg0, arg1, arg2) \
++	__dtrace_mysql___connection__start(arg0, arg1, arg2)
++#ifndef	__sparc
++#define	MYSQL_CONNECTION_START_ENABLED() \
++	__dtraceenabled_mysql___connection__start()
++#else
++#define	MYSQL_CONNECTION_START_ENABLED() \
++	__dtraceenabled_mysql___connection__start(0)
++#endif
++#define	MYSQL_DELETE_DONE(arg0, arg1) \
++	__dtrace_mysql___delete__done(arg0, arg1)
++#ifndef	__sparc
++#define	MYSQL_DELETE_DONE_ENABLED() \
++	__dtraceenabled_mysql___delete__done()
++#else
++#define	MYSQL_DELETE_DONE_ENABLED() \
++	__dtraceenabled_mysql___delete__done(0)
++#endif
++#define	MYSQL_DELETE_ROW_DONE(arg0) \
++	__dtrace_mysql___delete__row__done(arg0)
++#ifndef	__sparc
++#define	MYSQL_DELETE_ROW_DONE_ENABLED() \
++	__dtraceenabled_mysql___delete__row__done()
++#else
++#define	MYSQL_DELETE_ROW_DONE_ENABLED() \
++	__dtraceenabled_mysql___delete__row__done(0)
++#endif
++#define	MYSQL_DELETE_ROW_START(arg0, arg1) \
++	__dtrace_mysql___delete__row__start(arg0, arg1)
++#ifndef	__sparc
++#define	MYSQL_DELETE_ROW_START_ENABLED() \
++	__dtraceenabled_mysql___delete__row__start()
++#else
++#define	MYSQL_DELETE_ROW_START_ENABLED() \
++	__dtraceenabled_mysql___delete__row__start(0)
++#endif
++#define	MYSQL_DELETE_START(arg0) \
++	__dtrace_mysql___delete__start(arg0)
++#ifndef	__sparc
++#define	MYSQL_DELETE_START_ENABLED() \
++	__dtraceenabled_mysql___delete__start()
++#else
++#define	MYSQL_DELETE_START_ENABLED() \
++	__dtraceenabled_mysql___delete__start(0)
++#endif
++#define	MYSQL_FILESORT_DONE(arg0, arg1) \
++	__dtrace_mysql___filesort__done(arg0, arg1)
++#ifndef	__sparc
++#define	MYSQL_FILESORT_DONE_ENABLED() \
++	__dtraceenabled_mysql___filesort__done()
++#else
++#define	MYSQL_FILESORT_DONE_ENABLED() \
++	__dtraceenabled_mysql___filesort__done(0)
++#endif
++#define	MYSQL_FILESORT_START(arg0, arg1) \
++	__dtrace_mysql___filesort__start(arg0, arg1)
++#ifndef	__sparc
++#define	MYSQL_FILESORT_START_ENABLED() \
++	__dtraceenabled_mysql___filesort__start()
++#else
++#define	MYSQL_FILESORT_START_ENABLED() \
++	__dtraceenabled_mysql___filesort__start(0)
++#endif
++#define	MYSQL_HANDLER_RDLOCK_DONE(arg0) \
++	__dtrace_mysql___handler__rdlock__done(arg0)
++#ifndef	__sparc
++#define	MYSQL_HANDLER_RDLOCK_DONE_ENABLED() \
++	__dtraceenabled_mysql___handler__rdlock__done()
++#else
++#define	MYSQL_HANDLER_RDLOCK_DONE_ENABLED() \
++	__dtraceenabled_mysql___handler__rdlock__done(0)
++#endif
++#define	MYSQL_HANDLER_RDLOCK_START(arg0, arg1) \
++	__dtrace_mysql___handler__rdlock__start(arg0, arg1)
++#ifndef	__sparc
++#define	MYSQL_HANDLER_RDLOCK_START_ENABLED() \
++	__dtraceenabled_mysql___handler__rdlock__start()
++#else
++#define	MYSQL_HANDLER_RDLOCK_START_ENABLED() \
++	__dtraceenabled_mysql___handler__rdlock__start(0)
++#endif
++#define	MYSQL_HANDLER_UNLOCK_DONE(arg0) \
++	__dtrace_mysql___handler__unlock__done(arg0)
++#ifndef	__sparc
++#define	MYSQL_HANDLER_UNLOCK_DONE_ENABLED() \
++	__dtraceenabled_mysql___handler__unlock__done()
++#else
++#define	MYSQL_HANDLER_UNLOCK_DONE_ENABLED() \
++	__dtraceenabled_mysql___handler__unlock__done(0)
++#endif
++#define	MYSQL_HANDLER_UNLOCK_START(arg0, arg1) \
++	__dtrace_mysql___handler__unlock__start(arg0, arg1)
++#ifndef	__sparc
++#define	MYSQL_HANDLER_UNLOCK_START_ENABLED() \
++	__dtraceenabled_mysql___handler__unlock__start()
++#else
++#define	MYSQL_HANDLER_UNLOCK_START_ENABLED() \
++	__dtraceenabled_mysql___handler__unlock__start(0)
++#endif
++#define	MYSQL_HANDLER_WRLOCK_DONE(arg0) \
++	__dtrace_mysql___handler__wrlock__done(arg0)
++#ifndef	__sparc
++#define	MYSQL_HANDLER_WRLOCK_DONE_ENABLED() \
++	__dtraceenabled_mysql___handler__wrlock__done()
++#else
++#define	MYSQL_HANDLER_WRLOCK_DONE_ENABLED() \
++	__dtraceenabled_mysql___handler__wrlock__done(0)
++#endif
++#define	MYSQL_HANDLER_WRLOCK_START(arg0, arg1) \
++	__dtrace_mysql___handler__wrlock__start(arg0, arg1)
++#ifndef	__sparc
++#define	MYSQL_HANDLER_WRLOCK_START_ENABLED() \
++	__dtraceenabled_mysql___handler__wrlock__start()
++#else
++#define	MYSQL_HANDLER_WRLOCK_START_ENABLED() \
++	__dtraceenabled_mysql___handler__wrlock__start(0)
++#endif
++#define	MYSQL_INDEX_READ_ROW_DONE(arg0) \
++	__dtrace_mysql___index__read__row__done(arg0)
++#ifndef	__sparc
++#define	MYSQL_INDEX_READ_ROW_DONE_ENABLED() \
++	__dtraceenabled_mysql___index__read__row__done()
++#else
++#define	MYSQL_INDEX_READ_ROW_DONE_ENABLED() \
++	__dtraceenabled_mysql___index__read__row__done(0)
++#endif
++#define	MYSQL_INDEX_READ_ROW_START(arg0, arg1) \
++	__dtrace_mysql___index__read__row__start(arg0, arg1)
++#ifndef	__sparc
++#define	MYSQL_INDEX_READ_ROW_START_ENABLED() \
++	__dtraceenabled_mysql___index__read__row__start()
++#else
++#define	MYSQL_INDEX_READ_ROW_START_ENABLED() \
++	__dtraceenabled_mysql___index__read__row__start(0)
++#endif
++#define	MYSQL_INSERT_DONE(arg0, arg1) \
++	__dtrace_mysql___insert__done(arg0, arg1)
++#ifndef	__sparc
++#define	MYSQL_INSERT_DONE_ENABLED() \
++	__dtraceenabled_mysql___insert__done()
++#else
++#define	MYSQL_INSERT_DONE_ENABLED() \
++	__dtraceenabled_mysql___insert__done(0)
++#endif
++#define	MYSQL_INSERT_ROW_DONE(arg0) \
++	__dtrace_mysql___insert__row__done(arg0)
++#ifndef	__sparc
++#define	MYSQL_INSERT_ROW_DONE_ENABLED() \
++	__dtraceenabled_mysql___insert__row__done()
++#else
++#define	MYSQL_INSERT_ROW_DONE_ENABLED() \
++	__dtraceenabled_mysql___insert__row__done(0)
++#endif
++#define	MYSQL_INSERT_ROW_START(arg0, arg1) \
++	__dtrace_mysql___insert__row__start(arg0, arg1)
++#ifndef	__sparc
++#define	MYSQL_INSERT_ROW_START_ENABLED() \
++	__dtraceenabled_mysql___insert__row__start()
++#else
++#define	MYSQL_INSERT_ROW_START_ENABLED() \
++	__dtraceenabled_mysql___insert__row__start(0)
++#endif
++#define	MYSQL_INSERT_SELECT_DONE(arg0, arg1) \
++	__dtrace_mysql___insert__select__done(arg0, arg1)
++#ifndef	__sparc
++#define	MYSQL_INSERT_SELECT_DONE_ENABLED() \
++	__dtraceenabled_mysql___insert__select__done()
++#else
++#define	MYSQL_INSERT_SELECT_DONE_ENABLED() \
++	__dtraceenabled_mysql___insert__select__done(0)
++#endif
++#define	MYSQL_INSERT_SELECT_START(arg0) \
++	__dtrace_mysql___insert__select__start(arg0)
++#ifndef	__sparc
++#define	MYSQL_INSERT_SELECT_START_ENABLED() \
++	__dtraceenabled_mysql___insert__select__start()
++#else
++#define	MYSQL_INSERT_SELECT_START_ENABLED() \
++	__dtraceenabled_mysql___insert__select__start(0)
++#endif
++#define	MYSQL_INSERT_START(arg0) \
++	__dtrace_mysql___insert__start(arg0)
++#ifndef	__sparc
++#define	MYSQL_INSERT_START_ENABLED() \
++	__dtraceenabled_mysql___insert__start()
++#else
++#define	MYSQL_INSERT_START_ENABLED() \
++	__dtraceenabled_mysql___insert__start(0)
++#endif
++#define	MYSQL_KEYCACHE_READ_BLOCK(arg0) \
++	__dtrace_mysql___keycache__read__block(arg0)
++#ifndef	__sparc
++#define	MYSQL_KEYCACHE_READ_BLOCK_ENABLED() \
++	__dtraceenabled_mysql___keycache__read__block()
++#else
++#define	MYSQL_KEYCACHE_READ_BLOCK_ENABLED() \
++	__dtraceenabled_mysql___keycache__read__block(0)
++#endif
++#define	MYSQL_KEYCACHE_READ_DONE(arg0, arg1) \
++	__dtrace_mysql___keycache__read__done(arg0, arg1)
++#ifndef	__sparc
++#define	MYSQL_KEYCACHE_READ_DONE_ENABLED() \
++	__dtraceenabled_mysql___keycache__read__done()
++#else
++#define	MYSQL_KEYCACHE_READ_DONE_ENABLED() \
++	__dtraceenabled_mysql___keycache__read__done(0)
++#endif
++#define	MYSQL_KEYCACHE_READ_HIT() \
++	__dtrace_mysql___keycache__read__hit()
++#ifndef	__sparc
++#define	MYSQL_KEYCACHE_READ_HIT_ENABLED() \
++	__dtraceenabled_mysql___keycache__read__hit()
++#else
++#define	MYSQL_KEYCACHE_READ_HIT_ENABLED() \
++	__dtraceenabled_mysql___keycache__read__hit(0)
++#endif
++#define	MYSQL_KEYCACHE_READ_MISS() \
++	__dtrace_mysql___keycache__read__miss()
++#ifndef	__sparc
++#define	MYSQL_KEYCACHE_READ_MISS_ENABLED() \
++	__dtraceenabled_mysql___keycache__read__miss()
++#else
++#define	MYSQL_KEYCACHE_READ_MISS_ENABLED() \
++	__dtraceenabled_mysql___keycache__read__miss(0)
++#endif
++#define	MYSQL_KEYCACHE_READ_START(arg0, arg1, arg2, arg3) \
++	__dtrace_mysql___keycache__read__start(arg0, arg1, arg2, arg3)
++#ifndef	__sparc
++#define	MYSQL_KEYCACHE_READ_START_ENABLED() \
++	__dtraceenabled_mysql___keycache__read__start()
++#else
++#define	MYSQL_KEYCACHE_READ_START_ENABLED() \
++	__dtraceenabled_mysql___keycache__read__start(0)
++#endif
++#define	MYSQL_KEYCACHE_WRITE_BLOCK(arg0) \
++	__dtrace_mysql___keycache__write__block(arg0)
++#ifndef	__sparc
++#define	MYSQL_KEYCACHE_WRITE_BLOCK_ENABLED() \
++	__dtraceenabled_mysql___keycache__write__block()
++#else
++#define	MYSQL_KEYCACHE_WRITE_BLOCK_ENABLED() \
++	__dtraceenabled_mysql___keycache__write__block(0)
++#endif
++#define	MYSQL_KEYCACHE_WRITE_DONE(arg0, arg1) \
++	__dtrace_mysql___keycache__write__done(arg0, arg1)
++#ifndef	__sparc
++#define	MYSQL_KEYCACHE_WRITE_DONE_ENABLED() \
++	__dtraceenabled_mysql___keycache__write__done()
++#else
++#define	MYSQL_KEYCACHE_WRITE_DONE_ENABLED() \
++	__dtraceenabled_mysql___keycache__write__done(0)
++#endif
++#define	MYSQL_KEYCACHE_WRITE_START(arg0, arg1, arg2, arg3) \
++	__dtrace_mysql___keycache__write__start(arg0, arg1, arg2, arg3)
++#ifndef	__sparc
++#define	MYSQL_KEYCACHE_WRITE_START_ENABLED() \
++	__dtraceenabled_mysql___keycache__write__start()
++#else
++#define	MYSQL_KEYCACHE_WRITE_START_ENABLED() \
++	__dtraceenabled_mysql___keycache__write__start(0)
++#endif
++#define	MYSQL_MULTI_DELETE_DONE(arg0, arg1) \
++	__dtrace_mysql___multi__delete__done(arg0, arg1)
++#ifndef	__sparc
++#define	MYSQL_MULTI_DELETE_DONE_ENABLED() \
++	__dtraceenabled_mysql___multi__delete__done()
++#else
++#define	MYSQL_MULTI_DELETE_DONE_ENABLED() \
++	__dtraceenabled_mysql___multi__delete__done(0)
++#endif
++#define	MYSQL_MULTI_DELETE_START(arg0) \
++	__dtrace_mysql___multi__delete__start(arg0)
++#ifndef	__sparc
++#define	MYSQL_MULTI_DELETE_START_ENABLED() \
++	__dtraceenabled_mysql___multi__delete__start()
++#else
++#define	MYSQL_MULTI_DELETE_START_ENABLED() \
++	__dtraceenabled_mysql___multi__delete__start(0)
++#endif
++#define	MYSQL_MULTI_UPDATE_DONE(arg0, arg1, arg2) \
++	__dtrace_mysql___multi__update__done(arg0, arg1, arg2)
++#ifndef	__sparc
++#define	MYSQL_MULTI_UPDATE_DONE_ENABLED() \
++	__dtraceenabled_mysql___multi__update__done()
++#else
++#define	MYSQL_MULTI_UPDATE_DONE_ENABLED() \
++	__dtraceenabled_mysql___multi__update__done(0)
++#endif
++#define	MYSQL_MULTI_UPDATE_START(arg0) \
++	__dtrace_mysql___multi__update__start(arg0)
++#ifndef	__sparc
++#define	MYSQL_MULTI_UPDATE_START_ENABLED() \
++	__dtraceenabled_mysql___multi__update__start()
++#else
++#define	MYSQL_MULTI_UPDATE_START_ENABLED() \
++	__dtraceenabled_mysql___multi__update__start(0)
++#endif
++#define	MYSQL_NET_READ_DONE(arg0, arg1) \
++	__dtrace_mysql___net__read__done(arg0, arg1)
++#ifndef	__sparc
++#define	MYSQL_NET_READ_DONE_ENABLED() \
++	__dtraceenabled_mysql___net__read__done()
++#else
++#define	MYSQL_NET_READ_DONE_ENABLED() \
++	__dtraceenabled_mysql___net__read__done(0)
++#endif
++#define	MYSQL_NET_READ_START() \
++	__dtrace_mysql___net__read__start()
++#ifndef	__sparc
++#define	MYSQL_NET_READ_START_ENABLED() \
++	__dtraceenabled_mysql___net__read__start()
++#else
++#define	MYSQL_NET_READ_START_ENABLED() \
++	__dtraceenabled_mysql___net__read__start(0)
++#endif
++#define	MYSQL_NET_WRITE_DONE(arg0) \
++	__dtrace_mysql___net__write__done(arg0)
++#ifndef	__sparc
++#define	MYSQL_NET_WRITE_DONE_ENABLED() \
++	__dtraceenabled_mysql___net__write__done()
++#else
++#define	MYSQL_NET_WRITE_DONE_ENABLED() \
++	__dtraceenabled_mysql___net__write__done(0)
++#endif
++#define	MYSQL_NET_WRITE_START(arg0) \
++	__dtrace_mysql___net__write__start(arg0)
++#ifndef	__sparc
++#define	MYSQL_NET_WRITE_START_ENABLED() \
++	__dtraceenabled_mysql___net__write__start()
++#else
++#define	MYSQL_NET_WRITE_START_ENABLED() \
++	__dtraceenabled_mysql___net__write__start(0)
++#endif
++#define	MYSQL_QUERY_CACHE_HIT(arg0, arg1) \
++	__dtrace_mysql___query__cache__hit(arg0, arg1)
++#ifndef	__sparc
++#define	MYSQL_QUERY_CACHE_HIT_ENABLED() \
++	__dtraceenabled_mysql___query__cache__hit()
++#else
++#define	MYSQL_QUERY_CACHE_HIT_ENABLED() \
++	__dtraceenabled_mysql___query__cache__hit(0)
++#endif
++#define	MYSQL_QUERY_CACHE_MISS(arg0) \
++	__dtrace_mysql___query__cache__miss(arg0)
++#ifndef	__sparc
++#define	MYSQL_QUERY_CACHE_MISS_ENABLED() \
++	__dtraceenabled_mysql___query__cache__miss()
++#else
++#define	MYSQL_QUERY_CACHE_MISS_ENABLED() \
++	__dtraceenabled_mysql___query__cache__miss(0)
++#endif
++#define	MYSQL_QUERY_DONE(arg0) \
++	__dtrace_mysql___query__done(arg0)
++#ifndef	__sparc
++#define	MYSQL_QUERY_DONE_ENABLED() \
++	__dtraceenabled_mysql___query__done()
++#else
++#define	MYSQL_QUERY_DONE_ENABLED() \
++	__dtraceenabled_mysql___query__done(0)
++#endif
++#define	MYSQL_QUERY_EXEC_DONE(arg0) \
++	__dtrace_mysql___query__exec__done(arg0)
++#ifndef	__sparc
++#define	MYSQL_QUERY_EXEC_DONE_ENABLED() \
++	__dtraceenabled_mysql___query__exec__done()
++#else
++#define	MYSQL_QUERY_EXEC_DONE_ENABLED() \
++	__dtraceenabled_mysql___query__exec__done(0)
++#endif
++#define	MYSQL_QUERY_EXEC_START(arg0, arg1, arg2, arg3, arg4, arg5) \
++	__dtrace_mysql___query__exec__start(arg0, arg1, arg2, arg3, arg4, arg5)
++#ifndef	__sparc
++#define	MYSQL_QUERY_EXEC_START_ENABLED() \
++	__dtraceenabled_mysql___query__exec__start()
++#else
++#define	MYSQL_QUERY_EXEC_START_ENABLED() \
++	__dtraceenabled_mysql___query__exec__start(0)
++#endif
++#define	MYSQL_QUERY_PARSE_DONE(arg0) \
++	__dtrace_mysql___query__parse__done(arg0)
++#ifndef	__sparc
++#define	MYSQL_QUERY_PARSE_DONE_ENABLED() \
++	__dtraceenabled_mysql___query__parse__done()
++#else
++#define	MYSQL_QUERY_PARSE_DONE_ENABLED() \
++	__dtraceenabled_mysql___query__parse__done(0)
++#endif
++#define	MYSQL_QUERY_PARSE_START(arg0) \
++	__dtrace_mysql___query__parse__start(arg0)
++#ifndef	__sparc
++#define	MYSQL_QUERY_PARSE_START_ENABLED() \
++	__dtraceenabled_mysql___query__parse__start()
++#else
++#define	MYSQL_QUERY_PARSE_START_ENABLED() \
++	__dtraceenabled_mysql___query__parse__start(0)
++#endif
++#define	MYSQL_QUERY_START(arg0, arg1, arg2, arg3, arg4) \
++	__dtrace_mysql___query__start(arg0, arg1, arg2, arg3, arg4)
++#ifndef	__sparc
++#define	MYSQL_QUERY_START_ENABLED() \
++	__dtraceenabled_mysql___query__start()
++#else
++#define	MYSQL_QUERY_START_ENABLED() \
++	__dtraceenabled_mysql___query__start(0)
++#endif
++#define	MYSQL_READ_ROW_DONE(arg0) \
++	__dtrace_mysql___read__row__done(arg0)
++#ifndef	__sparc
++#define	MYSQL_READ_ROW_DONE_ENABLED() \
++	__dtraceenabled_mysql___read__row__done()
++#else
++#define	MYSQL_READ_ROW_DONE_ENABLED() \
++	__dtraceenabled_mysql___read__row__done(0)
++#endif
++#define	MYSQL_READ_ROW_START(arg0, arg1, arg2) \
++	__dtrace_mysql___read__row__start(arg0, arg1, arg2)
++#ifndef	__sparc
++#define	MYSQL_READ_ROW_START_ENABLED() \
++	__dtraceenabled_mysql___read__row__start()
++#else
++#define	MYSQL_READ_ROW_START_ENABLED() \
++	__dtraceenabled_mysql___read__row__start(0)
++#endif
++#define	MYSQL_SELECT_DONE(arg0, arg1) \
++	__dtrace_mysql___select__done(arg0, arg1)
++#ifndef	__sparc
++#define	MYSQL_SELECT_DONE_ENABLED() \
++	__dtraceenabled_mysql___select__done()
++#else
++#define	MYSQL_SELECT_DONE_ENABLED() \
++	__dtraceenabled_mysql___select__done(0)
++#endif
++#define	MYSQL_SELECT_START(arg0) \
++	__dtrace_mysql___select__start(arg0)
++#ifndef	__sparc
++#define	MYSQL_SELECT_START_ENABLED() \
++	__dtraceenabled_mysql___select__start()
++#else
++#define	MYSQL_SELECT_START_ENABLED() \
++	__dtraceenabled_mysql___select__start(0)
++#endif
++#define	MYSQL_UPDATE_DONE(arg0, arg1, arg2) \
++	__dtrace_mysql___update__done(arg0, arg1, arg2)
++#ifndef	__sparc
++#define	MYSQL_UPDATE_DONE_ENABLED() \
++	__dtraceenabled_mysql___update__done()
++#else
++#define	MYSQL_UPDATE_DONE_ENABLED() \
++	__dtraceenabled_mysql___update__done(0)
++#endif
++#define	MYSQL_UPDATE_ROW_DONE(arg0) \
++	__dtrace_mysql___update__row__done(arg0)
++#ifndef	__sparc
++#define	MYSQL_UPDATE_ROW_DONE_ENABLED() \
++	__dtraceenabled_mysql___update__row__done()
++#else
++#define	MYSQL_UPDATE_ROW_DONE_ENABLED() \
++	__dtraceenabled_mysql___update__row__done(0)
++#endif
++#define	MYSQL_UPDATE_ROW_START(arg0, arg1) \
++	__dtrace_mysql___update__row__start(arg0, arg1)
++#ifndef	__sparc
++#define	MYSQL_UPDATE_ROW_START_ENABLED() \
++	__dtraceenabled_mysql___update__row__start()
++#else
++#define	MYSQL_UPDATE_ROW_START_ENABLED() \
++	__dtraceenabled_mysql___update__row__start(0)
++#endif
++#define	MYSQL_UPDATE_START(arg0) \
++	__dtrace_mysql___update__start(arg0)
++#ifndef	__sparc
++#define	MYSQL_UPDATE_START_ENABLED() \
++	__dtraceenabled_mysql___update__start()
++#else
++#define	MYSQL_UPDATE_START_ENABLED() \
++	__dtraceenabled_mysql___update__start(0)
++#endif
++
++
++extern void __dtrace_mysql___command__done(int);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___command__done(void);
++#else
++extern int __dtraceenabled_mysql___command__done(long);
++#endif
++extern void __dtrace_mysql___command__start(unsigned long, int, char *, char *);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___command__start(void);
++#else
++extern int __dtraceenabled_mysql___command__start(long);
++#endif
++extern void __dtrace_mysql___connection__done(int, unsigned long);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___connection__done(void);
++#else
++extern int __dtraceenabled_mysql___connection__done(long);
++#endif
++extern void __dtrace_mysql___connection__start(unsigned long, char *, char *);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___connection__start(void);
++#else
++extern int __dtraceenabled_mysql___connection__start(long);
++#endif
++extern void __dtrace_mysql___delete__done(int, unsigned long);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___delete__done(void);
++#else
++extern int __dtraceenabled_mysql___delete__done(long);
++#endif
++extern void __dtrace_mysql___delete__row__done(int);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___delete__row__done(void);
++#else
++extern int __dtraceenabled_mysql___delete__row__done(long);
++#endif
++extern void __dtrace_mysql___delete__row__start(char *, char *);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___delete__row__start(void);
++#else
++extern int __dtraceenabled_mysql___delete__row__start(long);
++#endif
++extern void __dtrace_mysql___delete__start(char *);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___delete__start(void);
++#else
++extern int __dtraceenabled_mysql___delete__start(long);
++#endif
++extern void __dtrace_mysql___filesort__done(int, unsigned long);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___filesort__done(void);
++#else
++extern int __dtraceenabled_mysql___filesort__done(long);
++#endif
++extern void __dtrace_mysql___filesort__start(char *, char *);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___filesort__start(void);
++#else
++extern int __dtraceenabled_mysql___filesort__start(long);
++#endif
++extern void __dtrace_mysql___handler__rdlock__done(int);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___handler__rdlock__done(void);
++#else
++extern int __dtraceenabled_mysql___handler__rdlock__done(long);
++#endif
++extern void __dtrace_mysql___handler__rdlock__start(char *, char *);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___handler__rdlock__start(void);
++#else
++extern int __dtraceenabled_mysql___handler__rdlock__start(long);
++#endif
++extern void __dtrace_mysql___handler__unlock__done(int);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___handler__unlock__done(void);
++#else
++extern int __dtraceenabled_mysql___handler__unlock__done(long);
++#endif
++extern void __dtrace_mysql___handler__unlock__start(char *, char *);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___handler__unlock__start(void);
++#else
++extern int __dtraceenabled_mysql___handler__unlock__start(long);
++#endif
++extern void __dtrace_mysql___handler__wrlock__done(int);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___handler__wrlock__done(void);
++#else
++extern int __dtraceenabled_mysql___handler__wrlock__done(long);
++#endif
++extern void __dtrace_mysql___handler__wrlock__start(char *, char *);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___handler__wrlock__start(void);
++#else
++extern int __dtraceenabled_mysql___handler__wrlock__start(long);
++#endif
++extern void __dtrace_mysql___index__read__row__done(int);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___index__read__row__done(void);
++#else
++extern int __dtraceenabled_mysql___index__read__row__done(long);
++#endif
++extern void __dtrace_mysql___index__read__row__start(char *, char *);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___index__read__row__start(void);
++#else
++extern int __dtraceenabled_mysql___index__read__row__start(long);
++#endif
++extern void __dtrace_mysql___insert__done(int, unsigned long);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___insert__done(void);
++#else
++extern int __dtraceenabled_mysql___insert__done(long);
++#endif
++extern void __dtrace_mysql___insert__row__done(int);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___insert__row__done(void);
++#else
++extern int __dtraceenabled_mysql___insert__row__done(long);
++#endif
++extern void __dtrace_mysql___insert__row__start(char *, char *);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___insert__row__start(void);
++#else
++extern int __dtraceenabled_mysql___insert__row__start(long);
++#endif
++extern void __dtrace_mysql___insert__select__done(int, unsigned long);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___insert__select__done(void);
++#else
++extern int __dtraceenabled_mysql___insert__select__done(long);
++#endif
++extern void __dtrace_mysql___insert__select__start(char *);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___insert__select__start(void);
++#else
++extern int __dtraceenabled_mysql___insert__select__start(long);
++#endif
++extern void __dtrace_mysql___insert__start(char *);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___insert__start(void);
++#else
++extern int __dtraceenabled_mysql___insert__start(long);
++#endif
++extern void __dtrace_mysql___keycache__read__block(unsigned long);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___keycache__read__block(void);
++#else
++extern int __dtraceenabled_mysql___keycache__read__block(long);
++#endif
++extern void __dtrace_mysql___keycache__read__done(unsigned long, unsigned long);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___keycache__read__done(void);
++#else
++extern int __dtraceenabled_mysql___keycache__read__done(long);
++#endif
++extern void __dtrace_mysql___keycache__read__hit(void);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___keycache__read__hit(void);
++#else
++extern int __dtraceenabled_mysql___keycache__read__hit(long);
++#endif
++extern void __dtrace_mysql___keycache__read__miss(void);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___keycache__read__miss(void);
++#else
++extern int __dtraceenabled_mysql___keycache__read__miss(long);
++#endif
++extern void __dtrace_mysql___keycache__read__start(char *, unsigned long, unsigned long, unsigned long);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___keycache__read__start(void);
++#else
++extern int __dtraceenabled_mysql___keycache__read__start(long);
++#endif
++extern void __dtrace_mysql___keycache__write__block(unsigned long);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___keycache__write__block(void);
++#else
++extern int __dtraceenabled_mysql___keycache__write__block(long);
++#endif
++extern void __dtrace_mysql___keycache__write__done(unsigned long, unsigned long);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___keycache__write__done(void);
++#else
++extern int __dtraceenabled_mysql___keycache__write__done(long);
++#endif
++extern void __dtrace_mysql___keycache__write__start(char *, unsigned long, unsigned long, unsigned long);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___keycache__write__start(void);
++#else
++extern int __dtraceenabled_mysql___keycache__write__start(long);
++#endif
++extern void __dtrace_mysql___multi__delete__done(int, unsigned long);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___multi__delete__done(void);
++#else
++extern int __dtraceenabled_mysql___multi__delete__done(long);
++#endif
++extern void __dtrace_mysql___multi__delete__start(char *);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___multi__delete__start(void);
++#else
++extern int __dtraceenabled_mysql___multi__delete__start(long);
++#endif
++extern void __dtrace_mysql___multi__update__done(int, unsigned long, unsigned long);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___multi__update__done(void);
++#else
++extern int __dtraceenabled_mysql___multi__update__done(long);
++#endif
++extern void __dtrace_mysql___multi__update__start(char *);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___multi__update__start(void);
++#else
++extern int __dtraceenabled_mysql___multi__update__start(long);
++#endif
++extern void __dtrace_mysql___net__read__done(int, unsigned long);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___net__read__done(void);
++#else
++extern int __dtraceenabled_mysql___net__read__done(long);
++#endif
++extern void __dtrace_mysql___net__read__start(void);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___net__read__start(void);
++#else
++extern int __dtraceenabled_mysql___net__read__start(long);
++#endif
++extern void __dtrace_mysql___net__write__done(int);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___net__write__done(void);
++#else
++extern int __dtraceenabled_mysql___net__write__done(long);
++#endif
++extern void __dtrace_mysql___net__write__start(unsigned long);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___net__write__start(void);
++#else
++extern int __dtraceenabled_mysql___net__write__start(long);
++#endif
++extern void __dtrace_mysql___query__cache__hit(char *, unsigned long);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___query__cache__hit(void);
++#else
++extern int __dtraceenabled_mysql___query__cache__hit(long);
++#endif
++extern void __dtrace_mysql___query__cache__miss(char *);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___query__cache__miss(void);
++#else
++extern int __dtraceenabled_mysql___query__cache__miss(long);
++#endif
++extern void __dtrace_mysql___query__done(int);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___query__done(void);
++#else
++extern int __dtraceenabled_mysql___query__done(long);
++#endif
++extern void __dtrace_mysql___query__exec__done(int);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___query__exec__done(void);
++#else
++extern int __dtraceenabled_mysql___query__exec__done(long);
++#endif
++extern void __dtrace_mysql___query__exec__start(char *, unsigned long, char *, char *, char *, int);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___query__exec__start(void);
++#else
++extern int __dtraceenabled_mysql___query__exec__start(long);
++#endif
++extern void __dtrace_mysql___query__parse__done(int);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___query__parse__done(void);
++#else
++extern int __dtraceenabled_mysql___query__parse__done(long);
++#endif
++extern void __dtrace_mysql___query__parse__start(char *);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___query__parse__start(void);
++#else
++extern int __dtraceenabled_mysql___query__parse__start(long);
++#endif
++extern void __dtrace_mysql___query__start(char *, unsigned long, char *, char *, char *);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___query__start(void);
++#else
++extern int __dtraceenabled_mysql___query__start(long);
++#endif
++extern void __dtrace_mysql___read__row__done(int);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___read__row__done(void);
++#else
++extern int __dtraceenabled_mysql___read__row__done(long);
++#endif
++extern void __dtrace_mysql___read__row__start(char *, char *, int);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___read__row__start(void);
++#else
++extern int __dtraceenabled_mysql___read__row__start(long);
++#endif
++extern void __dtrace_mysql___select__done(int, unsigned long);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___select__done(void);
++#else
++extern int __dtraceenabled_mysql___select__done(long);
++#endif
++extern void __dtrace_mysql___select__start(char *);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___select__start(void);
++#else
++extern int __dtraceenabled_mysql___select__start(long);
++#endif
++extern void __dtrace_mysql___update__done(int, unsigned long, unsigned long);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___update__done(void);
++#else
++extern int __dtraceenabled_mysql___update__done(long);
++#endif
++extern void __dtrace_mysql___update__row__done(int);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___update__row__done(void);
++#else
++extern int __dtraceenabled_mysql___update__row__done(long);
++#endif
++extern void __dtrace_mysql___update__row__start(char *, char *);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___update__row__start(void);
++#else
++extern int __dtraceenabled_mysql___update__row__start(long);
++#endif
++extern void __dtrace_mysql___update__start(char *);
++#ifndef	__sparc
++extern int __dtraceenabled_mysql___update__start(void);
++#else
++extern int __dtraceenabled_mysql___update__start(long);
++#endif
++
++#else
++
++#define	MYSQL_COMMAND_DONE(arg0)
++#define	MYSQL_COMMAND_DONE_ENABLED() (0)
++#define	MYSQL_COMMAND_START(arg0, arg1, arg2, arg3)
++#define	MYSQL_COMMAND_START_ENABLED() (0)
++#define	MYSQL_CONNECTION_DONE(arg0, arg1)
++#define	MYSQL_CONNECTION_DONE_ENABLED() (0)
++#define	MYSQL_CONNECTION_START(arg0, arg1, arg2)
++#define	MYSQL_CONNECTION_START_ENABLED() (0)
++#define	MYSQL_DELETE_DONE(arg0, arg1)
++#define	MYSQL_DELETE_DONE_ENABLED() (0)
++#define	MYSQL_DELETE_ROW_DONE(arg0)
++#define	MYSQL_DELETE_ROW_DONE_ENABLED() (0)
++#define	MYSQL_DELETE_ROW_START(arg0, arg1)
++#define	MYSQL_DELETE_ROW_START_ENABLED() (0)
++#define	MYSQL_DELETE_START(arg0)
++#define	MYSQL_DELETE_START_ENABLED() (0)
++#define	MYSQL_FILESORT_DONE(arg0, arg1)
++#define	MYSQL_FILESORT_DONE_ENABLED() (0)
++#define	MYSQL_FILESORT_START(arg0, arg1)
++#define	MYSQL_FILESORT_START_ENABLED() (0)
++#define	MYSQL_HANDLER_RDLOCK_DONE(arg0)
++#define	MYSQL_HANDLER_RDLOCK_DONE_ENABLED() (0)
++#define	MYSQL_HANDLER_RDLOCK_START(arg0, arg1)
++#define	MYSQL_HANDLER_RDLOCK_START_ENABLED() (0)
++#define	MYSQL_HANDLER_UNLOCK_DONE(arg0)
++#define	MYSQL_HANDLER_UNLOCK_DONE_ENABLED() (0)
++#define	MYSQL_HANDLER_UNLOCK_START(arg0, arg1)
++#define	MYSQL_HANDLER_UNLOCK_START_ENABLED() (0)
++#define	MYSQL_HANDLER_WRLOCK_DONE(arg0)
++#define	MYSQL_HANDLER_WRLOCK_DONE_ENABLED() (0)
++#define	MYSQL_HANDLER_WRLOCK_START(arg0, arg1)
++#define	MYSQL_HANDLER_WRLOCK_START_ENABLED() (0)
++#define	MYSQL_INDEX_READ_ROW_DONE(arg0)
++#define	MYSQL_INDEX_READ_ROW_DONE_ENABLED() (0)
++#define	MYSQL_INDEX_READ_ROW_START(arg0, arg1)
++#define	MYSQL_INDEX_READ_ROW_START_ENABLED() (0)
++#define	MYSQL_INSERT_DONE(arg0, arg1)
++#define	MYSQL_INSERT_DONE_ENABLED() (0)
++#define	MYSQL_INSERT_ROW_DONE(arg0)
++#define	MYSQL_INSERT_ROW_DONE_ENABLED() (0)
++#define	MYSQL_INSERT_ROW_START(arg0, arg1)
++#define	MYSQL_INSERT_ROW_START_ENABLED() (0)
++#define	MYSQL_INSERT_SELECT_DONE(arg0, arg1)
++#define	MYSQL_INSERT_SELECT_DONE_ENABLED() (0)
++#define	MYSQL_INSERT_SELECT_START(arg0)
++#define	MYSQL_INSERT_SELECT_START_ENABLED() (0)
++#define	MYSQL_INSERT_START(arg0)
++#define	MYSQL_INSERT_START_ENABLED() (0)
++#define	MYSQL_KEYCACHE_READ_BLOCK(arg0)
++#define	MYSQL_KEYCACHE_READ_BLOCK_ENABLED() (0)
++#define	MYSQL_KEYCACHE_READ_DONE(arg0, arg1)
++#define	MYSQL_KEYCACHE_READ_DONE_ENABLED() (0)
++#define	MYSQL_KEYCACHE_READ_HIT()
++#define	MYSQL_KEYCACHE_READ_HIT_ENABLED() (0)
++#define	MYSQL_KEYCACHE_READ_MISS()
++#define	MYSQL_KEYCACHE_READ_MISS_ENABLED() (0)
++#define	MYSQL_KEYCACHE_READ_START(arg0, arg1, arg2, arg3)
++#define	MYSQL_KEYCACHE_READ_START_ENABLED() (0)
++#define	MYSQL_KEYCACHE_WRITE_BLOCK(arg0)
++#define	MYSQL_KEYCACHE_WRITE_BLOCK_ENABLED() (0)
++#define	MYSQL_KEYCACHE_WRITE_DONE(arg0, arg1)
++#define	MYSQL_KEYCACHE_WRITE_DONE_ENABLED() (0)
++#define	MYSQL_KEYCACHE_WRITE_START(arg0, arg1, arg2, arg3)
++#define	MYSQL_KEYCACHE_WRITE_START_ENABLED() (0)
++#define	MYSQL_MULTI_DELETE_DONE(arg0, arg1)
++#define	MYSQL_MULTI_DELETE_DONE_ENABLED() (0)
++#define	MYSQL_MULTI_DELETE_START(arg0)
++#define	MYSQL_MULTI_DELETE_START_ENABLED() (0)
++#define	MYSQL_MULTI_UPDATE_DONE(arg0, arg1, arg2)
++#define	MYSQL_MULTI_UPDATE_DONE_ENABLED() (0)
++#define	MYSQL_MULTI_UPDATE_START(arg0)
++#define	MYSQL_MULTI_UPDATE_START_ENABLED() (0)
++#define	MYSQL_NET_READ_DONE(arg0, arg1)
++#define	MYSQL_NET_READ_DONE_ENABLED() (0)
++#define	MYSQL_NET_READ_START()
++#define	MYSQL_NET_READ_START_ENABLED() (0)
++#define	MYSQL_NET_WRITE_DONE(arg0)
++#define	MYSQL_NET_WRITE_DONE_ENABLED() (0)
++#define	MYSQL_NET_WRITE_START(arg0)
++#define	MYSQL_NET_WRITE_START_ENABLED() (0)
++#define	MYSQL_QUERY_CACHE_HIT(arg0, arg1)
++#define	MYSQL_QUERY_CACHE_HIT_ENABLED() (0)
++#define	MYSQL_QUERY_CACHE_MISS(arg0)
++#define	MYSQL_QUERY_CACHE_MISS_ENABLED() (0)
++#define	MYSQL_QUERY_DONE(arg0)
++#define	MYSQL_QUERY_DONE_ENABLED() (0)
++#define	MYSQL_QUERY_EXEC_DONE(arg0)
++#define	MYSQL_QUERY_EXEC_DONE_ENABLED() (0)
++#define	MYSQL_QUERY_EXEC_START(arg0, arg1, arg2, arg3, arg4, arg5)
++#define	MYSQL_QUERY_EXEC_START_ENABLED() (0)
++#define	MYSQL_QUERY_PARSE_DONE(arg0)
++#define	MYSQL_QUERY_PARSE_DONE_ENABLED() (0)
++#define	MYSQL_QUERY_PARSE_START(arg0)
++#define	MYSQL_QUERY_PARSE_START_ENABLED() (0)
++#define	MYSQL_QUERY_START(arg0, arg1, arg2, arg3, arg4)
++#define	MYSQL_QUERY_START_ENABLED() (0)
++#define	MYSQL_READ_ROW_DONE(arg0)
++#define	MYSQL_READ_ROW_DONE_ENABLED() (0)
++#define	MYSQL_READ_ROW_START(arg0, arg1, arg2)
++#define	MYSQL_READ_ROW_START_ENABLED() (0)
++#define	MYSQL_SELECT_DONE(arg0, arg1)
++#define	MYSQL_SELECT_DONE_ENABLED() (0)
++#define	MYSQL_SELECT_START(arg0)
++#define	MYSQL_SELECT_START_ENABLED() (0)
++#define	MYSQL_UPDATE_DONE(arg0, arg1, arg2)
++#define	MYSQL_UPDATE_DONE_ENABLED() (0)
++#define	MYSQL_UPDATE_ROW_DONE(arg0)
++#define	MYSQL_UPDATE_ROW_DONE_ENABLED() (0)
++#define	MYSQL_UPDATE_ROW_START(arg0, arg1)
++#define	MYSQL_UPDATE_ROW_START_ENABLED() (0)
++#define	MYSQL_UPDATE_START(arg0)
++#define	MYSQL_UPDATE_START_ENABLED() (0)
++
++#endif
++
++
++#ifdef	__cplusplus
++}
++#endif
++
++#endif	/* _PROBES_H */
+
+=== added file 'include/probes_mysql.h'
+--- include/probes_mysql.h	1970-01-01 00:00:00 +0000
++++ include/probes_mysql.h	2011-05-26 16:14:02 +0000
+@@ -0,0 +1,14 @@
++#ifndef PROBES_MYSQL_H
++
++#define PROBES_MYSQL_H
++
++#include <my_global.h>
++
++#if defined(HAVE_DTRACE) && !defined(DISABLE_DTRACE)
++#include "probes_mysql_dtrace.h"
++#else
++#include "probes_mysql_nodtrace.h"
++#endif
++
++#endif /* PROBES_MYSQL_H */
++
+
+=== added file 'include/probes_mysql_nodtrace.h'
+--- include/probes_mysql_nodtrace.h	1970-01-01 00:00:00 +0000
++++ include/probes_mysql_nodtrace.h	2011-05-26 16:14:02 +0000
+@@ -0,0 +1,129 @@
++/*
++ * Generated by dheadgen(1).
++ */
++
++#ifndef	_PROBES_MYSQL_D
++#define	_PROBES_MYSQL_D
++
++#ifdef	__cplusplus
++extern "C" {
++#endif
++
++#define	MYSQL_CONNECTION_START(arg0, arg1, arg2)
++#define	MYSQL_CONNECTION_START_ENABLED() (0)
++#define	MYSQL_CONNECTION_DONE(arg0, arg1)
++#define	MYSQL_CONNECTION_DONE_ENABLED() (0)
++#define	MYSQL_COMMAND_START(arg0, arg1, arg2, arg3)
++#define	MYSQL_COMMAND_START_ENABLED() (0)
++#define	MYSQL_COMMAND_DONE(arg0)
++#define	MYSQL_COMMAND_DONE_ENABLED() (0)
++#define	MYSQL_QUERY_START(arg0, arg1, arg2, arg3, arg4)
++#define	MYSQL_QUERY_START_ENABLED() (0)
++#define	MYSQL_QUERY_DONE(arg0)
++#define	MYSQL_QUERY_DONE_ENABLED() (0)
++#define	MYSQL_QUERY_PARSE_START(arg0)
++#define	MYSQL_QUERY_PARSE_START_ENABLED() (0)
++#define	MYSQL_QUERY_PARSE_DONE(arg0)
++#define	MYSQL_QUERY_PARSE_DONE_ENABLED() (0)
++#define	MYSQL_QUERY_CACHE_HIT(arg0, arg1)
++#define	MYSQL_QUERY_CACHE_HIT_ENABLED() (0)
++#define	MYSQL_QUERY_CACHE_MISS(arg0)
++#define	MYSQL_QUERY_CACHE_MISS_ENABLED() (0)
++#define	MYSQL_QUERY_EXEC_START(arg0, arg1, arg2, arg3, arg4, arg5)
++#define	MYSQL_QUERY_EXEC_START_ENABLED() (0)
++#define	MYSQL_QUERY_EXEC_DONE(arg0)
++#define	MYSQL_QUERY_EXEC_DONE_ENABLED() (0)
++#define	MYSQL_INSERT_ROW_START(arg0, arg1)
++#define	MYSQL_INSERT_ROW_START_ENABLED() (0)
++#define	MYSQL_INSERT_ROW_DONE(arg0)
++#define	MYSQL_INSERT_ROW_DONE_ENABLED() (0)
++#define	MYSQL_UPDATE_ROW_START(arg0, arg1)
++#define	MYSQL_UPDATE_ROW_START_ENABLED() (0)
++#define	MYSQL_UPDATE_ROW_DONE(arg0)
++#define	MYSQL_UPDATE_ROW_DONE_ENABLED() (0)
++#define	MYSQL_DELETE_ROW_START(arg0, arg1)
++#define	MYSQL_DELETE_ROW_START_ENABLED() (0)
++#define	MYSQL_DELETE_ROW_DONE(arg0)
++#define	MYSQL_DELETE_ROW_DONE_ENABLED() (0)
++#define	MYSQL_READ_ROW_START(arg0, arg1, arg2)
++#define	MYSQL_READ_ROW_START_ENABLED() (0)
++#define	MYSQL_READ_ROW_DONE(arg0)
++#define	MYSQL_READ_ROW_DONE_ENABLED() (0)
++#define	MYSQL_INDEX_READ_ROW_START(arg0, arg1)
++#define	MYSQL_INDEX_READ_ROW_START_ENABLED() (0)
++#define	MYSQL_INDEX_READ_ROW_DONE(arg0)
++#define	MYSQL_INDEX_READ_ROW_DONE_ENABLED() (0)
++#define	MYSQL_HANDLER_RDLOCK_START(arg0, arg1)
++#define	MYSQL_HANDLER_RDLOCK_START_ENABLED() (0)
++#define	MYSQL_HANDLER_WRLOCK_START(arg0, arg1)
++#define	MYSQL_HANDLER_WRLOCK_START_ENABLED() (0)
++#define	MYSQL_HANDLER_UNLOCK_START(arg0, arg1)
++#define	MYSQL_HANDLER_UNLOCK_START_ENABLED() (0)
++#define	MYSQL_HANDLER_RDLOCK_DONE(arg0)
++#define	MYSQL_HANDLER_RDLOCK_DONE_ENABLED() (0)
++#define	MYSQL_HANDLER_WRLOCK_DONE(arg0)
++#define	MYSQL_HANDLER_WRLOCK_DONE_ENABLED() (0)
++#define	MYSQL_HANDLER_UNLOCK_DONE(arg0)
++#define	MYSQL_HANDLER_UNLOCK_DONE_ENABLED() (0)
++#define	MYSQL_FILESORT_START(arg0, arg1)
++#define	MYSQL_FILESORT_START_ENABLED() (0)
++#define	MYSQL_FILESORT_DONE(arg0, arg1)
++#define	MYSQL_FILESORT_DONE_ENABLED() (0)
++#define	MYSQL_SELECT_START(arg0)
++#define	MYSQL_SELECT_START_ENABLED() (0)
++#define	MYSQL_SELECT_DONE(arg0, arg1)
++#define	MYSQL_SELECT_DONE_ENABLED() (0)
++#define	MYSQL_INSERT_START(arg0)
++#define	MYSQL_INSERT_START_ENABLED() (0)
++#define	MYSQL_INSERT_DONE(arg0, arg1)
++#define	MYSQL_INSERT_DONE_ENABLED() (0)
++#define	MYSQL_INSERT_SELECT_START(arg0)
++#define	MYSQL_INSERT_SELECT_START_ENABLED() (0)
++#define	MYSQL_INSERT_SELECT_DONE(arg0, arg1)
++#define	MYSQL_INSERT_SELECT_DONE_ENABLED() (0)
++#define	MYSQL_UPDATE_START(arg0)
++#define	MYSQL_UPDATE_START_ENABLED() (0)
++#define	MYSQL_UPDATE_DONE(arg0, arg1, arg2)
++#define	MYSQL_UPDATE_DONE_ENABLED() (0)
++#define	MYSQL_MULTI_UPDATE_START(arg0)
++#define	MYSQL_MULTI_UPDATE_START_ENABLED() (0)
++#define	MYSQL_MULTI_UPDATE_DONE(arg0, arg1, arg2)
++#define	MYSQL_MULTI_UPDATE_DONE_ENABLED() (0)
++#define	MYSQL_DELETE_START(arg0)
++#define	MYSQL_DELETE_START_ENABLED() (0)
++#define	MYSQL_DELETE_DONE(arg0, arg1)
++#define	MYSQL_DELETE_DONE_ENABLED() (0)
++#define	MYSQL_MULTI_DELETE_START(arg0)
++#define	MYSQL_MULTI_DELETE_START_ENABLED() (0)
++#define	MYSQL_MULTI_DELETE_DONE(arg0, arg1)
++#define	MYSQL_MULTI_DELETE_DONE_ENABLED() (0)
++#define	MYSQL_NET_READ_START()
++#define	MYSQL_NET_READ_START_ENABLED() (0)
++#define	MYSQL_NET_READ_DONE(arg0, arg1)
++#define	MYSQL_NET_READ_DONE_ENABLED() (0)
++#define	MYSQL_NET_WRITE_START(arg0)
++#define	MYSQL_NET_WRITE_START_ENABLED() (0)
++#define	MYSQL_NET_WRITE_DONE(arg0)
++#define	MYSQL_NET_WRITE_DONE_ENABLED() (0)
++#define	MYSQL_KEYCACHE_READ_START(arg0, arg1, arg2, arg3)
++#define	MYSQL_KEYCACHE_READ_START_ENABLED() (0)
++#define	MYSQL_KEYCACHE_READ_BLOCK(arg0)
++#define	MYSQL_KEYCACHE_READ_BLOCK_ENABLED() (0)
++#define	MYSQL_KEYCACHE_READ_HIT()
++#define	MYSQL_KEYCACHE_READ_HIT_ENABLED() (0)
++#define	MYSQL_KEYCACHE_READ_MISS()
++#define	MYSQL_KEYCACHE_READ_MISS_ENABLED() (0)
++#define	MYSQL_KEYCACHE_READ_DONE(arg0, arg1)
++#define	MYSQL_KEYCACHE_READ_DONE_ENABLED() (0)
++#define	MYSQL_KEYCACHE_WRITE_START(arg0, arg1, arg2, arg3)
++#define	MYSQL_KEYCACHE_WRITE_START_ENABLED() (0)
++#define	MYSQL_KEYCACHE_WRITE_BLOCK(arg0)
++#define	MYSQL_KEYCACHE_WRITE_BLOCK_ENABLED() (0)
++#define	MYSQL_KEYCACHE_WRITE_DONE(arg0, arg1)
++#define	MYSQL_KEYCACHE_WRITE_DONE_ENABLED() (0)
++
++#ifdef  __cplusplus
++}
++#endif
++
++#endif  /* _PROBES_MYSQL_D */
+
+=== added file 'sql/probes_mysql.d'
+--- sql/probes_mysql.d	1970-01-01 00:00:00 +0000
++++ sql/probes_mysql.d	2011-05-26 19:11:05 +0000
+@@ -0,0 +1,181 @@
++/* Copyright (C) 2008 MySQL AB
++
++   This program is free software; you can redistribute it and/or modify
++   it under the terms of the GNU General Public License as published by
++   the Free Software Foundation; version 2 of the License.
++
++   This program is distributed in the hope that it will be useful,
++   but WITHOUT ANY WARRANTY; without even the implied warranty of
++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++   GNU General Public License for more details.
++
++   You should have received a copy of the GNU General Public License
++   along with this program; if not, write to the Free Software
++   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA */
++
++/*
++  The actual probe names in DTrace scripts will replace '__' by '-'. Thus
++  insert__row__start will be insert-row-start.
++
++  Recommendations for adding new probes:
++
++  - each probe should have the minimal set of arguments required to
++  unambiguously identify the context in which the probe fires. Redundant
++  arguments (i.e. the ones that can be obtained in user scripts from previous
++  probes' arguments or otherwise) may be added for convenience.
++
++  - try to avoid computationally expensive probe arguments. If impossible,
++  use *_ENABLED() macros to check if the probe is activated before
++  performing expensive calculations for a probe argument.
++
++  - all *-done probes should have a status argument wherever applicable to make
++  it possible for user scripts to figure out whether the completed operation
++  was successful or not.
++  
++  - for all status arguments, a non-zero value should be returned on error or
++  failure, 0 should be returned on success.
++*/
++
++provider mysql {
++  
++  /* The following ones fire when creating or closing a client connection */
++  probe connection__start(unsigned long conn_id, char *user, char *host);
++  probe connection__done(int status, unsigned long conn_id);
++
++  /*
++    Fire at the start/end of any client command processing (including SQL
++    queries).
++  */
++  probe command__start(unsigned long conn_id, int command,
++                       char *user, char *host);
++  probe command__done(int status);
++  
++  /*
++    The following probes fire at the start/end of any SQL query processing,
++    respectively.
++
++    query_start() has a lot of parameters that can be used to pick up
++    parameters for a lot of other probes here.  For simplicity reasons we also
++    add the query string to most other DTrace probes as well. Hostname is
++    either the hostname or the IP address of the MySQL Client.
++  */
++  probe query__start(char *query,
++                     unsigned long conn_id,
++                     char *db_name,
++                     char *user,
++                     char *host);
++  probe query__done(int status); 
++
++  /* Fire at the start/end of SQL query parsing */
++  probe query__parse__start(char *query);
++  probe query__parse__done(int status);
++
++  /* Track whether the query hits the query cache or not */
++  probe query__cache__hit(char *query, unsigned long rows);
++  probe query__cache__miss(char *query);
++
++  /*
++    This probe fires when the actual query execution starts, i.e. after
++    parsing and checking the query cache, but before privilege checks,
++    optimizing, etc.
++
++    Query means also all independent queries of a stored procedure and prepared
++    statements. Also the stored procedure itself is a query.
++
++    exec_type is:
++    0:           Executed query from sql_parse, top-level query (sql_parse.cc)
++    1:           Executed prepared statement (sql_prepare.cc)
++    2:           Executed cursor statement (sql_cursor.cc)
++    3:           Executed query in stored procedure (sp_head.cc)
++  */
++  probe query__exec__start(char *query,
++                           unsigned long connid,
++                           char *db_name,
++                           char *user,
++                           char *host,
++                           int exec_type);
++  probe query__exec__done(int status);
++
++  /* These probes fire when performing row operations towards any handler */
++  probe insert__row__start(char *db, char *table);
++  probe insert__row__done(int status);
++  probe update__row__start(char *db, char *table);
++  probe update__row__done(int status);
++  probe delete__row__start(char *db, char *table);
++  probe delete__row__done(int status);
++  /*
++    The 'type' argument for read-row-start is 0 for table scans
++    and 1 if the record is being retrieved with rnd_pos().
++  */
++  probe read__row__start(char *db, char *table, int type);
++  probe read__row__done(int status);
++  probe index__read__row__start(char *db, char *table);
++  probe index__read__row__done(int status);
++  
++  /*
++    These probes fire when calling external_lock for any handler
++    depending on the lock type being acquired or released.
++  */
++  probe handler__rdlock__start(char *db, char *table);
++  probe handler__wrlock__start(char *db, char *table);
++  probe handler__unlock__start(char *db, char *table);
++  probe handler__rdlock__done(int status);
++  probe handler__wrlock__done(int status);
++  probe handler__unlock__done(int status);
++  
++  /*
++    These probes fire when a filesort activity happens in a query.
++  */
++  probe filesort__start(char *db, char *table);
++  probe filesort__done(int status, unsigned long rows);
++  /*
++    The query types SELECT, INSERT, INSERT AS SELECT, UPDATE, UPDATE with
++    multiple tables, DELETE, DELETE with multiple tables are all probed.
++    The start probe always contains the query text.
++  */
++  probe select__start(char *query);
++  probe select__done(int status, unsigned long rows);
++  probe insert__start(char *query);
++  probe insert__done(int status, unsigned long rows);
++  probe insert__select__start(char *query);
++  probe insert__select__done(int status, unsigned long rows);
++  probe update__start(char *query);
++  probe update__done(int status,
++                     unsigned long rowsmatches, unsigned long rowschanged);
++  probe multi__update__start(char *query);
++  probe multi__update__done(int status,
++                            unsigned long rowsmatches, 
++                            unsigned long rowschanged);
++  probe delete__start(char *query);
++  probe delete__done(int status, unsigned long rows);
++  probe multi__delete__start(char *query);
++  probe multi__delete__done(int status, unsigned long rows);
++
++  /*
++    These probes can be used to measure the time waiting for network traffic
++    or identify network-related problems.
++  */
++  probe net__read__start();
++  probe net__read__done(int status, unsigned long bytes);
++  probe net__write__start(unsigned long bytes);
++  probe net__write__done(int status);
++
++  /* MyISAM Key cache probes */
++  probe keycache__read__start(char *filepath, unsigned long  bytes,
++                              unsigned long mem_used, unsigned long mem_free);
++  probe keycache__read__block(unsigned long bytes);
++  probe keycache__read__hit();
++  probe keycache__read__miss();
++  probe keycache__read__done(unsigned long mem_used, unsigned long mem_free);
++  probe keycache__write__start(char *filepath, unsigned long bytes,
++                               unsigned long mem_used, unsigned long mem_free);
++  probe keycache__write__block(unsigned long bytes);
++  probe keycache__write__done(unsigned long mem_used, unsigned long mem_free);
++
++};
++
++#pragma D attributes Evolving/Evolving/Common provider mysql provider
++#pragma D attributes Evolving/Evolving/Common provider mysql module
++#pragma D attributes Evolving/Evolving/Common provider mysql function
++#pragma D attributes Evolving/Evolving/Common provider mysql name
++#pragma D attributes Evolving/Evolving/Common provider mysql args
+