Peter, I'll test the patch on Solaris.  Thanks!

Regards,
-Robert


Peter Eisentraut wrote:

Here is a consolidated patch that contains all the files. I made some configure and makefile adjustments and put standard comment headers in all the files. You can use DTRACEFLAGS to pass options to configure, which should help sorting out the 32/64-bit issue. The problem of the *.d files is already gone in CVS.

Since I don't have access to a Solaris system, this is untested for the DTrace-enabled case. The only thing left to do besides actually testing that case would be moving the probes.d file to a different location, since we probably don't want to have special-purpose files in src/backend.

------------------------------------------------------------------------

diff -uNr ../cvs-pgsql/configure ./configure
--- ../cvs-pgsql/configure      2006-07-21 23:35:48.000000000 +0200
+++ ./configure 2006-07-22 01:21:54.000000000 +0200
@@ -314,7 +314,7 @@
# include <unistd.h>
#endif"

-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME 
PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix 
program_transform_name bindir sbindir libexecdir datadir sysconfdir 
sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir 
build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS 
configure_args build build_cpu build_vendor build_os host host_cpu host_vendor 
host_os PORTNAME docdir enable_nls WANTED_LANGUAGES default_port enable_shared 
enable_rpath enable_debug CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP 
GCC TAS autodepend INCLUDES enable_thread_safety with_tcl with_perl with_python 
with_krb5 krb_srvtab with_pam with_ldap with_bonjour with_openssl with_zlib 
EGREP ELF_SYS LDFLAGS_SL AWK FLEX FLEXFLAGS LN_S LD with_gnu_ld ld_R_works 
RANLIB ac_ct_RANLIB TAR STRIP ac_ct_STRIP STRIP_STATIC_LIB STRIP_SHARED_LIB 
YACC YFLAGS PERL perl_archlibexp perl_privlibexp perl_useshrplib 
perl_embed_ldflags PYTHON python_version python_configdir python_includespec 
python_libdir python_libspec python_additional_libs HAVE_IPV6 LIBOBJS 
acx_pthread_config PTHREAD_CC PTHREAD_LIBS PTHREAD_CFLAGS HAVE_POSIX_SIGNALS 
MSGFMT MSGMERGE XGETTEXT localedir TCLSH TCL_CONFIG_SH TCL_INCLUDE_SPEC 
TCL_LIB_FILE TCL_LIBS TCL_LIB_SPEC TCL_SHARED_BUILD TCL_SHLIB_LD_LIBS NSGMLS 
JADE have_docbook DOCBOOKSTYLE COLLATEINDEX SGMLSPL vpath_build LTLIBOBJS'
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME 
PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix 
program_transform_name bindir sbindir libexecdir datadir sysconfdir 
sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir 
build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS 
configure_args build build_cpu build_vendor build_os host host_cpu host_vendor 
host_os PORTNAME docdir enable_nls WANTED_LANGUAGES default_port enable_shared 
enable_rpath enable_debug DTRACE DTRACEFLAGS enable_dtrace CC CFLAGS LDFLAGS 
CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP GCC TAS autodepend INCLUDES 
enable_thread_safety with_tcl with_perl with_python with_krb5 krb_srvtab 
with_pam with_ldap with_bonjour with_openssl with_zlib EGREP ELF_SYS LDFLAGS_SL 
AWK FLEX FLEXFLAGS LN_S LD with_gnu_ld ld_R_works RANLIB ac_ct_RANLIB TAR STRIP 
ac_ct_STRIP STRIP_STATIC_LIB STRIP_SHARED_LIB YACC YFLAGS PERL perl_archlibexp 
perl_privlibexp perl_useshrplib perl_embed_ldflags PYTHON python_version 
python_configdir python_includespec python_libdir python_libspec 
python_additional_libs HAVE_IPV6 LIBOBJS acx_pthread_config PTHREAD_CC 
PTHREAD_LIBS PTHREAD_CFLAGS HAVE_POSIX_SIGNALS MSGFMT MSGMERGE XGETTEXT 
localedir TCLSH TCL_CONFIG_SH TCL_INCLUDE_SPEC TCL_LIB_FILE TCL_LIBS 
TCL_LIB_SPEC TCL_SHARED_BUILD TCL_SHLIB_LD_LIBS NSGMLS JADE have_docbook 
DOCBOOKSTYLE COLLATEINDEX SGMLSPL vpath_build LTLIBOBJS'
ac_subst_files=''

# Initialize some variables set by options.
@@ -865,6 +865,7 @@
  --disable-rpath         do not embed shared library search path in executables
  --disable-spinlocks     do not use spinlocks
  --enable-debug          build with debugging symbols (-g)
