List:Commits« Previous MessageNext Message »
From:Alexey Kopytov Date:March 27 2009 9:06am
Subject:bzr commit into mysql-6.0 branch (Alexey.Kopytov:2742) Bug#40468
View as plain text  
#At file:///Users/kaa/src/bzr/mysql-6.0-dtrace/ based on
revid:alexeyk@stripped

 2742 Alexey Kopytov	2009-03-27
      Bug #40468: Storage engines code cannot be instrumented with   
                  DTrace probes  
            
      This patch changes the way we build DTrace-enabled binary to 
      allow inserting probes into code outside of sql/, namely mysys 
      and storage engines. A few additional probes were added to test 
      the idea.  
                    
      As a side effect of this build system overhaul, DTrace-enabled 
      binary can now be built on Mac OS X. 
       
      This patch also enables DTrace support by default on those 
      platforms that have it. 
      removed:
        storage/falcon/falcon_probes.d
        storage/falcon/falcon_probes.h
      added:
        include/probes_mysql_nodtrace.h
        scripts/dheadgen.pl
        storage/falcon/probes_falcon.d
        storage/falcon/probes_falcon.h
        storage/falcon/probes_falcon_nodtrace.h
      renamed:
        sql/probes.d => sql/probes_mysql.d
        sql/probes.h => include/probes_mysql.h
      modified:
        config/ac-macros/dtrace.m4
        include/Makefile.am
        libmysql/Makefile.am
        libmysql/Makefile.shared
        libmysqld/Makefile.am
        mysys/Makefile.am
        mysys/mf_keycache.c
        scripts/Makefile.am
        sql/Makefile.am
        sql/backup/Makefile.am
        sql/backup/kernel.cc
        sql/filesort.cc
        sql/ha_ndbcluster.cc
        sql/handler.cc
        sql/mysql_priv.h
        sql/mysqld.cc
        sql/net_serv.cc
        sql/scheduler.cc
        sql/sp_head.cc
        sql/sql_cache.cc
        sql/sql_connect.cc
        sql/sql_cursor.cc
        sql/sql_delete.cc
        sql/sql_insert.cc
        sql/sql_parse.cc
        sql/sql_prepare.cc
        sql/sql_select.cc
        sql/sql_update.cc
        storage/archive/Makefile.am
        storage/archive/ha_archive.cc
        storage/blackhole/Makefile.am
        storage/blackhole/ha_blackhole.cc
        storage/csv/Makefile.am
        storage/csv/ha_tina.cc
        storage/example/Makefile.am
        storage/example/ha_example.cc
        storage/falcon/Makefile.am
        storage/falcon/ha_falcon.cpp
        storage/falcon/ha_falcon.h
        storage/federated/Makefile.am
        storage/federated/ha_federated.cc
        storage/federated/ha_federated.h
        storage/heap/Makefile.am
        storage/heap/ha_heap.cc
        storage/maria/Makefile.am
        storage/maria/ha_maria.cc
        storage/myisam/Makefile.am
        storage/myisam/ha_myisam.cc
        storage/myisammrg/Makefile.am
        storage/myisammrg/ha_myisammrg.cc
        sql/probes_mysql.d
        include/probes_mysql.h

