diff --git a/configure b/configure index 43b31ad904..b53acb350b 100755 --- a/configure +++ b/configure @@ -314,7 +314,7 @@ ac_includes_default="\ # include #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 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 XML2_CONFIG 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 LDAP_LIBS_FE LDAP_LIBS_BE 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 enable_profiling 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 XML2_CONFIG 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 LDAP_LIBS_FE LDAP_LIBS_BE 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 @@ Optional Features: --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-profiling build with profiling enabled --enable-dtrace build with DTrace support --enable-depend turn on automatic dependency tracking --enable-cassert enable assertion checks (for debugging) @@ -1948,6 +1949,37 @@ fi; +# +# --enable-profiling enables gcc profiling +# + +pgac_args="$pgac_args enable_profiling" + +# Check whether --enable-profiling or --disable-profiling was given. +if test "${enable_profiling+set}" = set; then + enableval="$enable_profiling" + + case $enableval in + yes) + : + ;; + no) + : + ;; + *) + { { echo "$as_me:$LINENO: error: no argument expected for --enable-profiling option" >&5 +echo "$as_me: error: no argument expected for --enable-profiling option" >&2;} + { (exit 1); exit 1; }; } + ;; + esac + +else + enable_profiling=no + +fi; + + + # # DTrace # @@ -3149,6 +3181,22 @@ if test "$enable_debug" = yes && test "$ac_cv_prog_cc_g" = yes; then CFLAGS="$CFLAGS -g" fi +# enable profiling if --enable-profiling +if test "$enable_profiling" = yes && test "$ac_cv_prog_cc_g" = yes; then + if test "$GCC" = yes; then + +cat >>confdefs.h <<\_ACEOF +#define PROFILE_PID_DIR 1 +_ACEOF + + CFLAGS="$CFLAGS -pg" + else + { { echo "$as_me:$LINENO: error: --enable-profiling is supported only when using GCC" >&5 +echo "$as_me: error: --enable-profiling is supported only when using GCC" >&2;} + { (exit 1); exit 1; }; } + fi +fi + { echo "$as_me:$LINENO: using CFLAGS=$CFLAGS" >&5 echo "$as_me: using CFLAGS=$CFLAGS" >&6;} @@ -23975,6 +24023,7 @@ s,@default_port@,$default_port,;t t s,@enable_shared@,$enable_shared,;t t s,@enable_rpath@,$enable_rpath,;t t s,@enable_debug@,$enable_debug,;t t +s,@enable_profiling@,$enable_profiling,;t t s,@DTRACE@,$DTRACE,;t t s,@DTRACEFLAGS@,$DTRACEFLAGS,;t t s,@enable_dtrace@,$enable_dtrace,;t t diff --git a/configure.in b/configure.in index c927bccc5d..e5d72eb1d3 100644 --- a/configure.in +++ b/configure.in @@ -1,5 +1,5 @@ dnl Process this file with autoconf to produce a configure script. -dnl $PostgreSQL: pgsql/configure.in,v 1.501 2007/02/07 00:28:54 petere Exp $ +dnl $PostgreSQL: pgsql/configure.in,v 1.502 2007/02/21 15:12:39 momjian Exp $ dnl dnl Developers, please strive to achieve this order: dnl @@ -205,6 +205,13 @@ PGAC_ARG_BOOL(enable, debug, no, [ --enable-debug build with debugging symbols (-g)]) AC_SUBST(enable_debug) +# +# --enable-profiling enables gcc profiling +# +PGAC_ARG_BOOL(enable, profiling, no, + [ --enable-profiling build with profiling enabled ]) +AC_SUBST(enable_profiling) + # # DTrace # @@ -297,6 +304,17 @@ if test "$enable_debug" = yes && test "$ac_cv_prog_cc_g" = yes; then CFLAGS="$CFLAGS -g" fi +# enable profiling if --enable-profiling +if test "$enable_profiling" = yes && test "$ac_cv_prog_cc_g" = yes; then + if test "$GCC" = yes; then + AC_DEFINE([PROFILE_PID_DIR], 1, + [Define to 1 to enable profiling. (--enable-profiling)]) + CFLAGS="$CFLAGS -pg" + else + AC_MSG_ERROR([--enable-profiling is supported only when using GCC]) + fi +fi + AC_MSG_NOTICE([using CFLAGS=$CFLAGS]) # We already have this in Makefile.win32, but configure needs it too diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml index ddd185fa42..bc7d3aef61 100644 --- a/doc/src/sgml/installation.sgml +++ b/doc/src/sgml/installation.sgml @@ -1,4 +1,4 @@ - + <![%standalone-include[<productname>PostgreSQL</>]]> @@ -1040,6 +1040,18 @@ su - postgres </listitem> </varlistentry> + <varlistentry> + <term><option>--enable-profiling</option></term> + <listitem> + <para> + If using GCC, all programs and libraries are compiled so they + can be profiled. On backend exit, a subdirectory will be created + that contains the <filename>gmon.out</> file for use in profiling. + This option is for use only with GCC and when doing development work. + </para> + </listitem> + </varlistentry> + <varlistentry> <term><option>--enable-cassert</option></term> <listitem> diff --git a/src/backend/storage/ipc/ipc.c b/src/backend/storage/ipc/ipc.c index c779d50cf3..da3eec29b4 100644 --- a/src/backend/storage/ipc/ipc.c +++ b/src/backend/storage/ipc/ipc.c @@ -13,7 +13,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/storage/ipc/ipc.c,v 1.95 2007/01/05 22:19:37 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/storage/ipc/ipc.c,v 1.96 2007/02/21 15:12:39 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -110,6 +110,36 @@ proc_exit(int code) on_proc_exit_list[on_proc_exit_index].arg); elog(DEBUG3, "exit(%d)", code); + +#ifdef PROFILE_PID_DIR + { + /* + * If we are profiling ourself then gprof's mcleanup() is about + * to write out a profile to ./gmon.out. Since mcleanup() always + * uses a fixed file name, each backend will overwrite earlier + * profiles. To fix that, we create a separate subdirectory for + * each backend (./gprof/pid) and 'cd' to that subdirectory before + * we exit() - that forces mcleanup() to write each profile into + * its own directory. We end up with something like: + * $PGDATA/gprof/8829/gmon.out + * $PGDATA/gprof/8845/gmon.out + * ... + * + * Note that we do this here instead of in an on_proc_exit() + * callback because we want to ensure that this code executes + * last - we don't want to interfere with any other on_proc_exit() + * callback. + */ + char gprofDirName[32]; + + snprintf(gprofDirName, 32, "gprof/%d", (int) getpid()); + + mkdir("gprof", 0777); + mkdir(gprofDirName, 0777); + chdir(gprofDirName); + } +#endif + exit(code); } diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index 71b8d0e7d2..132462ac09 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -602,6 +602,9 @@ /* A string containing the version number, platform, and C compiler */ #undef PG_VERSION_STR +/* Define to 1 to enable profiling. (--enable-profiling) */ +#undef PROFILE_PID_DIR + /* Define to the necessary symbol if this constant uses a non-standard name on your system. */ #undef PTHREAD_CREATE_JOINABLE