+  --enable-dtrace         build with DTrace support
  --enable-depend         turn on automatic dependency tracking
  --enable-cassert        enable assertion checks (for debugging)
  --enable-thread-safety  make client libraries thread-safe
@@ -1947,6 +1948,82 @@


#
+# DTrace
+#
+
+
+
+# Check whether --enable-dtrace or --disable-dtrace was given.
+if test "${enable_dtrace+set}" = set; then
+  enableval="$enable_dtrace"
+
+  case $enableval in
+    yes)
+
+cat >>confdefs.h <<\_ACEOF
+#define ENABLE_DTRACE 1
+_ACEOF
+
+for ac_prog in dtrace
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with 
args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_DTRACE+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$DTRACE"; then
+  ac_cv_prog_DTRACE="$DTRACE" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DTRACE="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+DTRACE=$ac_cv_prog_DTRACE
+if test -n "$DTRACE"; then
+  echo "$as_me:$LINENO: result: $DTRACE" >&5
+echo "${ECHO_T}$DTRACE" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$DTRACE" && break
+done
+
+
+      ;;
+    no)
+      :
+      ;;
+    *)
+      { { echo "$as_me:$LINENO: error: no argument expected for --enable-dtrace 
option" >&5
+echo "$as_me: error: no argument expected for --enable-dtrace option" >&2;}
+   { (exit 1); exit 1; }; }
+      ;;
+  esac
+
+else
+  enable_dtrace=no
+
+fi;
+
+
+
+#
# C compiler
#

@@ -22759,6 +22836,7 @@
enable_rpath) ;;
enable_spinlocks) ;;
enable_debug) ;;
+enable_dtrace) ;;
with_CC) ;;
enable_depend) ;;
enable_cassert) ;;
@@ -23431,6 +23509,9 @@
s,@enable_shared@,$enable_shared,;t t
s,@enable_rpath@,$enable_rpath,;t t
s,@enable_debug@,$enable_debug,;t t
+s,@DTRACE@,$DTRACE,;t t
+s,@DTRACEFLAGS@,$DTRACEFLAGS,;t t
+s,@enable_dtrace@,$enable_dtrace,;t t
s,@CC@,$CC,;t t
s,@CFLAGS@,$CFLAGS,;t t
s,@LDFLAGS@,$LDFLAGS,;t t
diff -uNr ../cvs-pgsql/configure.in ./configure.in
--- ../cvs-pgsql/configure.in   2006-07-21 23:35:48.000000000 +0200
+++ ./configure.in      2006-07-22 01:09:54.000000000 +0200
@@ -206,6 +206,17 @@
AC_SUBST(enable_debug)

#
+# DTrace
+#
+PGAC_ARG_BOOL(enable, dtrace, no,
+              [  --enable-dtrace         build with DTrace support],
+[AC_DEFINE([ENABLE_DTRACE], 1, + [Define to 1 to enable DTrace support. (--enable-dtrace)])
+AC_CHECK_PROGS(DTRACE, dtrace)
+AC_SUBST(DTRACEFLAGS)])
+AC_SUBST(enable_dtrace)
+
+#
# C compiler
#

diff -uNr ../cvs-pgsql/src/backend/access/transam/xact.c 
./src/backend/access/transam/xact.c
--- ../cvs-pgsql/src/backend/access/transam/xact.c      2006-07-21 
23:36:01.000000000 +0200
+++ ./src/backend/access/transam/xact.c 2006-07-22 00:46:42.000000000 +0200
@@ -1384,6 +1384,8 @@

        XactLockTableInsert(s->transactionId);