=== modified file 'config/ac-macros/dtrace.m4'
--- a/config/ac-macros/dtrace.m4	2007-09-12 04:16:59 +0000
+++ b/config/ac-macros/dtrace.m4	2009-03-27 08:06:44 +0000
@@ -2,19 +2,42 @@ dnl ------------------------------------
 dnl Macro: DTRACE_TEST
 dnl ---------------------------------------------------------------------------
 AC_ARG_ENABLE(dtrace,
-    [  --enable-dtrace      Build with support for the DTRACE.],
-    [ 
-      AC_DEFINE([HAVE_DTRACE], [1], [Enables DTRACE Support])
-      AC_CHECK_PROGS(DTRACE, dtrace)
-      ENABLE_DTRACE="yes" 
-      AC_SUBST(DTRACEFLAGS)
-      AC_SUBST(HAVE_DTRACE)
+    AC_HELP_STRING([--enable-dtrace],[Build with support for DTrace.]),
+    [
+      ENABLE_DTRACE="$enable_dtrace"
     ],
     [
-      ENABLE_DTRACE="no" 
+      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 ---------------------------------------------------------------------------

=== modified file 'include/Makefile.am'
--- a/include/Makefile.am	2008-09-12 08:58:52 +0000
+++ b/include/Makefile.am	2009-03-27 08:06:44 +0000
@@ -38,7 +38,7 @@ noinst_HEADERS =	config-win.h config-net
 			my_vle.h my_user.h my_atomic.h atomic/nolock.h \
 			atomic/rwlock.h atomic/x86-gcc.h atomic/generic-msvc.h \
 			atomic/gcc_builtins.h my_libwrap.h my_stacktrace.h \
-			wqueue.h
+			wqueue.h probes_mysql.h probes_mysql_nodtrace.h
 
 EXTRA_DIST =        mysql.h.pp mysql/plugin.h.pp
 
@@ -66,5 +66,18 @@ my_config.h: config.h
 dist-hook:
 	$(RM) -f $(distdir)/mysql_version.h $(distdir)/my_config.h
 
+DTRACEPROVIDER = $(top_srcdir)/sql/probes_mysql.d
+
+if HAVE_DTRACE
+BUILT_SOURCES += probes_mysql_dtrace.h
+CLEANFILES += probes_mysql_dtrace.h
+
+probes_mysql_dtrace.h: $(DTRACEPROVIDER)
+	$(DTRACE) $(DTRACEFLAGS) -h -s $(DTRACEPROVIDER) -o $@
+endif
+
+probes_mysql_nodtrace.h: $(DTRACEPROVIDER)
+	$(top_srcdir)/scripts/dheadgen.pl -f $(DTRACEPROVIDER) > $@
+
 # Don't update the files from bitkeeper
 %::SCCS/s.%

=== renamed file 'sql/probes.h' => 'include/probes_mysql.h'
--- a/sql/probes.h	2008-10-10 16:23:30 +0000
+++ b/include/probes_mysql.h	2009-03-27 08:06:44 +0000
@@ -1,381 +1,13 @@
-/*
- * Generated by dtrace(1M).
- */
+#ifndef PROBES_MYSQL_H
 
-#ifndef	_PROBES_H
-#define	_PROBES_H
+#define PROBES_MYSQL_H
 
+#include <my_global.h>
 
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-#if _DTRACE_VERSION && defined(HAVE_DTRACE)
-
-#define	MYSQL_COMMAND_DONE(arg0) \
-	__dtrace_mysql___command__done(arg0)
-#define	MYSQL_COMMAND_DONE_ENABLED() \
-	__dtraceenabled_mysql___command__done()
-#define	MYSQL_COMMAND_START(arg0, arg1, arg2, arg3) \
-	__dtrace_mysql___command__start(arg0, arg1, arg2, arg3)
-#define	MYSQL_COMMAND_START_ENABLED() \
-	__dtraceenabled_mysql___command__start()
-#define	MYSQL_CONNECTION_DONE(arg0, arg1) \
-	__dtrace_mysql___connection__done(arg0, arg1)
-#define	MYSQL_CONNECTION_DONE_ENABLED() \
-	__dtraceenabled_mysql___connection__done()
-#define	MYSQL_CONNECTION_START(arg0, arg1, arg2) \
-	__dtrace_mysql___connection__start(arg0, arg1, arg2)
-#define	MYSQL_CONNECTION_START_ENABLED() \
-	__dtraceenabled_mysql___connection__start()
-#define	MYSQL_DELETE_DONE(arg0, arg1) \
-	__dtrace_mysql___delete__done(arg0, arg1)
-#define	MYSQL_DELETE_DONE_ENABLED() \
-	__dtraceenabled_mysql___delete__done()
-#define	MYSQL_DELETE_ROW_DONE(arg0) \
-	__dtrace_mysql___delete__row__done(arg0)
-#define	MYSQL_DELETE_ROW_DONE_ENABLED() \
-	__dtraceenabled_mysql___delete__row__done()
-#define	MYSQL_DELETE_ROW_START(arg0, arg1) \
-	__dtrace_mysql___delete__row__start(arg0, arg1)
-#define	MYSQL_DELETE_ROW_START_ENABLED() \
-	__dtraceenabled_mysql___delete__row__start()
-#define	MYSQL_DELETE_START(arg0) \
-	__dtrace_mysql___delete__start(arg0)
-#define	MYSQL_DELETE_START_ENABLED() \
-	__dtraceenabled_mysql___delete__start()
-#define	MYSQL_FILESORT_DONE(arg0, arg1) \
-	__dtrace_mysql___filesort__done(arg0, arg1)
-#define	MYSQL_FILESORT_DONE_ENABLED() \
-	__dtraceenabled_mysql___filesort__done()
-#define	MYSQL_FILESORT_START(arg0, arg1) \
-	__dtrace_mysql___filesort__start(arg0, arg1)
-#define	MYSQL_FILESORT_START_ENABLED() \
-	__dtraceenabled_mysql___filesort__start()
-#define	MYSQL_HANDLER_RDLOCK_DONE(arg0) \
-	__dtrace_mysql___handler__rdlock__done(arg0)
-#define	MYSQL_HANDLER_RDLOCK_DONE_ENABLED() \
-	__dtraceenabled_mysql___handler__rdlock__done()
-#define	MYSQL_HANDLER_RDLOCK_START(arg0, arg1) \
-	__dtrace_mysql___handler__rdlock__start(arg0, arg1)
-#define	MYSQL_HANDLER_RDLOCK_START_ENABLED() \
-	__dtraceenabled_mysql___handler__rdlock__start()
-#define	MYSQL_HANDLER_UNLOCK_DONE(arg0) \
-	__dtrace_mysql___handler__unlock__done(arg0)
-#define	MYSQL_HANDLER_UNLOCK_DONE_ENABLED() \
-	__dtraceenabled_mysql___handler__unlock__done()
-#define	MYSQL_HANDLER_UNLOCK_START(arg0, arg1) \
-	__dtrace_mysql___handler__unlock__start(arg0, arg1)
-#define	MYSQL_HANDLER_UNLOCK_START_ENABLED() \
-	__dtraceenabled_mysql___handler__unlock__start()
-#define	MYSQL_HANDLER_WRLOCK_DONE(arg0) \
-	__dtrace_mysql___handler__wrlock__done(arg0)
-#define	MYSQL_HANDLER_WRLOCK_DONE_ENABLED() \
-	__dtraceenabled_mysql___handler__wrlock__done()
-#define	MYSQL_HANDLER_WRLOCK_START(arg0, arg1) \
-	__dtrace_mysql___handler__wrlock__start(arg0, arg1)
-#define	MYSQL_HANDLER_WRLOCK_START_ENABLED() \
-	__dtraceenabled_mysql___handler__wrlock__start()
-#define	MYSQL_INSERT_DONE(arg0, arg1) \
-	__dtrace_mysql___insert__done(arg0, arg1)
-#define	MYSQL_INSERT_DONE_ENABLED() \
-	__dtraceenabled_mysql___insert__done()
-#define	MYSQL_INSERT_ROW_DONE(arg0) \
-	__dtrace_mysql___insert__row__done(arg0)
-#define	MYSQL_INSERT_ROW_DONE_ENABLED() \
-	__dtraceenabled_mysql___insert__row__done()
-#define	MYSQL_INSERT_ROW_START(arg0, arg1) \
-	__dtrace_mysql___insert__row__start(arg0, arg1)
-#define	MYSQL_INSERT_ROW_START_ENABLED() \
-	__dtraceenabled_mysql___insert__row__start()
-#define	MYSQL_INSERT_SELECT_DONE(arg0, arg1) \
-	__dtrace_mysql___insert__select__done(arg0, arg1)
-#define	MYSQL_INSERT_SELECT_DONE_ENABLED() \
-	__dtraceenabled_mysql___insert__select__done()
-#define	MYSQL_INSERT_SELECT_START(arg0) \
-	__dtrace_mysql___insert__select__start(arg0)
-#define	MYSQL_INSERT_SELECT_START_ENABLED() \
-	__dtraceenabled_mysql___insert__select__start()
-#define	MYSQL_INSERT_START(arg0) \
-	__dtrace_mysql___insert__start(arg0)
-#define	MYSQL_INSERT_START_ENABLED() \
-	__dtraceenabled_mysql___insert__start()
-#define	MYSQL_MULTI_DELETE_DONE(arg0, arg1) \
-	__dtrace_mysql___multi__delete__done(arg0, arg1)
-#define	MYSQL_MULTI_DELETE_DONE_ENABLED() \
-	__dtraceenabled_mysql___multi__delete__done()
-#define	MYSQL_MULTI_DELETE_START(arg0) \
-	__dtrace_mysql___multi__delete__start(arg0)
-#define	MYSQL_MULTI_DELETE_START_ENABLED() \
-	__dtraceenabled_mysql___multi__delete__start()
-#define	MYSQL_MULTI_UPDATE_DONE(arg0, arg1, arg2) \
-	__dtrace_mysql___multi__update__done(arg0, arg1, arg2)
-#define	MYSQL_MULTI_UPDATE_DONE_ENABLED() \
-	__dtraceenabled_mysql___multi__update__done()
-#define	MYSQL_MULTI_UPDATE_START(arg0) \
-	__dtrace_mysql___multi__update__start(arg0)
-#define	MYSQL_MULTI_UPDATE_START_ENABLED() \
-	__dtraceenabled_mysql___multi__update__start()
-#define	MYSQL_NET_READ_DONE(arg0, arg1) \
-	__dtrace_mysql___net__read__done(arg0, arg1)
-#define	MYSQL_NET_READ_DONE_ENABLED() \
-	__dtraceenabled_mysql___net__read__done()
-#define	MYSQL_NET_READ_START() \
-	__dtrace_mysql___net__read__start()
-#define	MYSQL_NET_READ_START_ENABLED() \
-	__dtraceenabled_mysql___net__read__start()
-#define	MYSQL_NET_WRITE_DONE(arg0) \
-	__dtrace_mysql___net__write__done(arg0)
-#define	MYSQL_NET_WRITE_DONE_ENABLED() \
-	__dtraceenabled_mysql___net__write__done()
-#define	MYSQL_NET_WRITE_START(arg0) \
-	__dtrace_mysql___net__write__start(arg0)
-#define	MYSQL_NET_WRITE_START_ENABLED() \
-	__dtraceenabled_mysql___net__write__start()
-#define	MYSQL_QUERY_CACHE_HIT(arg0, arg1) \
-	__dtrace_mysql___query__cache__hit(arg0, arg1)
-#define	MYSQL_QUERY_CACHE_HIT_ENABLED() \
-	__dtraceenabled_mysql___query__cache__hit()
-#define	MYSQL_QUERY_CACHE_MISS(arg0) \
-	__dtrace_mysql___query__cache__miss(arg0)
-#define	MYSQL_QUERY_CACHE_MISS_ENABLED() \
-	__dtraceenabled_mysql___query__cache__miss()
-#define	MYSQL_QUERY_DONE(arg0) \
-	__dtrace_mysql___query__done(arg0)
-#define	MYSQL_QUERY_DONE_ENABLED() \
-	__dtraceenabled_mysql___query__done()
-#define	MYSQL_QUERY_EXEC_DONE(arg0) \
-	__dtrace_mysql___query__exec__done(arg0)
-#define	MYSQL_QUERY_EXEC_DONE_ENABLED() \
-	__dtraceenabled_mysql___query__exec__done()
-#define	MYSQL_QUERY_EXEC_START(arg0, arg1, arg2, arg3, arg4, arg5) \
-	__dtrace_mysql___query__exec__start(arg0, arg1, arg2, arg3, arg4, arg5)
-#define	MYSQL_QUERY_EXEC_START_ENABLED() \
-	__dtraceenabled_mysql___query__exec__start()
-#define	MYSQL_QUERY_PARSE_DONE(arg0) \
-	__dtrace_mysql___query__parse__done(arg0)
-#define	MYSQL_QUERY_PARSE_DONE_ENABLED() \
-	__dtraceenabled_mysql___query__parse__done()
-#define	MYSQL_QUERY_PARSE_START(arg0) \
-	__dtrace_mysql___query__parse__start(arg0)
-#define	MYSQL_QUERY_PARSE_START_ENABLED() \
-	__dtraceenabled_mysql___query__parse__start()
-#define	MYSQL_QUERY_START(arg0, arg1, arg2, arg3, arg4) \
-	__dtrace_mysql___query__start(arg0, arg1, arg2, arg3, arg4)
-#define	MYSQL_QUERY_START_ENABLED() \
-	__dtraceenabled_mysql___query__start()
-#define	MYSQL_SELECT_DONE(arg0, arg1) \
-	__dtrace_mysql___select__done(arg0, arg1)
-#define	MYSQL_SELECT_DONE_ENABLED() \
-	__dtraceenabled_mysql___select__done()
-#define	MYSQL_SELECT_START(arg0) \
-	__dtrace_mysql___select__start(arg0)
-#define	MYSQL_SELECT_START_ENABLED() \
-	__dtraceenabled_mysql___select__start()
-#define	MYSQL_UPDATE_DONE(arg0, arg1, arg2) \
-	__dtrace_mysql___update__done(arg0, arg1, arg2)
-#define	MYSQL_UPDATE_DONE_ENABLED() \
-	__dtraceenabled_mysql___update__done()
-#define	MYSQL_UPDATE_ROW_DONE(arg0) \
-	__dtrace_mysql___update__row__done(arg0)
-#define	MYSQL_UPDATE_ROW_DONE_ENABLED() \
-	__dtraceenabled_mysql___update__row__done()
-#define	MYSQL_UPDATE_ROW_START(arg0, arg1) \
-	__dtrace_mysql___update__row__start(arg0, arg1)
-#define	MYSQL_UPDATE_ROW_START_ENABLED() \
-	__dtraceenabled_mysql___update__row__start()
-#define	MYSQL_UPDATE_START(arg0) \
-	__dtrace_mysql___update__start(arg0)
-#define	MYSQL_UPDATE_START_ENABLED() \
-	__dtraceenabled_mysql___update__start()
-
-
-extern void __dtrace_mysql___command__done(int);
-extern int __dtraceenabled_mysql___command__done(void);
-extern void __dtrace_mysql___command__start(unsigned long, int, char *, char *);
-extern int __dtraceenabled_mysql___command__start(void);
-extern void __dtrace_mysql___connection__done(int, unsigned long);
-extern int __dtraceenabled_mysql___connection__done(void);
-extern void __dtrace_mysql___connection__start(unsigned long, char *, char *);
-extern int __dtraceenabled_mysql___connection__start(void);
-extern void __dtrace_mysql___delete__done(int, unsigned long);
-extern int __dtraceenabled_mysql___delete__done(void);
-extern void __dtrace_mysql___delete__row__done(int);
-extern int __dtraceenabled_mysql___delete__row__done(void);
-extern void __dtrace_mysql___delete__row__start(char *, char *);
-extern int __dtraceenabled_mysql___delete__row__start(void);
-extern void __dtrace_mysql___delete__start(char *);
-extern int __dtraceenabled_mysql___delete__start(void);
-extern void __dtrace_mysql___filesort__done(int, unsigned long);
-extern int __dtraceenabled_mysql___filesort__done(void);
-extern void __dtrace_mysql___filesort__start(char *, char *);
-extern int __dtraceenabled_mysql___filesort__start(void);
-extern void __dtrace_mysql___handler__rdlock__done(int);
-extern int __dtraceenabled_mysql___handler__rdlock__done(void);
-extern void __dtrace_mysql___handler__rdlock__start(char *, char *);
-extern int __dtraceenabled_mysql___handler__rdlock__start(void);
-extern void __dtrace_mysql___handler__unlock__done(int);
-extern int __dtraceenabled_mysql___handler__unlock__done(void);
-extern void __dtrace_mysql___handler__unlock__start(char *, char *);
-extern int __dtraceenabled_mysql___handler__unlock__start(void);
-extern void __dtrace_mysql___handler__wrlock__done(int);
-extern int __dtraceenabled_mysql___handler__wrlock__done(void);
-extern void __dtrace_mysql___handler__wrlock__start(char *, char *);
-extern int __dtraceenabled_mysql___handler__wrlock__start(void);
-extern void __dtrace_mysql___insert__done(int, unsigned long);
-extern int __dtraceenabled_mysql___insert__done(void);
-extern void __dtrace_mysql___insert__row__done(int);
-extern int __dtraceenabled_mysql___insert__row__done(void);
-extern void __dtrace_mysql___insert__row__start(char *, char *);
-extern int __dtraceenabled_mysql___insert__row__start(void);
-extern void __dtrace_mysql___insert__select__done(int, unsigned long);
-extern int __dtraceenabled_mysql___insert__select__done(void);
-extern void __dtrace_mysql___insert__select__start(char *);
-extern int __dtraceenabled_mysql___insert__select__start(void);
-extern void __dtrace_mysql___insert__start(char *);
-extern int __dtraceenabled_mysql___insert__start(void);
-extern void __dtrace_mysql___multi__delete__done(int, unsigned long);
-extern int __dtraceenabled_mysql___multi__delete__done(void);
-extern void __dtrace_mysql___multi__delete__start(char *);
-extern int __dtraceenabled_mysql___multi__delete__start(void);
-extern void __dtrace_mysql___multi__update__done(int, unsigned long, unsigned long);
-extern int __dtraceenabled_mysql___multi__update__done(void);
-extern void __dtrace_mysql___multi__update__start(char *);
-extern int __dtraceenabled_mysql___multi__update__start(void);
-extern void __dtrace_mysql___net__read__done(int, unsigned long);
-extern int __dtraceenabled_mysql___net__read__done(void);
-extern void __dtrace_mysql___net__read__start(void);
-extern int __dtraceenabled_mysql___net__read__start(void);
-extern void __dtrace_mysql___net__write__done(int);
-extern int __dtraceenabled_mysql___net__write__done(void);
-extern void __dtrace_mysql___net__write__start(unsigned long);
-extern int __dtraceenabled_mysql___net__write__start(void);
-extern void __dtrace_mysql___query__cache__hit(char *, unsigned long);
-extern int __dtraceenabled_mysql___query__cache__hit(void);
-extern void __dtrace_mysql___query__cache__miss(char *);
-extern int __dtraceenabled_mysql___query__cache__miss(void);
-extern void __dtrace_mysql___query__done(int);
-extern int __dtraceenabled_mysql___query__done(void);
-extern void __dtrace_mysql___query__exec__done(int);
-extern int __dtraceenabled_mysql___query__exec__done(void);
-extern void __dtrace_mysql___query__exec__start(char *, unsigned long, char *, char *,
char *, int);
-extern int __dtraceenabled_mysql___query__exec__start(void);
-extern void __dtrace_mysql___query__parse__done(int);
-extern int __dtraceenabled_mysql___query__parse__done(void);
-extern void __dtrace_mysql___query__parse__start(char *);
-extern int __dtraceenabled_mysql___query__parse__start(void);
-extern void __dtrace_mysql___query__start(char *, unsigned long, char *, char *, char *);
-extern int __dtraceenabled_mysql___query__start(void);
-extern void __dtrace_mysql___select__done(int, unsigned long);
-extern int __dtraceenabled_mysql___select__done(void);
-extern void __dtrace_mysql___select__start(char *);
-extern int __dtraceenabled_mysql___select__start(void);
-extern void __dtrace_mysql___update__done(int, unsigned long, unsigned long);
-extern int __dtraceenabled_mysql___update__done(void);
-extern void __dtrace_mysql___update__row__done(int);
-extern int __dtraceenabled_mysql___update__row__done(void);
-extern void __dtrace_mysql___update__row__start(char *, char *);
-extern int __dtraceenabled_mysql___update__row__start(void);
-extern void __dtrace_mysql___update__start(char *);
-extern int __dtraceenabled_mysql___update__start(void);
-
+#if defined(HAVE_DTRACE) && !defined(DISABLE_DTRACE)
+#include "probes_mysql_dtrace.h"
 #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_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_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_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
-}
+#include "probes_mysql_nodtrace.h"
 #endif
 
-#endif	/* _PROBES_H */
+#endif /* PROBES_MYSQL_H */

=== added file 'include/probes_mysql_nodtrace.h'
--- a/include/probes_mysql_nodtrace.h	1970-01-01 00:00:00 +0000
+++ b/include/probes_mysql_nodtrace.h	2009-03-27 08:06:44 +0000
@@ -0,0 +1,137 @@
+/*
+ * 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)
+#define	MYSQL_BACKUP_START()
+#define	MYSQL_BACKUP_START_ENABLED() (0)
+#define	MYSQL_BACKUP_DONE(arg0)
+#define	MYSQL_BACKUP_DONE_ENABLED() (0)
+#define	MYSQL_RESTORE_START()
+#define	MYSQL_RESTORE_START_ENABLED() (0)
+#define	MYSQL_RESTORE_DONE(arg0)
+#define	MYSQL_RESTORE_DONE_ENABLED() (0)
+
+#ifdef  __cplusplus
+}
+#endif
+
+#endif  /* _PROBES_MYSQL_D */

=== modified file 'libmysql/Makefile.am'
--- a/libmysql/Makefile.am	2008-10-10 16:23:30 +0000
+++ b/libmysql/Makefile.am	2009-03-27 08:06:44 +0000
@@ -67,8 +67,6 @@ link_sources:
 	  done; \
 	  rm -f net.c; \
 	  @LN_CP_F@ $(top_srcdir)/sql/net_serv.cc net.c ; \
-	  rm -f probes.h; \
-	  @LN_CP_F@ $(top_srcdir)/sql/probes.h probes.h
 	  rm -f password.c; \
 	  @LN_CP_F@ $(top_srcdir)/sql/password.c password.c
 	  echo timestamp > link_sources

=== modified file 'libmysql/Makefile.shared'
--- a/libmysql/Makefile.shared	2008-10-02 12:08:09 +0000
+++ b/libmysql/Makefile.shared	2009-03-27 08:06:44 +0000
@@ -89,7 +89,8 @@ DEFS =			-DDEFAULT_CHARSET_HOME="\"$(MYS
 			-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 \
@@ -107,7 +108,7 @@ clean-local:
 	      `echo $(sql_cmn_objects) | sed "s;\.lo;.c;g"` \
 	       $(CHARSET_SRCS) $(CHARSET_OBJS) \
 	       $(mystringsextra) $(mysysheaders) $(vioheaders) \
-               net.c probes.h
+               net.c
 
 conf_to_src_SOURCES = conf_to_src.c
 conf_to_src_LDADD=

=== modified file 'libmysqld/Makefile.am'
--- a/libmysqld/Makefile.am	2008-09-23 14:33:18 +0000
+++ b/libmysqld/Makefile.am	2009-03-27 08:06:44 +0000
@@ -30,7 +30,8 @@ DEFS =			-DEMBEDDED_LIBRARY -DMYSQL_SERV
 			-DSHAREDIR="\"$(MYSQLSHAREdir)\"" \
 			@DEFS@ \
 			-DLIBDIR="\"$(MYSQLLIBdir)\"" \
-			-DPLUGINDIR="\"$(pkgplugindir)\""
+			-DPLUGINDIR="\"$(pkgplugindir)\"" \
+			-DDISABLE_DTRACE
 INCLUDES=		-I$(top_builddir)/include -I$(top_srcdir)/include \
 			-I$(top_builddir)/sql -I$(top_srcdir)/sql \
 			-I$(top_srcdir)/sql/examples \

=== modified file 'mysys/Makefile.am'
--- a/mysys/Makefile.am	2008-07-23 08:52:08 +0000
+++ b/mysys/Makefile.am	2009-03-27 08:06:44 +0000
@@ -130,6 +130,21 @@ test_base64$(EXEEXT): base64.c $(LIBRARI
 	$(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.%

=== modified file 'mysys/mf_keycache.c'
--- a/mysys/mf_keycache.c	2008-08-20 10:29:58 +0000
+++ b/mysys/mf_keycache.c	2009-03-27 08:06:44 +0000
@@ -112,6 +112,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
@@ -2570,6 +2571,14 @@ uchar *key_cache_read(KEY_CACHE *keycach
     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
@@ -2619,6 +2628,9 @@ uchar *key_cache_read(KEY_CACHE *keycach
 
       /* 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)
       {
@@ -2638,6 +2650,7 @@ uchar *key_cache_read(KEY_CACHE *keycach
       {
         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,
@@ -2662,6 +2675,10 @@ uchar *key_cache_read(KEY_CACHE *keycach
           my_errno= -1;
           block->status|= BLOCK_ERROR;
         }
+        else
+        {
+          MYSQL_KEYCACHE_READ_HIT();
+        }
       }
 
       /* block status may have added BLOCK_ERROR in the above 'if'. */
@@ -2706,7 +2723,16 @@ uchar *key_cache_read(KEY_CACHE *keycach
 #ifndef THREAD
       /* This is only true if we where able to read everything in one block */
       if (return_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;
@@ -2714,6 +2740,13 @@ uchar *key_cache_read(KEY_CACHE *keycach
       offset= 0;
 
     } 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;
   }
 
@@ -3047,6 +3080,15 @@ int key_cache_write(KEY_CACHE *keycache,
     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
@@ -3082,6 +3124,8 @@ int key_cache_write(KEY_CACHE *keycache,
       /* 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. */
@@ -3289,6 +3333,15 @@ end:
     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););

=== modified file 'scripts/Makefile.am'
--- a/scripts/Makefile.am	2008-06-26 17:48:42 +0000
+++ b/scripts/Makefile.am	2009-03-27 08:06:44 +0000
@@ -37,7 +37,8 @@ bin_SCRIPTS =		@server_scripts@ \
 			mysqld_multi
 
 noinst_SCRIPTS =	make_binary_distribution \
-			make_sharedlib_distribution
+			make_sharedlib_distribution \
+			dheadgen.pl
 
 EXTRA_SCRIPTS =		make_binary_distribution.sh \
 			make_sharedlib_distribution.sh \
@@ -59,7 +60,8 @@ EXTRA_SCRIPTS =		make_binary_distributio
 			mysqlhotcopy.sh \
 			mysqldumpslow.sh \
 			mysqld_multi.sh \
-			mysqld_safe.sh
+			mysqld_safe.sh \
+			dheadgen.pl
 
 EXTRA_DIST =		$(EXTRA_SCRIPTS) \
 			mysqlaccess.conf \
@@ -111,7 +113,7 @@ mysqlbug: ${top_builddir}/config.status 
 mysql_fix_privilege_tables.sql: mysql_system_tables.sql \
 				mysql_system_tables_fix.sql
 	@echo "Building $@";
-	@cat mysql_system_tables.sql mysql_system_tables_fix.sql > $@
+	@cat $(srcdir)/mysql_system_tables.sql $(srcdir)/mysql_system_tables_fix.sql > $@
 
 #
 # Build mysql_fix_privilege_tables_sql.c from
@@ -124,7 +126,7 @@ mysql_fix_privilege_tables_sql.c: comp_s
 	sleep 2
 	$(top_builddir)/scripts/comp_sql$(EXEEXT) \
 	  mysql_fix_privilege_tables \
-	    $(top_srcdir)/scripts/mysql_fix_privilege_tables.sql $@
+	    $(top_builddir)/scripts/mysql_fix_privilege_tables.sql $@
 
 
 SUFFIXES = .sh

=== added file 'scripts/dheadgen.pl'
--- a/scripts/dheadgen.pl	1970-01-01 00:00:00 +0000
+++ b/scripts/dheadgen.pl	2009-03-27 08:06:44 +0000
@@ -0,0 +1,338 @@
+#!/usr/bin/perl -w
+
+#
+# Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+# 
+#    * Redistributions of source code must retain the above copyright
+#      notice, this list of conditions and the following disclaimer. 
+#    * Redistributions in binary form must reproduce the above copyright
+#      notice, this list of conditions and the following disclaimer in  
+#      the documentation and/or other materials provided with the       
+#      distribution.
+#    * Neither the name of the above-listed copyright holders nor the names
+#      of its contributors may be used to endorse or promote products derived
+#      from this software without specific prior written permission.  
+#       
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED  
+# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+# OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,     
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR      
+# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  
+# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING    
+# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS      
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# ident	"@(#)dheadgen.pl	1.4	07/06/24 SMI"
+
+#
+# DTrace Header Generator
+# -----------------------
+#
+# This script is meant to mimic the output of dtrace(1M) with the -h
+# (headergen) flag on system that lack native support for DTrace. This script
+# is intended to be integrated into projects that use DTrace's static tracing
+# facilities (USDT), and invoked as part of the build process to have a
+# common build process on all target systems. To facilitate this, this script
+# is licensed under a BSD license. On system with native DTrace support, the
+# dtrace(1M) command will be invoked to create the full header file; on other
+# systems, this script will generated a stub header file.
+#
+# Normally, generated macros take the form PROVIDER_PROBENAME().  It may be
+# desirable to customize the output of this script and of dtrace(1M) to
+# tailor the precise macro name. To do this, edit the emit_dtrace() subroutine
+# to pattern match for the lines you want to customize.
+#
+
+use strict;
+
+my @lines;
+my @tokens = ();
+my $lineno = 0;
+my $newline = 1;
+my $eof = 0;
+my $infile;
+my $outfile;
+my $force = 0;
+
+sub emit_dtrace {
+	my ($line) = @_;
+
+	#
+	# Insert customization here. For example, if you want to change the
+	# name of the macros you may do something like this:
+	#
+	# $line =~ s/(\s)[A-Z]+_/\1TRACE_MOZILLA_/;
+	#
+
+	print $line;
+}
+
+#
+# The remaining code deals with parsing D provider definitions and emitting
+# the stub header file. There should be no need to edit this absent a bug.
+#
+
+#
+# Emit the two relevant macros for each probe in the given provider:
+#    PROVIDER_PROBENAME(<args>)
+#    PROVIDER_PROBENAME_ENABLED() (0)
+#
+sub emit_provider {
+	my ($provname, @probes) = @_;
+
+	$provname = uc($provname);
+
+	foreach my $probe (@probes) {
+		my $probename = uc($$probe{'name'});
+		my $argc = $$probe{'argc'};
+		my $line;
+
+		$probename =~ s/__/_/g;
+
+		$line = "#define\t${provname}_${probename}(";
+		for (my $i = 0; $i < $argc; $i++) {
+			$line .= ($i == 0 ? '' : ', ');
+			$line .= "arg$i";
+		}
+		$line .= ")\n";
+		emit_dtrace($line);
+		
+		$line = "#define\t${provname}_${probename}_ENABLED() (0)\n";
+		emit_dtrace($line);
+	}
+
+	emit_dtrace("\n");
+}
+
+sub emit_prologue {
+	my ($filename) = @_;
+
+	$filename =~ s/.*\///g;
+	$filename = uc($filename);
+	$filename =~ s/\./_/g;
+
+	emit_dtrace <<"EOF";
+/*
+ * Generated by dheadgen(1).
+ */
+
+#ifndef\t_${filename}
+#define\t_${filename}
+
+#ifdef\t__cplusplus
+extern "C" {
+#endif
+
+EOF
+}
+
+sub emit_epilogue {
+	my ($filename) = @_;
+
+	$filename =~ s/.*\///g;
+	$filename = uc($filename);
+	$filename =~ s/\./_/g;
+
+	emit_dtrace <<"EOF";
+#ifdef  __cplusplus
+}
+#endif
+
+#endif  /* _$filename */
+EOF
+}
+
+#
+# Get the next token from the file keeping track of the line number.
+#
+sub get_token {
+	my ($eof_ok) = @_;
+	my $tok;
+
+	while (1) {
+		while (scalar(@tokens) == 0) {
+			if (scalar(@lines) == 0) {
+				$eof = 1;
+				return if ($eof_ok);
+				die "expected more data at line $lineno";
+			}
+
+			$lineno++;
+			push(@tokens, split(/(\s+|\n|[(){},#;]|\/\*|\*\/)/,
+			    shift(@lines)));
+		}
+
+		$tok = shift(@tokens);
+		next if ($tok eq '');
+		next if ($tok =~ /^[ \t]+$/);
+
+		return ($tok);
+	}
+}
+
+#
+# Ignore newlines, comments and typedefs
+#
+sub next_token {
+	my ($eof_ok) = @_;
+	my $tok;
+
+	while (1) {
+		$tok = get_token($eof_ok);
+		return if ($eof_ok && $eof);
+		if ($tok eq "typedef" or $tok =~ /^#/) {
+		  while (1) {
+		    $tok = get_token(0);
+		    last if ($tok eq "\n");
+		  }
+		  next;
+		} elsif ($tok eq '/*') {
+			while (get_token(0) ne '*/') {
+				next;
+			}
+			next;
+		} elsif ($tok eq "\n") {
+			next;
+		}
+
+		last;
+	}
+
+	return ($tok);
+}
+
+sub expect_token {
+	my ($t) = @_;
+	my $tok;
+
+	while (($tok = next_token(0)) eq "\n") {
+		next;
+	}
+
+	die "expected '$t' at line $lineno rather than '$tok'" if ($t ne $tok);
+}
+
+sub get_args {
+	expect_token('(');
+
+	my $tok = next_token(0);
+	my @args = ();
+
+	return (@args) if ($tok eq ')');
+
+	if ($tok eq 'void') {
+		expect_token(')');
+		return (@args);
+	}
+
+	my $arg = $tok;
+
+	while (1) {
+		$tok = next_token(0);
+		if ($tok eq ',' || $tok eq ')') {
+			push(@args, $arg);
+			$arg = '';
+			last if ($tok eq ')');
+		} else {
+			$arg = "$arg $tok";
+		}
+	}
+
+	return (@args);
+}
+
+sub usage {
+	die "usage: $0 [-f] <filename.d>\n";
+}
+
+usage() if (scalar(@ARGV) < 1);
+if ($ARGV[0] eq '-f') {
+	usage() if (scalar(@ARGV < 2));
+	$force = 1;
+	shift;
+}
+$infile = $ARGV[0];
+usage() if ($infile !~ /(.+)\.d$/);
+
+#
+# If the system has native support for DTrace, we'll use that binary instead.
+#
+if (-x '/usr/sbin/dtrace' && !$force) {
+	open(my $dt, '-|', "/usr/sbin/dtrace -C -h -s $infile -o /dev/stdout")
+	    or die "can't invoke dtrace(1M)";
+
+	while (<$dt>) {
+		emit_dtrace($_);
+	}
+
+	close($dt);
+
+	exit(0);
+}
+
+emit_prologue($infile);
+
+open(my $d, '<', $infile) or die "couldn't open $infile";
+@lines = <$d>;
+close($d);
+
+while (1) {
+	my $nl = 0;
+	my $tok = next_token(1);
+	last if $eof;
+
+	if ($newline && $tok eq '#') {
+		while (1) {
+			$tok = get_token(0);
+
+			last if ($tok eq "\n");
+		}
+		$nl = 1;
+	} elsif ($tok eq "\n") {
+		$nl = 1;
+	} elsif ($tok eq 'provider') {
+		my $provname = next_token(0);
+		my @probes = ();
+		expect_token('{');
+
+		while (1) {
+			$tok = next_token(0);
+			if ($tok eq 'probe') {
+				my $probename = next_token(0);
+				my @args = get_args();
+
+				next while (next_token(0) ne ';');
+
+				push(@probes, {
+				    'name' => $probename,
+				    'argc' => scalar(@args)
+				});
+
+			} elsif ($tok eq '}') {
+				expect_token(';');
+
+				emit_provider($provname, @probes);
+
+				last;
+			}
+		}
+
+	} else {
+		die "syntax error at line $lineno near '$tok'\n";
+	}
+
+	$newline = $nl;
+}
+
+emit_epilogue($infile);
+
+exit(0);

=== modified file 'sql/Makefile.am'
--- a/sql/Makefile.am	2008-10-10 16:23:30 +0000
+++ b/sql/Makefile.am	2009-03-27 08:06:44 +0000
@@ -29,23 +29,39 @@ SUBDIRS =		share backup
 libexec_PROGRAMS =	mysqld
 EXTRA_PROGRAMS =	gen_lex_hash
 bin_PROGRAMS =		mysql_tzinfo_to_sql
-DTRACE =                @DTRACE@
-DTRACEFLAGS =           @DTRACEFLAGS@
-DTRACEFILES =           filesort.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
+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
+
+DTRACEFILES_DEPEND = 		filesort.o \
+				libndb_la-ha_ndbcluster.lo \
+				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
@@ -96,7 +112,7 @@ noinst_HEADERS =	item.h item_func.h item
 			sql_plugin.h authors.h event_parse_data.h \
 			event_data_objects.h event_scheduler.h \
 			sql_partition.h partition_info.h partition_element.h \
-			probes.h sql_audit.h transaction.h \
+			sql_audit.h transaction.h \
 			contributors.h sql_servers.h ddl_blocker.h \
 			si_objects.h si_logs.h sql_plist.h mdl.h records.h \
 			rpl_handler.h replication.h
@@ -149,10 +165,6 @@ mysqld_SOURCES =	sql_lex.cc sql_handler.
 			event_parse_data.cc mdl.cc transaction.cc \
 			rpl_handler.cc
 
-if HAVE_DTRACE
-  mysqld_SOURCES += probes.d
-endif
-
 nodist_mysqld_SOURCES =	mini_client_errors.c pack.c client.c my_time.c my_user.c 
 
 libndb_la_CPPFLAGS=	@ndbcluster_includes@
@@ -179,7 +191,7 @@ BUILT_MAINT_SRC =	sql_yacc.cc sql_yacc.h
 BUILT_SOURCES =		$(BUILT_MAINT_SRC) lex_hash.h link_sources
 EXTRA_DIST =		udf_example.c udf_example.def $(BUILT_MAINT_SRC) \
 			nt_servc.cc nt_servc.h message.mc CMakeLists.txt \
-			probes.d \
+			probes_mysql.d \
 			udf_example.c udf_example.def
 CLEANFILES =        	lex_hash.h sql_yacc.output link_sources
 DISTCLEANFILES =        $(EXTRA_PROGRAMS)
@@ -212,12 +224,6 @@ lex_hash.h:	gen_lex_hash.cc lex.h
 udf_example_la_SOURCES= udf_example.c
 udf_example_la_LDFLAGS= -module -rpath $(pkglibdir)
 
-probes.h: probes.d
-	$(DTRACE) $(DTRACEFLAGS) -h -s probes.d
-	mv probes.h probes.h.bak
-	sed "s/#include <unistd.h>//g" probes.h.bak > probes.h
-	rm probes.h.bak
-
 # We might have some stuff not built in this build, but that we want to install
 install-exec-hook:
 	$(mkinstalldirs) $(DESTDIR)$(libexecdir) $(DESTDIR)$(pkglibdir)
@@ -225,12 +231,37 @@ install-exec-hook:
 	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)
 
-SUFFIXES : .d
-
-.d.o :
-	$(DTRACE) $(DTRACEFLAGS) -G -s $< $(DTRACEFILES)
-
-probes.o : $(DTRACEFILES)
+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
+
+probes_all.o: probes_mysql.d $(DTRACEFILES_DEPEND)
+	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 $@
+
+# Can't depend directly on .libs/*.o, because there is no generated rule for
+# that in the Makefile; it is a byproduct of *.lo
+probes_libndb.o: probes_mysql.d libndb_la-ha_ndbcluster.lo
+	if test -f .libs/libndb_la-ha_ndbcluster.o ; then \
+		$(DTRACE) $(DTRACEFLAGS) -G -s probes_mysql.d .libs/libndb_la-ha_ndbcluster.o -o $@; \
+	fi; \
+	if test -f libndb_la-ha_ndbcluster.o ; then \
+		$(DTRACE) $(DTRACEFLAGS) -G -s probes_mysql.d libndb_la-ha_ndbcluster.o -o $@; \
+	fi
+endif
 
 # Don't update the files from bitkeeper
 %::SCCS/s.%

=== modified file 'sql/backup/Makefile.am'
--- a/sql/backup/Makefile.am	2008-08-27 17:30:49 +0000
+++ b/sql/backup/Makefile.am	2009-03-27 08:06:44 +0000
@@ -79,6 +79,24 @@ DEFS = \
   @DEFS@
 
 EXTRA_DIST =	CMakeLists.txt 
-	
+
+if HAVE_DTRACE_DASH_G
+abs_top_srcdir = @abs_top_srcdir@
+CLEANFILES = probes_mysql.o dtrace_files dtrace_providers
+DTRACEFILES = .libs/kernel.o
+DTRACEPROVIDER = $(abs_top_srcdir)/sql/probes_mysql.d
+libbackup_la_LIBADD += probes_mysql.o
+# libbackupstream.la has to be added to dependencies explicitly
+libbackup_la_DEPENDENCIES = libbackupstream.la probes_mysql.o dtrace_files
dtrace_providers
+
+dtrace_files:
+	echo $(DTRACEFILES) >$@
+dtrace_providers:
+	echo $(DTRACEPROVIDER) >$@
+probes_mysql.o: $(DTRACEPROVIDER) $(DTRACEFILES)
+	$(DTRACE) $(DTRACEFLAGS) -G -s $(DTRACEPROVIDER) $(DTRACEFILES) -o $@
+
+endif
+
 # Don't update the files from bitkeeper
 %::SCCS/s.%

=== modified file 'sql/backup/kernel.cc'
--- a/sql/backup/kernel.cc	2008-10-09 13:07:54 +0000
+++ b/sql/backup/kernel.cc	2009-03-27 08:06:44 +0000
@@ -84,6 +84,7 @@
 #include "be_nodata.h"
 #include "ddl_blocker.h"
 #include "transaction.h"
+#include "probes_mysql.h"
 
 
 /** 
@@ -203,8 +204,12 @@ execute_backup_command(THD *thd, LEX *le
 
     // perform backup
 
+    MYSQL_BACKUP_START();
+    
     res= context.do_backup();
- 
+
+    MYSQL_BACKUP_DONE(res);
+    
     if (res)
       DBUG_RETURN(send_error(context, ER_BACKUP_BACKUP));
 
@@ -221,7 +226,11 @@ execute_backup_command(THD *thd, LEX *le
     
     DEBUG_SYNC(thd, "after_backup_start_restore");
 
-    res= context.do_restore();      
+    MYSQL_RESTORE_START();
+    
+    res= context.do_restore();
+
+    MYSQL_RESTORE_DONE(res);
 
     DEBUG_SYNC(thd, "restore_before_end");
 

=== modified file 'sql/filesort.cc'
--- a/sql/filesort.cc	2008-10-10 16:23:30 +0000
+++ b/sql/filesort.cc	2009-03-27 08:06:44 +0000
@@ -27,6 +27,7 @@
 #endif
 #include <m_ctype.h>
 #include "sql_sort.h"
+#include "probes_mysql.h"
 
 #ifndef THREAD
 #define SKIP_DBUG_IN_FILESORT

=== modified file 'sql/ha_ndbcluster.cc'
--- a/sql/ha_ndbcluster.cc	2008-09-15 09:27:48 +0000
+++ b/sql/ha_ndbcluster.cc	2009-03-27 08:06:44 +0000
@@ -42,6 +42,7 @@
 #include "ha_ndbcluster_connection.h"
 
 #include <mysql/plugin.h>
+#include "probes_mysql.h"
 
 #ifdef ndb_dynamite
 #undef assert
@@ -4042,7 +4043,9 @@ int ha_ndbcluster::index_read(uchar *buf
 {
   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));
 
@@ -4060,43 +4063,62 @@ int ha_ndbcluster::index_read(uchar *buf
   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)
@@ -4188,15 +4210,23 @@ int ha_ndbcluster::read_range_first(cons
                                     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);
 }
 
 
@@ -4259,12 +4289,18 @@ int ha_ndbcluster::rnd_end()
 
 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,
+                       TRUE);
   ha_statistic_increment(&SSV::ha_read_rnd_next_count);
 
   if (!m_active_cursor)
-    DBUG_RETURN(full_table_scan(NULL, NULL, 0, buf));
-  DBUG_RETURN(next_result(buf));
+    rc= full_table_scan(NULL, NULL, 0, buf);
+  else
+    rc= next_result(buf);
+  MYSQL_READ_ROW_DONE(rc);
+  DBUG_RETURN(rc);
 }
 
 
@@ -4277,12 +4313,15 @@ int ha_ndbcluster::rnd_next(uchar *buf)
 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,
+                       FALSE);
   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_user_defined_partitioning)
     {
       if (table_share->primary_key == MAX_KEY)
@@ -4309,7 +4348,9 @@ int ha_ndbcluster::rnd_pos(uchar *buf, u
       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);
   }
 }
 
@@ -9658,10 +9699,22 @@ int ha_ndbcluster::multi_range_start_ret
 
       mrr_persistent_flag_storage(mrr_iter, mrr_range_no)|= UNIQUE_RANGE;
 
-      if (!(op= pk_unique_index_read_key(active_index,
-                                         mrr_cur_range.start_key.key,
-                                         row_buf, lm)))
-        ERR_RETURN(m_thd_ndb->trans->getNdbError());
+      MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+      op= pk_unique_index_read_key(active_index,
+                                   mrr_cur_range.start_key.key,
+                                   row_buf, lm);
+      if (!op)
+      {
+        NdbError err= m_thd_ndb->trans->getNdbError();
+        int rc= ndb_to_mysql_error(&err);
+        set_ndb_err(current_thd, err);
+        MYSQL_INDEX_READ_ROW_DONE(rc);
+        DBUG_RETURN(rc);
+      }
+      else
+      {
+        MYSQL_INDEX_READ_ROW_DONE(0);
+      }
 
       if (m_user_defined_partitioning &&
           (cur_index_type == PRIMARY_KEY_ORDERED_INDEX ||

=== modified file 'sql/handler.cc'
--- a/sql/handler.cc	2008-10-17 17:47:16 +0000
+++ b/sql/handler.cc	2009-03-27 08:06:44 +0000
@@ -28,6 +28,7 @@
 #include <myisampack.h>
 #include "myisam.h"
 #include "transaction.h"
+#include "probes_mysql.h"
 
 #ifdef WITH_PARTITION_STORAGE_ENGINE
 #include "ha_partition.h"
@@ -5297,6 +5298,9 @@ int handler::ha_external_lock(THD *thd, 
   */
   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())
@@ -5315,8 +5319,6 @@ int handler::ha_external_lock(THD *thd, 
     }
   }
   
-  if (error == 0)
-    cached_table_flags= table_flags();
   DBUG_RETURN(error);
 }
 

=== modified file 'sql/mysql_priv.h'
--- a/sql/mysql_priv.h	2008-10-17 17:47:16 +0000
+++ b/sql/mysql_priv.h	2009-03-27 08:06:44 +0000
@@ -44,16 +44,6 @@
 #include "sql_plugin.h"
 #include "scheduler.h"
 
-#ifdef HAVE_DTRACE
-#define _DTRACE_VERSION 1
-#else
-#undef _DTRACE_VERSION
-#endif
-#ifdef EMBEDDED_LIBRARY
-#undef _DTRACE_VERSION
-#endif
-#include "probes.h"
-
 #ifndef __WIN__
 #include <netdb.h>
 #endif

=== modified file 'sql/mysqld.cc'
--- a/sql/mysqld.cc	2008-10-17 17:47:16 +0000
+++ b/sql/mysqld.cc	2009-03-27 08:06:44 +0000
@@ -28,6 +28,7 @@
 #include "events.h"
 #include "ddl_blocker.h"
 #include "sql_audit.h"
+#include "probes_mysql.h"
 
 #include "../storage/myisam/ha_myisam.h"
 
@@ -1918,7 +1919,12 @@ void close_connection(THD *thd, uint err
   }
   if (lock)
     (void) pthread_mutex_unlock(&LOCK_thread_count);
-  MYSQL_CONNECTION_DONE((int) errcode, thd->thread_id);
+  /* 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 */

=== modified file 'sql/net_serv.cc'
--- a/sql/net_serv.cc	2008-10-02 12:08:09 +0000
+++ b/sql/net_serv.cc	2009-03-27 08:06:44 +0000
@@ -58,13 +58,7 @@
 #define MYSQL_CLIENT
 #endif /*EMBEDDED_LIBRARY */
 
-#ifdef HAVE_DTRACE
-/* Limit DTrace probes to server code for now */
-#ifndef MYSQL_SERVER
-#undef _DTRACE_VERSION
-#endif
-#endif
-#include "probes.h"
+#include "probes_mysql.h"
 
 /*
   The following handles the differences when this is linked between the

=== renamed file 'sql/probes.d' => 'sql/probes_mysql.d'
--- a/sql/probes.d	2008-10-02 12:08:09 +0000
+++ b/sql/probes_mysql.d	2009-03-27 08:06:44 +0000
@@ -21,7 +21,7 @@
 
   - each probe should have the minimal set of arguments required to
   unambiguously identify the context in which the probe fires. Redundant
-  probes (i.e. the ones that can be obtained in user scripts from previous
+  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,
@@ -96,14 +96,18 @@ provider mysql {
                            int exec_type);
   probe query__exec__done(int status);
 
-  /* These probes fire when performing write operations towards any handler */
+  /* 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);
-
+  probe read__row__start(char *db, char *table, int scan_flag);
+  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.
@@ -136,7 +140,8 @@ provider mysql {
                      unsigned long rowsmatches, unsigned long rowschanged);
   probe multi__update__start(char *query);
   probe multi__update__done(int status,
-                            unsigned long rowsmatches, unsigned long rowschanged);
+                            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);
@@ -151,4 +156,27 @@ provider mysql {
   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);
+
+  /* Backup probes */
+  probe backup__start();
+  probe backup__done(int status);
+  probe restore__start();
+  probe restore__done(int status);
 };
+
+#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

=== modified file 'sql/scheduler.cc'
--- a/sql/scheduler.cc	2008-10-17 17:47:16 +0000
+++ b/sql/scheduler.cc	2009-03-27 08:06:44 +0000
@@ -23,6 +23,7 @@
 
 #include <mysql_priv.h>
 #include "sql_audit.h"
+#include "probes_mysql.h"
 
 
 /*

=== modified file 'sql/sp_head.cc'
--- a/sql/sp_head.cc	2008-10-17 17:47:16 +0000
+++ b/sql/sp_head.cc	2009-03-27 08:06:44 +0000
@@ -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).

=== modified file 'sql/sql_cache.cc'
--- a/sql/sql_cache.cc	2008-10-17 17:47:16 +0000
+++ b/sql/sql_cache.cc	2009-03-27 08:06:44 +0000
@@ -333,6 +333,7 @@ TODO list:
 #include <hash.h>
 #include "../storage/myisammrg/ha_myisammrg.h"
 #include "../storage/myisammrg/myrg_def.h"
+#include "probes_mysql.h"
 
 #ifdef EMBEDDED_LIBRARY
 #include "emb_qcache.h"
@@ -1482,8 +1483,8 @@ def_week_frmt: %lu",                    
   thd->status_var.last_query_cost= 0.0;
   thd->main_da.disable_status();
 
-  MYSQL_QUERY_CACHE_HIT(thd->query, (ulong) thd->limit_found_rows);
   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:

=== modified file 'sql/sql_connect.cc'
--- a/sql/sql_connect.cc	2008-10-17 17:47:16 +0000
+++ b/sql/sql_connect.cc	2009-03-27 08:06:44 +0000
@@ -20,6 +20,7 @@
 
 #include "mysql_priv.h"
 #include "sql_audit.h"
+#include "probes_mysql.h"
 
 #if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY)
 /*

=== modified file 'sql/sql_cursor.cc'
--- a/sql/sql_cursor.cc	2008-10-10 16:23:30 +0000
+++ b/sql/sql_cursor.cc	2009-03-27 08:06:44 +0000
@@ -19,6 +19,7 @@
 #include "mysql_priv.h"
 #include "sql_cursor.h"
 #include "sql_select.h"
+#include "probes_mysql.h"
 
 /****************************************************************************
   Declarations.

=== modified file 'sql/sql_delete.cc'
--- a/sql/sql_delete.cc	2008-10-10 16:23:30 +0000
+++ b/sql/sql_delete.cc	2009-03-27 08:06:44 +0000
@@ -23,6 +23,7 @@
 #include "sql_select.h"
 #include "sp_head.h"
 #include "sql_trigger.h"
+#include "probes_mysql.h"
 
 /**
   Implement DELETE SQL word.
@@ -52,15 +53,11 @@ bool mysql_delete(THD *thd, TABLE_LIST *
   DBUG_ENTER("mysql_delete");
 
   if (open_and_lock_tables(thd, table_list))
-  {
-    MYSQL_DELETE_DONE(1, 0);
     DBUG_RETURN(TRUE);
-  }
   if (!(table= table_list->table))
   {
     my_error(ER_VIEW_DELETE_MERGE_VIEW, MYF(0),
 	     table_list->view_db.str, table_list->view_name.str);
-    MYSQL_DELETE_DONE(1, 0);
     DBUG_RETURN(TRUE);
   }
   thd_proc_info(thd, "init");
@@ -164,7 +161,6 @@ bool mysql_delete(THD *thd, TABLE_LIST *
   {
     free_underlaid_joins(thd, select_lex);
     thd->row_count_func= 0;
-    MYSQL_DELETE_DONE(0, 0);
     my_ok(thd, (ha_rows) thd->row_count_func);  // No matching records
     DBUG_RETURN(0);
   }
@@ -182,7 +178,6 @@ bool mysql_delete(THD *thd, TABLE_LIST *
     delete select;
     free_underlaid_joins(thd, select_lex);
     thd->row_count_func= 0;
-    MYSQL_DELETE_DONE(0, 0);
     my_ok(thd, (ha_rows) thd->row_count_func);
     /*
       We don't need to call reset_auto_increment in this case, because
@@ -412,11 +407,9 @@ cleanup:
     DBUG_PRINT("info",("%ld records deleted",(long) deleted));
   }
   res= error >= 0 || thd->is_error();
-  MYSQL_DELETE_DONE(res, (ulong) deleted);
   DBUG_RETURN(res);
 
 err:
-  MYSQL_DELETE_DONE(1, 0);
   DBUG_RETURN(TRUE);
 }
 
@@ -722,7 +715,10 @@ bool multi_delete::send_data(List<Item> 
       if (table->triggers &&
           table->triggers->process_triggers(thd, TRG_EVENT_DELETE,
                                             TRG_ACTION_BEFORE, FALSE))
+      {
+        MYSQL_MULTI_DELETE_DONE(1, 0);
         DBUG_RETURN(1);
+      }
       table->status|= STATUS_DELETED;
       if (!(error=table->file->ha_delete_row(table->record[0])))
       {
@@ -732,11 +728,15 @@ bool multi_delete::send_data(List<Item> 
         if (table->triggers &&
             table->triggers->process_triggers(thd, TRG_EVENT_DELETE,
                                               TRG_ACTION_AFTER, FALSE))
+        {
+          MYSQL_MULTI_DELETE_DONE(1, 0);
           DBUG_RETURN(1);
+        }
       }
       else
       {
         table->file->print_error(error,MYF(0));
+        MYSQL_MULTI_DELETE_DONE(1, 0);
         DBUG_RETURN(1);
       }
     }
@@ -746,6 +746,7 @@ bool multi_delete::send_data(List<Item> 
       if (error)
       {
 	error= 1;                               // Fatal error
+        MYSQL_MULTI_DELETE_DONE(1, 0);
 	DBUG_RETURN(1);
       }
     }
@@ -1108,8 +1109,10 @@ trunc_by_del:
   thd->clear_current_stmt_binlog_row_based();
 
   /* Delete all rows from table */
+  MYSQL_DELETE_START(thd->query);
   error= mysql_delete(thd, table_list, (COND*) 0, (SQL_LIST*) 0,
                       HA_POS_ERROR, LL(0), TRUE);
+  MYSQL_DELETE_DONE(error, (ulong) thd->row_count_func);
   ha_enable_transaction(thd, TRUE);
   thd->options= save_options;
   thd->current_stmt_binlog_row_based= save_binlog_row_based;

=== modified file 'sql/sql_insert.cc'
--- a/sql/sql_insert.cc	2008-10-17 17:47:16 +0000
+++ b/sql/sql_insert.cc	2009-03-27 08:06:44 +0000
@@ -63,6 +63,7 @@
 #include "rpl_mi.h"
 #include "sql_audit.h"
 #include "transaction.h"
+#include "probes_mysql.h"
 
 #ifndef EMBEDDED_LIBRARY
 static bool delayed_get_table(THD *thd, TABLE_LIST *table_list);
@@ -3340,7 +3341,7 @@ void select_insert::abort() {
 
   if (MYSQL_INSERT_SELECT_DONE_ENABLED())
   {
-    MYSQL_INSERT_SELECT_DONE(0, (ulong) (info.copied + info.deleted +
+    MYSQL_INSERT_SELECT_DONE(1, (ulong) (info.copied + info.deleted +
                                          info.updated));
   }
 

=== modified file 'sql/sql_parse.cc'
--- a/sql/sql_parse.cc	2008-10-17 17:47:16 +0000
+++ b/sql/sql_parse.cc	2009-03-27 08:06:44 +0000
@@ -31,6 +31,7 @@
 #include <ddl_blocker.h>
 #include "sql_audit.h"
 #include "transaction.h"
+#include "probes_mysql.h"
 
 #ifdef BACKUP_TEST
 #include "backup/backup_test.h"
@@ -3133,6 +3134,7 @@ ddl_blocker_err:
                        &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:

=== modified file 'sql/sql_prepare.cc'
--- a/sql/sql_prepare.cc	2008-10-10 16:23:30 +0000
+++ b/sql/sql_prepare.cc	2009-03-27 08:06:44 +0000
@@ -95,6 +95,7 @@ When one supplies long data for a placeh
 #else
 #include <mysql_com.h>
 #endif
+#include "probes_mysql.h"
 
 /**
   A result class used to send cursor rows using the binary protocol.

=== modified file 'sql/sql_select.cc'
--- a/sql/sql_select.cc	2008-10-17 17:47:16 +0000
+++ b/sql/sql_select.cc	2009-03-27 08:06:44 +0000
@@ -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>

=== modified file 'sql/sql_update.cc'
--- a/sql/sql_update.cc	2008-10-17 17:47:16 +0000
+++ b/sql/sql_update.cc	2009-03-27 08:06:44 +0000
@@ -23,6 +23,7 @@
 #include "sql_select.h"
 #include "sp_head.h"
 #include "sql_trigger.h"
+#include "probes_mysql.h"
 
 /* Return 0 if row hasn't changed */
 

=== modified file 'storage/archive/Makefile.am'
--- a/storage/archive/Makefile.am	2008-03-06 14:14:53 +0000
+++ b/storage/archive/Makefile.am	2009-03-27 08:06:44 +0000
@@ -97,5 +97,22 @@ valgrind-test: archive_test archive_perf
 	libtool --mode=execute valgrind --leak-check=yes --show-reachable=yes 
./archive_performance
 
 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.%

=== modified file 'storage/archive/ha_archive.cc'
--- a/storage/archive/ha_archive.cc	2008-07-23 08:52:08 +0000
+++ b/storage/archive/ha_archive.cc	2009-03-27 08:06:44 +0000
@@ -24,6 +24,7 @@
 #include <my_dir.h>
 
 #include <mysql/plugin.h>
+#include "probes_mysql.h"
 
 /*
   First, if you want to understand storage engines you should look at 
@@ -917,7 +918,9 @@ int ha_archive::index_read(uchar *buf, c
 {
   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,9 +963,11 @@ error:
 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)))
   {
     if (!memcmp(current_key, buf+current_k_offset, current_key_len))
@@ -972,7 +977,9 @@ int ha_archive::index_next(uchar * buf) 
     }
   }
 
-  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); 
 }
 
 /*
@@ -1098,12 +1105,20 @@ int ha_archive::rnd_next(uchar *buf)
 {
   int rc;
   DBUG_ENTER("ha_archive::rnd_next");
-
+  MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str,
+                       TRUE);
+  
   if (share->crashed)
-      DBUG_RETURN(HA_ERR_CRASHED_ON_USAGE);
+  {
+    MYSQL_READ_ROW_DONE(HA_ERR_CRASHED_ON_USAGE);
+    DBUG_RETURN(HA_ERR_CRASHED_ON_USAGE);
+  }
 
   if (!scan_rows)
+  {
+    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);
@@ -1112,6 +1127,7 @@ int ha_archive::rnd_next(uchar *buf)
 
   table->status=rc ? STATUS_NOT_FOUND: 0;
 
+  MYSQL_READ_ROW_DONE(rc);
   DBUG_RETURN(rc);
 }
 
@@ -1139,12 +1155,18 @@ void ha_archive::position(const uchar *r
 
 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,
+                       FALSE);
   ha_statistic_increment(&SSV::ha_read_rnd_next_count);
   current_position= (my_off_t)my_get_ptr(pos, ref_length);
   if (azseek(&archive, (size_t)current_position, SEEK_SET) == (size_t)(-1L))
-    DBUG_RETURN(HA_ERR_CRASHED_ON_USAGE);
-  DBUG_RETURN(get_row(&archive, buf));
+    rc= HA_ERR_CRASHED_ON_USAGE;
+  else
+    rc= get_row(&archive, buf);
+  MYSQL_READ_ROW_DONE(rc);
+  DBUG_RETURN(rc);
 }
 
 /*

=== modified file 'storage/blackhole/Makefile.am'
--- a/storage/blackhole/Makefile.am	2008-01-02 13:00:46 +0000
+++ b/storage/blackhole/Makefile.am	2009-03-27 08:06:44 +0000
@@ -48,5 +48,22 @@ libblackhole_a_SOURCES=	ha_blackhole.cc
 
 
 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.%

=== modified file 'storage/blackhole/ha_blackhole.cc'
--- a/storage/blackhole/ha_blackhole.cc	2008-10-03 10:01:20 +0000
+++ b/storage/blackhole/ha_blackhole.cc	2009-03-27 08:06:44 +0000
@@ -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,27 @@ int ha_blackhole::rnd_init(bool scan)
 
 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,
+                       TRUE);
   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,
+                       FALSE);
   DBUG_ASSERT(0);
+  MYSQL_READ_ROW_DONE(0);
   DBUG_RETURN(0);
 }
 
@@ -210,11 +220,14 @@ int ha_blackhole::index_read_map(uchar *
                                  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 +235,36 @@ int ha_blackhole::index_read_idx_map(uch
                                  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 +272,8 @@ int ha_blackhole::index_next(uchar * buf
 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 +281,8 @@ int ha_blackhole::index_prev(uchar * buf
 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 +290,8 @@ int ha_blackhole::index_first(uchar * bu
 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);
 }
 

=== modified file 'storage/csv/Makefile.am'
--- a/storage/csv/Makefile.am	2007-01-04 18:54:52 +0000
+++ b/storage/csv/Makefile.am	2009-03-27 08:06:44 +0000
@@ -41,5 +41,22 @@ libcsv_a_CXXFLAGS =	$(AM_CFLAGS)
 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.%

=== modified file 'storage/csv/ha_tina.cc'
--- a/storage/csv/ha_tina.cc	2008-08-23 00:18:35 +0000
+++ b/storage/csv/ha_tina.cc	2009-03-27 08:06:44 +0000
@@ -48,6 +48,7 @@ TODO:
 #include "mysql_priv.h"
 #include <mysql/plugin.h>
 #include "ha_tina.h"
+#include "probes_mysql.h"
 
 
 /*
@@ -1094,9 +1095,14 @@ int ha_tina::rnd_next(uchar *buf)
 {
   int rc;
   DBUG_ENTER("ha_tina::rnd_next");
+  MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str,
+                       TRUE);
 
   if (share->crashed)
-      DBUG_RETURN(HA_ERR_CRASHED_ON_USAGE);
+  {
+    rc= HA_ERR_CRASHED_ON_USAGE;
+    goto end;
+  }
 
   ha_statistic_increment(&SSV::ha_read_rnd_next_count);
 
@@ -1104,13 +1110,19 @@ int ha_tina::rnd_next(uchar *buf)
 
   /* 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);
 }
 
 /*
@@ -1137,10 +1149,15 @@ void ha_tina::position(const uchar *reco
 
 int ha_tina::rnd_pos(uchar * buf, uchar *pos)
 {
+  int rc;
   DBUG_ENTER("ha_tina::rnd_pos");
+  MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str,
+                       FALSE);
   ha_statistic_increment(&SSV::ha_read_rnd_count);
   current_position= (off_t)my_get_ptr(pos,ref_length);
-  DBUG_RETURN(find_current_row(buf));
+  rc= find_current_row(buf);
+  MYSQL_READ_ROW_DONE(rc);
+  DBUG_RETURN(rc);
 }
 
 /*

=== modified file 'storage/example/Makefile.am'
--- a/storage/example/Makefile.am	2008-01-02 13:00:46 +0000
+++ b/storage/example/Makefile.am	2009-03-27 08:06:44 +0000
@@ -48,5 +48,21 @@ libexample_a_SOURCES=	ha_example.cc
 
 
 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.%

=== modified file 'storage/example/ha_example.cc'
--- a/storage/example/ha_example.cc	2008-04-09 00:56:49 +0000
+++ b/storage/example/ha_example.cc	2009-03-27 08:06:44 +0000
@@ -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 @@ int ha_example::index_read_map(uchar *bu
                                __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_read_map(uchar *bu
 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_next(uchar *buf)
 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_prev(uchar *buf)
 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_first(uchar *buf)
 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,9 @@ int ha_example::rnd_end()
 int ha_example::rnd_next(uchar *buf)
 {
   DBUG_ENTER("ha_example::rnd_next");
+  MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str,
+                       TRUE);
+  MYSQL_READ_ROW_DONE(HA_ERR_END_OF_FILE);
   DBUG_RETURN(HA_ERR_END_OF_FILE);
 }
 
@@ -582,6 +596,9 @@ void ha_example::position(const uchar *r
 int ha_example::rnd_pos(uchar *buf, uchar *pos)
 {
   DBUG_ENTER("ha_example::rnd_pos");
+  MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str,
+                       FALSE);
+  MYSQL_READ_ROW_DONE(HA_ERR_END_OF_FILE);
   DBUG_RETURN(HA_ERR_WRONG_COMMAND);
 }
 

=== modified file 'storage/falcon/Makefile.am'
--- a/storage/falcon/Makefile.am	2008-09-03 21:49:18 +0000
+++ b/storage/falcon/Makefile.am	2009-03-27 08:06:44 +0000
@@ -388,8 +388,7 @@ falcon_sources= Agent.cpp Alias.cpp \
 		WalkDeferred.cpp \
 		WString.cpp
 
-noinst_HEADERS=	$(falcon_headers) \
-		falcon_probes.h
+noinst_HEADERS=	$(falcon_headers) probes_falcon.h probes_falcon_nodtrace.h
 
 EXTRA_LTLIBRARIES=	ha_falcon.la
 pkglib_LTLIBRARIES=	@plugin_falcon_shared_target@
@@ -399,11 +398,6 @@ ha_falcon_la_CFLAGS=	$(AM_CFLAGS) -DMYSQ
 ha_falcon_la_LIBADD=	TransformLib/libtransform.la
 ha_falcon_la_SOURCES=	$(falcon_sources)
 
-if HAVE_DTRACE
-  ha_falcon_la_LIBADD+= falcon_probes.o
-endif
-
-
 EXTRA_LIBRARIES=	libfalcon.a libhafalcon.a
 noinst_LIBRARIES=	@plugin_falcon_static_target@
 libfalcon_a_LIBADD=	libhafalcon.a TransformLib/libtransform.a
@@ -426,17 +420,37 @@ libfalcon.a:		$(libfalcon_a_LIBADD)
 		fi
 
 
-EXTRA_DIST=		CMakeLists.txt plug.in \
-			falcon_probes.d
+EXTRA_DIST=		CMakeLists.txt plug.in probes_falcon.d
+
+abs_top_srcdir = @abs_top_srcdir@
+
+FALCONPROVIDER = $(abs_top_srcdir)/storage/falcon/probes_falcon.d
+
+if HAVE_DTRACE
+BUILT_SOURCES = probes_falcon_dtrace.h
+CLEANFILES = probes_falcon_dtrace.h
+
+probes_falcon_dtrace.h: $(FALCONPROVIDER)
+	$(DTRACE) $(DTRACEFLAGS) -h -s $< -o $@
 
-falcon_probes.h: falcon_probes.d
-	$(DTRACE) $(DTRACEFLAGS) -h -s falcon_probes.d
-	mv falcon_probes.h falcon_probes.h.bak
-	sed "s/#include <unistd.h>//g" falcon_probes.h.bak > falcon_probes.h
-	rm falcon_probes.h.bak
+if HAVE_DTRACE_DASH_G
+libhafalcon_a_LIBADD = probes_all.o
+libhafalcon_a_DEPENDENCIES = probes_all.o dtrace_files dtrace_providers
+CLEANFILES += probes_all.o dtrace_files dtrace_providers
+DTRACEFILES = libhafalcon_a-ha_falcon.o
+MYSQLPROVIDER = $(abs_top_srcdir)/sql/probes_mysql.d
+
+dtrace_files:
+	echo $(DTRACEFILES) > $@
+dtrace_providers:
+	echo $(FALCONPROVIDER) $(MYSQLPROVIDER) > $@
+probes_all.o: $(MYSQLPROVIDER) $(FALCONPROVIDER) $(DTRACEFILES)
+	$(DTRACE) $(DTRACEFLAGS) -G -o $@ -s $(MYSQLPROVIDER) -s $(FALCONPROVIDER)
$(DTRACEFILES)
+endif # HAVE_DTRACE_DASH_G
+endif # HAVE_DTRACE
 
-falcon_probes.o:
-	$(DTRACE) $(DTRACEFLAGS) -G -s falcon_probes.d $(DTRACEFILES)
+probes_falcon_nodtrace.h: $(FALCONPROVIDER)
+	$(top_srcdir)/scripts/dheadgen.pl -f $(FALCONPROVIDER) > $@
 
 # Don't update the files from bitkeeper
 %::SCCS/s.%

=== removed file 'storage/falcon/falcon_probes.d'
--- a/storage/falcon/falcon_probes.d	2007-12-19 04:33:08 +0000
+++ b/storage/falcon/falcon_probes.d	1970-01-01 00:00:00 +0000
@@ -1,19 +0,0 @@
-/* Copyright (C) 2004-2005 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 */
-
-provider falcon {
-	probe open();
-	probe close();
-};

=== removed file 'storage/falcon/falcon_probes.h'
--- a/storage/falcon/falcon_probes.h	2007-12-19 04:33:08 +0000
+++ b/storage/falcon/falcon_probes.h	1970-01-01 00:00:00 +0000
@@ -1,45 +0,0 @@
-/*
- * Generated by dtrace(1M).
- */
-
-#ifndef	_FALCON_PROBES_H
-#define	_FALCON_PROBES_H
-
-
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-#if _DTRACE_VERSION
-
-#define	FALCON_CLOSE() \
-	__dtrace_falcon___close()
-#define	FALCON_CLOSE_ENABLED() \
-	__dtraceenabled_falcon___close()
-#define	FALCON_OPEN() \
-	__dtrace_falcon___open()
-#define	FALCON_OPEN_ENABLED() \
-	__dtraceenabled_falcon___open()
-
-
-extern void __dtrace_falcon___close(void);
-extern int __dtraceenabled_falcon___close(void);
-extern void __dtrace_falcon___open(void);
-extern int __dtraceenabled_falcon___open(void);
-
-#else
-
-#define	FALCON_CLOSE()
-#define	FALCON_CLOSE_ENABLED() (0)
-#define	FALCON_OPEN()
-#define	FALCON_OPEN_ENABLED() (0)
-
-#endif
-
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif	/* _FALCON_PROBES_H */

=== modified file 'storage/falcon/ha_falcon.cpp'
--- a/storage/falcon/ha_falcon.cpp	2008-10-03 05:15:40 +0000
+++ b/storage/falcon/ha_falcon.cpp	2009-03-27 08:06:44 +0000
@@ -20,7 +20,8 @@
 #endif
 
 #include "mysql_priv.h"
-#include "falcon_probes.h"
+#include "probes_mysql.h"
+#include "probes_falcon.h"
 
 #ifdef _WIN32
 #pragma pack()
@@ -488,8 +489,7 @@ int StorageInterface::open(const char *n
 {
 	DBUG_ENTER("StorageInterface::open");
 
-	// Temporarily comment out DTrace probes in Falcon, see bug #36403
-	// FALCON_OPEN();
+	FALCON_OPEN();
 
 	if (!mySqlThread)
 		mySqlThread = current_thd;
@@ -567,8 +567,7 @@ int StorageInterface::close(void)
 
 	unmapFields();
 
-	// Temporarily comment out DTrace probes in Falcon, see bug #36403
-	// FALCON_CLOSE();
+	FALCON_CLOSE();
 
 	DBUG_RETURN(0);
 }
@@ -604,7 +603,10 @@ int StorageInterface::repair(THD* thd, H
 
 int StorageInterface::rnd_next(uchar *buf)
 {
+	int rc= 0;
 	DBUG_ENTER("StorageInterface::rnd_next");
+        MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str,
+                             TRUE);
 	ha_statistic_increment(&SSV::ha_read_rnd_next_count);
 
 	if (activeBlobs)
@@ -618,18 +620,20 @@ int StorageInterface::rnd_next(uchar *bu
 			{
 			lastRecord = -1;
 			table->status = STATUS_NOT_FOUND;
-			DBUG_RETURN(HA_ERR_END_OF_FILE);
+			rc= HA_ERR_END_OF_FILE;
+                	goto end;
 			}
-
-		DBUG_RETURN(error(lastRecord));
+		rc= error(lastRecord);
+		goto end;
 		}
 	else
 		table->status = 0;
 
 	decodeRecord(buf);
 	nextRecord = lastRecord + 1;
-
-	DBUG_RETURN(0);
+end:
+	MYSQL_READ_ROW_DONE(rc);
+	DBUG_RETURN(rc);
 }
 
 
@@ -641,7 +645,10 @@ void StorageInterface::unlock_row(void)
 int StorageInterface::rnd_pos(uchar *buf, uchar *pos)
 {
 	int recordNumber;
+	int rc= 0;
 	DBUG_ENTER("StorageInterface::rnd_pos");
+	MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str,
+                             FALSE);
 	ha_statistic_increment(&SSV::ha_read_rnd_next_count);
 
 	memcpy(&recordNumber, pos, sizeof(recordNumber));
@@ -654,14 +661,16 @@ int StorageInterface::rnd_pos(uchar *buf
 	if (ret)
 		{
 		table->status = STATUS_NOT_FOUND;
-		DBUG_RETURN(error(ret));
+		rc= error(ret);
+		goto end;
 		}
 
 	lastRecord = recordNumber;
 	decodeRecord(buf);
 	table->status = 0;
-
-	DBUG_RETURN(0);
+end:
+	MYSQL_READ_ROW_DONE(rc);
+	DBUG_RETURN(rc);
 }
 
 void StorageInterface::position(const uchar *record)
@@ -1346,9 +1355,12 @@ int StorageInterface::index_read(uchar *
                                 enum ha_rkey_function find_flag)
 {
 	DBUG_ENTER("StorageInterface::index_read");
-	int ret, which = 0;
+	int rc, ret, which = 0;
+	MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
 	ha_statistic_increment(&SSV::ha_read_key_count);
 
+	const unsigned char *key = (const unsigned char*) keyBytes;
+
 	// XXX This needs to be revisited
 	switch(find_flag)
 		{
@@ -1373,27 +1385,34 @@ int StorageInterface::index_read(uchar *
 		case HA_READ_PREFIX:
 		case HA_READ_KEY_OR_PREV:
 		default:
-			DBUG_RETURN(HA_ERR_UNSUPPORTED);
+			rc= HA_ERR_UNSUPPORTED;
+			goto err;
 		}
 
-	const unsigned char *key = (const unsigned char*) keyBytes;
-
 	if (which)
 		if ((ret = storageTable->setIndexBound(key, key_len, which)))
-			DBUG_RETURN(error(ret));
+			{
+			rc= error(ret);
+			goto err;
+			}
 
 	if ((ret = storageTable->indexScan(indexOrder)))
-		DBUG_RETURN(error(ret));
+		{
+		rc= error(ret);
+		goto err;
+		}
 
 	nextRecord = 0;
 
 	for (;;)
 		{
-		int ret = index_next(buf);
+		int ret = index_next_int(buf);
 
 		if (ret)
-			DBUG_RETURN(ret);
-
+			{
+			rc= ret;
+			goto err;
+			}
 		int comparison = storageTable->compareKey(key, key_len);
 
 		if ((which & LowerBound) && comparison < 0)
@@ -1402,8 +1421,12 @@ int StorageInterface::index_read(uchar *
 		if ((which & UpperBound) && comparison > 0)
 			continue;
 
+		MYSQL_INDEX_READ_ROW_DONE(0);
 		DBUG_RETURN(0);
 		}
+err:
+	MYSQL_INDEX_READ_ROW_DONE(rc);
+	DBUG_RETURN(rc);
 }
 
 int StorageInterface::index_init(uint idx, bool sorted)
@@ -1565,10 +1588,11 @@ int StorageInterface::read_range_first(c
                                       bool eq_range_arg, bool sorted)
 {
 	DBUG_ENTER("StorageInterface::read_range_first");
+	MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
 	storageTable->clearIndexBounds();
 	haveStartKey = false;
 	haveEndKey = false;
-	int ret = 0;
+	int rc, ret = 0;
 
 	if (start_key && !storageTable->isKeyNull((const unsigned char*)
start_key->key, start_key->length))
 		{
@@ -1583,7 +1607,10 @@ int StorageInterface::read_range_first(c
 		int ret = storageTable->setIndexBound((const unsigned char*) start_key->key,
 												start_key->length, LowerBound);
 		if (ret)
-			DBUG_RETURN(error(ret));
+			{
+			rc= error(ret);
+			goto end;
+			}
 		}
 
 	if (end_key)
@@ -1594,7 +1621,10 @@ int StorageInterface::read_range_first(c
 		ret = storageTable->setIndexBound((const unsigned char*) end_key->key,
 												end_key->length, UpperBound);
 		if (ret)
-			DBUG_RETURN(error(ret));
+			{
+			rc= error(ret);
+			goto end;
+			}
 		}
 
 	storageTable->indexScan(indexOrder);
@@ -1618,7 +1648,7 @@ int StorageInterface::read_range_first(c
 
 	for (;;)
 		{
-		int result = index_next(table->record[0]);
+		int result = index_next_int(table->record[0]);
 
 		if (result)
 			{
@@ -1626,23 +1656,43 @@ int StorageInterface::read_range_first(c
 				result = HA_ERR_END_OF_FILE;
 
 			table->status = result;
-			DBUG_RETURN(result);
+			rc= result;
+			goto end;
 			}
-
-		DBUG_RETURN(0);
+		rc= 0;
+		break;
 		}
+end:
+	MYSQL_INDEX_READ_ROW_DONE(rc);
+	DBUG_RETURN(rc);
 }
 
 int StorageInterface::index_first(uchar* buf)
 {
+	int rc;
+	MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
 	storageTable->indexScan(indexOrder);
 
-	return index_next(buf);
+	rc= index_next_int(buf);
+	MYSQL_INDEX_READ_ROW_DONE(rc);
+	return rc;
 }
 
 int StorageInterface::index_next(uchar *buf)
 {
+	int rc;
 	DBUG_ENTER("StorageInterface::index_next");
+	MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+
+	rc= index_next_int(buf);
+
+	MYSQL_INDEX_READ_ROW_DONE(rc);
+	DBUG_RETURN(rc);
+}
+
+int StorageInterface::index_next_int(uchar *buf)
+{
+	DBUG_ENTER("StorageInterface::index_next_int");
 	ha_statistic_increment(&SSV::ha_read_next_count);
 
 	if (activeBlobs)
@@ -1697,21 +1747,25 @@ int StorageInterface::index_next(uchar *
 
 int StorageInterface::index_next_same(uchar *buf, const uchar *key, uint key_len)
 {
+	int ret= 0;
 	DBUG_ENTER("StorageInterface::index_next_same");
+	MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
 	ha_statistic_increment(&SSV::ha_read_next_count);
 
 	for (;;)
 		{
-		int ret = index_next(buf);
+		ret = index_next_int(buf);
 
 		if (ret)
-			DBUG_RETURN(ret);
+			break;
 
 		int comparison = storageTable->compareKey((const unsigned char*) key, key_len);
 
 		if (comparison == 0)
-			DBUG_RETURN(0);
+			break;
 		}
+	MYSQL_INDEX_READ_ROW_DONE(ret);
+	DBUG_RETURN(ret);
 }
 
 double StorageInterface::scan_time(void)

=== modified file 'storage/falcon/ha_falcon.h'
--- a/storage/falcon/ha_falcon.h	2008-09-16 17:58:49 +0000
+++ b/storage/falcon/ha_falcon.h	2009-03-27 08:06:44 +0000
@@ -134,6 +134,7 @@ public:
 	void			checkBinLog(void);
 	void			mapFields(TABLE *table);
 	void			unmapFields(void);
+	int     		index_next_int(uchar *buf);
 
 	static StorageConnection* getStorageConnection(THD* thd);
 	

=== added file 'storage/falcon/probes_falcon.d'
--- a/storage/falcon/probes_falcon.d	1970-01-01 00:00:00 +0000
+++ b/storage/falcon/probes_falcon.d	2009-03-27 08:06:44 +0000
@@ -0,0 +1,25 @@
+/* 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 */
+
+provider falcon {
+  probe open();
+  probe close();
+};
+
+#pragma D attributes Evolving/Evolving/Common provider falcon provider
+#pragma D attributes Evolving/Evolving/Common provider falcon module
+#pragma D attributes Evolving/Evolving/Common provider falcon function
+#pragma D attributes Evolving/Evolving/Common provider falcon name
+#pragma D attributes Evolving/Evolving/Common provider falcon args

=== added file 'storage/falcon/probes_falcon.h'
--- a/storage/falcon/probes_falcon.h	1970-01-01 00:00:00 +0000
+++ b/storage/falcon/probes_falcon.h	2009-03-27 08:06:44 +0000
@@ -0,0 +1,13 @@
+#ifndef PROBES_FALCON_H
+
+#define PROBES_FALCON_H
+
+#include <my_global.h>
+
+#if defined(HAVE_DTRACE) && !defined(DISABLE_DTRACE)
+#include "probes_falcon_dtrace.h"
+#else
+#include "probes_falcon_nodtrace.h"
+#endif
+
+#endif /* PROBES_FALCON_H */

=== added file 'storage/falcon/probes_falcon_nodtrace.h'
--- a/storage/falcon/probes_falcon_nodtrace.h	1970-01-01 00:00:00 +0000
+++ b/storage/falcon/probes_falcon_nodtrace.h	2009-03-27 08:06:44 +0000
@@ -0,0 +1,21 @@
+/*
+ * Generated by dheadgen(1).
+ */
+
+#ifndef	_PROBES_FALCON_D
+#define	_PROBES_FALCON_D
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+#define	FALCON_OPEN()
+#define	FALCON_OPEN_ENABLED() (0)
+#define	FALCON_CLOSE()
+#define	FALCON_CLOSE_ENABLED() (0)
+
+#ifdef  __cplusplus
+}
+#endif
+
+#endif  /* _PROBES_FALCON_D */

=== modified file 'storage/federated/Makefile.am'
--- a/storage/federated/Makefile.am	2008-01-02 13:00:46 +0000
+++ b/storage/federated/Makefile.am	2009-03-27 08:06:44 +0000
@@ -48,5 +48,22 @@ libfederated_a_SOURCES=	ha_federated.cc
 
 
 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.%

=== modified file 'storage/federated/ha_federated.cc'
--- a/storage/federated/ha_federated.cc	2008-08-15 19:58:03 +0000
+++ b/storage/federated/ha_federated.cc	2009-03-27 08:06:44 +0000
@@ -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
@@ -2317,12 +2319,16 @@ int ha_federated::delete_row(const uchar
 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);
+  
   free_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);
 }
 
 
@@ -2345,13 +2351,18 @@ int ha_federated::index_read_idx(uchar *
   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)))
+  {
+    MYSQL_INDEX_READ_ROW_DONE(retval);
     DBUG_RETURN(retval);
+  }
   mysql_free_result(mysql_result);
   results.elements--;
+  MYSQL_INDEX_READ_ROW_DONE(0);
   DBUG_RETURN(0);
 }
 
@@ -2473,7 +2484,8 @@ int ha_federated::read_range_first(const
                    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));
 
   sql_query.length(0);
@@ -2494,18 +2506,25 @@ int ha_federated::read_range_first(const
     goto error;
   }
   
-  DBUG_RETURN(read_next(table->record[0], stored_result));
+  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);
 }
 
 
 int ha_federated::read_range_next()
 {
+  int rc;
   DBUG_ENTER("ha_federated::read_range_next");
-  DBUG_RETURN(rnd_next(table->record[0]));
+  MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
+  rc= rnd_next_int(table->record[0]);
+  MYSQL_INDEX_READ_ROW_DONE(rc);
+  DBUG_RETURN(rc);
 }
 
 
@@ -2594,7 +2613,6 @@ int ha_federated::index_end(void)
   DBUG_RETURN(0);
 }
 
-
 /*
   This is called for each row of the table scan. When you run out of records
   you should return HA_ERR_END_OF_FILE. Fill buff up with the row information.
@@ -2607,7 +2625,19 @@ int ha_federated::index_end(void)
 
 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,
+                       TRUE);
+  rc= rnd_next_int(buf);
+  MYSQL_READ_ROW_DONE(rc);
+  DBUG_RETURN(rc);
+}
+
+
+int ha_federated::rnd_next_int(uchar *buf)
+{
+  DBUG_ENTER("ha_federated::rnd_next_int");
 
   if (stored_result == 0)
   {
@@ -2712,7 +2742,10 @@ void ha_federated::position(const uchar 
 int ha_federated::rnd_pos(uchar *buf, uchar *pos)
 {
   MYSQL_RES *result;
+  int rc;
   DBUG_ENTER("ha_federated::rnd_pos");
+  MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str,
+                       FALSE);
   
   ha_statistic_increment(&SSV::ha_read_rnd_count);
 
@@ -2723,7 +2756,9 @@ int ha_federated::rnd_pos(uchar *buf, uc
   memcpy_fixed(&result->data_cursor, pos + sizeof(MYSQL_RES *),
                sizeof(MYSQL_ROW_OFFSET));
   /* Read a row. */
-  DBUG_RETURN(read_next(buf, result));
+  rc= read_next(buf, result);
+  MYSQL_READ_ROW_DONE(rc);
+  DBUG_RETURN(rc);
 }
 
 

=== modified file 'storage/federated/ha_federated.h'
--- a/storage/federated/ha_federated.h	2008-08-15 12:18:06 +0000
+++ b/storage/federated/ha_federated.h	2009-03-27 08:06:44 +0000
@@ -237,6 +237,7 @@ public:
   int rnd_init(bool scan);                                      //required
   int rnd_end();
   int rnd_next(uchar *buf);                                      //required
+  int rnd_next_int(uchar *buf);
   int rnd_pos(uchar *buf, uchar *pos);                            //required
   void position(const uchar *record);                            //required
   int info(uint);                                              //required

=== modified file 'storage/heap/Makefile.am'
--- a/storage/heap/Makefile.am	2006-12-31 00:32:21 +0000
+++ b/storage/heap/Makefile.am	2009-03-27 08:06:44 +0000
@@ -51,5 +51,21 @@ libheap_a_SOURCES =	hp_open.c hp_extra.c
 
 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.%

=== modified file 'storage/heap/ha_heap.cc'
--- a/storage/heap/ha_heap.cc	2007-12-14 13:21:37 +0000
+++ b/storage/heap/ha_heap.cc	2009-03-27 08:06:44 +0000
@@ -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 @@ int ha_heap::index_read_map(uchar *buf, 
                             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 @@ int ha_heap::index_read_idx_map(uchar *b
                                 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,12 @@ int ha_heap::rnd_init(bool scan)
 
 int ha_heap::rnd_next(uchar *buf)
 {
+  MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str,
+                       TRUE);
   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 +373,13 @@ int ha_heap::rnd_pos(uchar * buf, uchar 
 {
   int error;
   HEAP_PTR heap_position;
+  MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str,
+                       FALSE);
   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;
 }
 

=== modified file 'storage/maria/Makefile.am'
--- a/storage/maria/Makefile.am	2008-06-26 05:18:28 +0000
+++ b/storage/maria/Makefile.am	2009-03-27 08:06:44 +0000
@@ -193,5 +193,21 @@ test:
 test-verbose:
 	HARNESS_VERBOSE=1 perl $(top_srcdir)/unittest/unit.pl run $(unittests)
 
+if HAVE_DTRACE_DASH_G
+abs_top_srcdir = @abs_top_srcdir@
+libmaria_a_LIBADD = probes_mysql.o
+libmaria_a_DEPENDENCIES = probes_mysql.o dtrace_files dtrace_providers
+CLEANFILES += probes_mysql.o dtrace_files dtrace_providers
+DTRACEFILES = ha_maria.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.%

=== modified file 'storage/maria/ha_maria.cc'
--- a/storage/maria/ha_maria.cc	2008-09-04 18:30:34 +0000
+++ b/storage/maria/ha_maria.cc	2009-03-27 08:06:44 +0000
@@ -36,6 +36,8 @@ C_MODE_START
 #include "ma_recovery.h"
 C_MODE_END
 
+#include "probes_mysql.h"
+
 /*
   Note that in future versions, only *transactional* Maria tables can
   rollback, so this flag should be up or down conditionally.
@@ -1876,10 +1878,12 @@ int ha_maria::index_read_map(uchar * buf
 			     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= maria_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;
 }
 
@@ -1888,9 +1892,11 @@ int ha_maria::index_read_idx_map(uchar *
 				 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= maria_rkey(file, buf, index, key, keypart_map, find_flag);
   table->status= error ? STATUS_NOT_FOUND : 0;
+  MYSQL_INDEX_READ_ROW_DONE(error);
   return error;
 }
 
@@ -1899,51 +1905,61 @@ int ha_maria::index_read_last_map(uchar 
 				  key_part_map keypart_map)
 {
   DBUG_ENTER("ha_maria::index_read_last_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= maria_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_maria::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= maria_rnext(file, buf, active_index);
   table->status= error ? STATUS_NOT_FOUND : 0;
+  MYSQL_INDEX_READ_ROW_DONE(error);
   return error;
 }
 
 
 int ha_maria::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= maria_rprev(file, buf, active_index);
   table->status= error ? STATUS_NOT_FOUND : 0;
+  MYSQL_INDEX_READ_ROW_DONE(error);
   return error;
 }
 
 
 int ha_maria::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= maria_rfirst(file, buf, active_index);
   table->status= error ? STATUS_NOT_FOUND : 0;
+  MYSQL_INDEX_READ_ROW_DONE(error);
   return error;
 }
 
 
 int ha_maria::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= maria_rlast(file, buf, active_index);
   table->status= error ? STATUS_NOT_FOUND : 0;
+  MYSQL_INDEX_READ_ROW_DONE(error);
   return error;
 }
 
@@ -1953,6 +1969,7 @@ int ha_maria::index_next_same(uchar * bu
                               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);
   /*
@@ -1964,6 +1981,7 @@ int ha_maria::index_next_same(uchar * bu
     error= maria_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;
 }
 
@@ -1986,9 +2004,11 @@ int ha_maria::rnd_end()
 
 int ha_maria::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= maria_scan(file, buf);
   table->status= error ? STATUS_NOT_FOUND : 0;
+  MYSQL_READ_ROW_DONE(error);
   return error;
 }
 
@@ -2008,9 +2028,11 @@ int ha_maria::restart_rnd_next(uchar *bu
 
 int ha_maria::rnd_pos(uchar *buf, uchar *pos)
 {
+  MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str, 1);
   ha_statistic_increment(&SSV::ha_read_rnd_count);
   int error= maria_rrnd(file, buf, my_get_ptr(pos, ref_length));
   table->status= error ? STATUS_NOT_FOUND : 0;
+  MYSQL_READ_ROW_DONE(error);
   return error;
 }
 

=== modified file 'storage/myisam/Makefile.am'
--- a/storage/myisam/Makefile.am	2008-07-09 07:12:43 +0000
+++ b/storage/myisam/Makefile.am	2009-03-27 08:06:44 +0000
@@ -151,5 +151,20 @@ SUFFIXES = .sh
 	@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.%

=== modified file 'storage/myisam/ha_myisam.cc'
--- a/storage/myisam/ha_myisam.cc	2008-07-09 07:12:43 +0000
+++ b/storage/myisam/ha_myisam.cc	2009-03-27 08:06:44 +0000
@@ -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;
 
@@ -1519,10 +1520,12 @@ int ha_myisam::index_read_map(uchar *buf
                               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;
 }
 
@@ -1530,9 +1533,11 @@ int ha_myisam::index_read_idx_map(uchar 
                                   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;
 }
 
@@ -1540,47 +1545,57 @@ int ha_myisam::index_read_last_map(uchar
                                    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;
 }
 
@@ -1589,6 +1604,7 @@ int ha_myisam::index_next_same(uchar *bu
 			       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
@@ -1596,6 +1612,7 @@ int ha_myisam::index_next_same(uchar *bu
     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;
 }
 
@@ -1634,9 +1651,12 @@ int ha_myisam::rnd_init(bool scan)
 
 int ha_myisam::rnd_next(uchar *buf)
 {
+  MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str,
+                       TRUE);
   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(error);
   return error;
 }
 
@@ -1653,9 +1673,12 @@ int ha_myisam::restart_rnd_next(uchar *b
 
 int ha_myisam::rnd_pos(uchar *buf, uchar *pos)
 {
+  MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str,
+                       FALSE);
   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(error);
   return error;
 }
 

=== modified file 'storage/myisammrg/Makefile.am'
--- a/storage/myisammrg/Makefile.am	2008-04-25 21:45:58 +0000
+++ b/storage/myisammrg/Makefile.am	2009-03-27 08:06:44 +0000
@@ -40,5 +40,21 @@ libmyisammrg_a_SOURCES = myrg_open.c myr
 
 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.%

=== modified file 'storage/myisammrg/ha_myisammrg.cc'
--- a/storage/myisammrg/ha_myisammrg.cc	2008-07-24 10:00:56 +0000
+++ b/storage/myisammrg/ha_myisammrg.cc	2009-03-27 08:06:44 +0000
@@ -96,6 +96,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,
@@ -865,10 +866,12 @@ int ha_myisammrg::index_read_map(uchar *
                                  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;
 }
 
@@ -876,57 +879,69 @@ int ha_myisammrg::index_read_idx_map(uch
                                      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;
 }
 
@@ -935,6 +950,7 @@ int ha_myisammrg::index_next_same(uchar 
                                   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
@@ -942,6 +958,7 @@ int ha_myisammrg::index_next_same(uchar 
     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;
 }
 
@@ -955,20 +972,26 @@ int ha_myisammrg::rnd_init(bool scan)
 
 int ha_myisammrg::rnd_next(uchar *buf)
 {
+  MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str,
+                       TRUE);
   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,
+                       FALSE);
   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;
 }
 

Thread
bzr commit into mysql-6.0 branch (Alexey.Kopytov:2742) Bug#40468Alexey Kopytov27 Mar 2009