+       PG_TRACE1 (transaction__start, s->transactionId);
+
        /*
         * set transaction_timestamp() (a/k/a now()).  We want this to be the
         * same as the first command's statement_timestamp(), so don't do a
@@ -1535,6 +1537,8 @@
                LWLockRelease(ProcArrayLock);
        }

+       PG_TRACE1 (transaction__commit, s->transactionId);
+
        /*
         * This is all post-commit cleanup.  Note that if an error is raised 
here,
         * it's too late to abort the transaction.  This should be just
@@ -1931,6 +1935,8 @@
                LWLockRelease(ProcArrayLock);
        }

+       PG_TRACE1 (transaction__abort, s->transactionId);
+
        /*
         * Post-abort cleanup.  See notes in CommitTransaction() concerning
         * ordering.
diff -uNr ../cvs-pgsql/src/backend/Makefile ./src/backend/Makefile
--- ../cvs-pgsql/src/backend/Makefile   2006-07-21 23:36:00.000000000 +0200
+++ ./src/backend/Makefile      2006-07-22 01:21:06.000000000 +0200
@@ -19,7 +19,11 @@

SUBSYSOBJS := $(DIRS:%=%/SUBSYS.o)

-OBJS := $(SUBSYSOBJS) $(top_builddir)/src/port/libpgport_srv.a
+OBJS = $(SUBSYSOBJS) $(top_builddir)/src/port/libpgport_srv.a
+
+ifeq ($(enable_dtrace), yes)
+OBJS += probes.o
+endif

# We put libpgport into OBJS, so remove it from LIBS
LIBS := $(filter-out -lpgport, $(LIBS))
@@ -135,6 +139,10 @@
            $(LN_S) ../../../$(subdir)/utils/fmgroids.h .


+probes.o: probes.d $(SUBSYSOBJS)
+       $(DTRACE) $(DTRACEFLAGS) -G -s $^
+
+
##########################################################################

distprep:
diff -uNr ../cvs-pgsql/src/backend/probes.d ./src/backend/probes.d
--- ../cvs-pgsql/src/backend/probes.d   1970-01-01 01:00:00.000000000 +0100
+++ ./src/backend/probes.d      2006-07-22 01:17:59.000000000 +0200
@@ -0,0 +1,24 @@
+/* ----------
+ *     DTrace probes for PostgreSQL backend
+ *
+ *     Copyright (c) 2006, PostgreSQL Global Development Group
+ *
+ *     $PostgreSQL$
+ * ----------
+ */
+
+provider postgresql {
+
+probe transaction__start(int);
+probe transaction__commit(int);
+probe transaction__abort(int);
+probe lwlock__acquire(int, int);
+probe lwlock__release(int);
+probe lwlock__startwait(int, int);
+probe lwlock__endwait(int, int);
+probe lwlock__condacquire(int, int);
+probe lwlock__condacquire__fail(int, int);
+probe lock__startwait(int, int);
+probe lock__endwait(int, int);
+
+};
diff -uNr ../cvs-pgsql/src/backend/storage/lmgr/lock.c 
./src/backend/storage/lmgr/lock.c
--- ../cvs-pgsql/src/backend/storage/lmgr/lock.c        2006-07-21 
23:36:08.000000000 +0200
+++ ./src/backend/storage/lmgr/lock.c   2006-07-22 00:49:47.000000000 +0200
@@ -752,8 +752,13 @@
                /*
                 * Sleep till someone wakes me up.
                 */
+
+               PG_TRACE2(lock__startwait, locktag->locktag_field2, lockmode);
+
                WaitOnLock(locallock, owner);

+               PG_TRACE2(lock__endwait, locktag->locktag_field2, lockmode);
+
                /*
                 * NOTE: do not do any material change of state between here and
                 * return.      All required changes in locktable state must 
have been
diff -uNr ../cvs-pgsql/src/backend/storage/lmgr/lwlock.c 
./src/backend/storage/lmgr/lwlock.c
--- ../cvs-pgsql/src/backend/storage/lmgr/lwlock.c      2006-07-21 
23:36:08.000000000 +0200
+++ ./src/backend/storage/lmgr/lwlock.c 2006-07-22 00:50:23.000000000 +0200
@@ -424,6 +424,8 @@
                block_counts[lockid]++;
#endif

+               PG_TRACE2(lwlock__startwait, lockid, mode);
+
                for (;;)
                {
                        /* "false" means cannot accept cancel/die interrupt 
here. */
@@ -433,6 +435,8 @@
                        extraWaits++;
                }

+               PG_TRACE2(lwlock__endwait, lockid, mode);
+
                LOG_LWDEBUG("LWLockAcquire", lockid, "awakened");

                /* Now loop back and try to acquire lock again. */
@@ -442,6 +446,8 @@
        /* We are done updating shared state of the lock itself. */
        SpinLockRelease(&lock->mutex);

+       PG_TRACE2(lwlock__acquire, lockid, mode);
+
        /* Add lock to list of locks held by this backend */
        held_lwlocks[num_held_lwlocks++] = lockid;

@@ -511,11 +517,13 @@
                /* Failed to get lock, so release interrupt holdoff */
                RESUME_INTERRUPTS();
                LOG_LWDEBUG("LWLockConditionalAcquire", lockid, "failed");
+               PG_TRACE2(lwlock__condacquire__fail, lockid, mode);
        }
        else
        {
                /* Add lock to list of locks held by this backend */
                held_lwlocks[num_held_lwlocks++] = lockid;
+               PG_TRACE2(lwlock__condacquire, lockid, mode);
        }

        return !mustwait;
@@ -600,6 +608,8 @@
        /* We are done updating shared state of the lock itself. */
        SpinLockRelease(&lock->mutex);

+       PG_TRACE1(lwlock__release, lockid);
+
        /*
         * Awaken any waiters I removed from the queue.
         */
diff -uNr ../cvs-pgsql/src/include/c.h ./src/include/c.h
--- ../cvs-pgsql/src/include/c.h        2006-07-21 23:36:15.000000000 +0200
+++ ./src/include/c.h   2006-07-22 00:46:42.000000000 +0200
@@ -56,6 +56,7 @@
#include "pg_config_os.h"             /* must be before any system header files 
*/
#endif
#include "postgres_ext.h"
+#include "pg_trace.h"

#if defined(_MSC_VER) || defined(__BORLANDC__)
#define WIN32_ONLY_COMPILER
diff -uNr ../cvs-pgsql/src/include/pg_config.h.in ./src/include/pg_config.h.in
--- ../cvs-pgsql/src/include/pg_config.h.in     2006-07-21 23:36:15.000000000 
+0200
+++ ./src/include/pg_config.h.in        2006-07-22 00:46:42.000000000 +0200
@@ -36,6 +36,9 @@
/* Define to the default TCP port number as a string constant. */
#undef DEF_PGPORT_STR

+/* Define to 1 to enable DTrace support. (--enable-dtrace) */
+#undef ENABLE_DTRACE
+
/* Define to 1 if you want National Language Support. (--enable-nls) */
#undef ENABLE_NLS

diff -uNr ../cvs-pgsql/src/include/pg_trace.h ./src/include/pg_trace.h
--- ../cvs-pgsql/src/include/pg_trace.h 1970-01-01 01:00:00.000000000 +0100
+++ ./src/include/pg_trace.h    2006-07-22 00:54:22.000000000 +0200
@@ -0,0 +1,56 @@
+/* ----------
+ *     pg_trace.h
+ *
+ *     Definitions for the PostgreSQL tracing framework
+ *
+ *     Copyright (c) 2006, PostgreSQL Global Development Group
+ *
+ *     $PostgreSQL$
+ * ----------
+ */
+
+#ifndef PG_TRACE_H
+#define PG_TRACE_H
+
+#ifdef ENABLE_DTRACE
+
+#include <sys/sdt.h>
+
+/*
+ * The PG_TRACE macros are mapped to the appropriate macros used by DTrace.
+ *
+ * Only one DTrace provider called "postgresql" will be used for PostgreSQL,
+ * so the name is hard-coded here to avoid having to specify it in the
+ * source code. + */
+
+#define PG_TRACE(name) \
+       DTRACE_PROBE(postgresql, name)
+#define PG_TRACE1(name, arg1) \
+       DTRACE_PROBE1(postgresql, name, arg1)
+#define PG_TRACE2(name, arg1, arg2) \
+       DTRACE_PROBE2(postgresql, name, arg1, arg2)
+#define PG_TRACE3(name, arg1, arg2, arg3) \
+       DTRACE_PROBE3(postgresql, name, arg1, arg2, arg3)
+#define PG_TRACE4(name, arg1, arg2, arg3, arg4) \
+       DTRACE_PROBE4(postgresql, name, arg1, arg2, arg3, arg4)
+#define PG_TRACE5(name, arg1, arg2, arg3, arg4, arg5) \
+       DTRACE_PROBE5(postgresql, name, arg1, arg2, arg3, arg4, arg5)
+
+#else /* not ENABLE_DTRACE */
+
+/*
+ * Unless DTrace is explicitly enabled with --enable-dtrace, the PG_TRACE
+ * macros will expand to no-ops.
+ */
+
+#define PG_TRACE(name)
+#define PG_TRACE1(name, arg1)
+#define PG_TRACE2(name, arg1, arg2)
+#define PG_TRACE3(name, arg1, arg2, arg3)
+#define PG_TRACE4(name, arg1, arg2, arg3, arg4)
+#define PG_TRACE5(name, arg1, arg2, arg3, arg4, arg5)
+
+#endif /* not ENABLE_DTRACE */
+
+#endif /* PG_TRACE_H */
diff -uNr ../cvs-pgsql/src/Makefile.global.in ./src/Makefile.global.in
--- ../cvs-pgsql/src/Makefile.global.in 2006-07-22 00:37:37.000000000 +0200
+++ ./src/Makefile.global.in    2006-07-22 01:09:53.000000000 +0200
@@ -157,6 +157,7 @@
enable_rpath    = @enable_rpath@
enable_nls      = @enable_nls@
enable_debug    = @enable_debug@
+enable_dtrace  = @enable_dtrace@
enable_thread_safety    = @enable_thread_safety@

python_includespec      = @python_includespec@
@@ -212,6 +213,8 @@
YFLAGS = @YFLAGS@
FLEX = @FLEX@
FLEXFLAGS = @FLEXFLAGS@ $(LFLAGS)
+DTRACE = @DTRACE@
+DTRACEFLAGS = @DTRACEFLAGS@

# Linking




---------------------------(end of broadcast)---------------------------
TIP 6: explain analyze is your friend

Reply via email to