Re: [pgsql-patches] Patch to avoid gprofprofilingoverwrites - Mailing list pgsql-patches

From Bruce Momjian
Subject Re: [pgsql-patches] Patch to avoid gprofprofilingoverwrites
Date
Msg-id 200702200231.l1K2VRp24903@momjian.us
Whole thread Raw
Responses Re: [pgsql-patches] Patch to avoid gprofprofilingoverwrites
List pgsql-patches
OK, I took Korry's gmon.out patch and Nikhil's configure.in patch and
made a combined version.  It seems the gmon.out and -pg flags are
GCC-specific, rather than being platform-specific, so what I did was to
allow --enable-profiling to only work with GCC.

Patch attached.

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

Nikhil S wrote:
> Hi Bruce,
>
> I saw this mail of yours a bit late. Have coded up a patch to accept
> --enable-profiling via configure. It is attached with this mail.
>
> It stores the flag in the src/template/linux file.
>
> If you have not started working on it, maybe you can review this and
> forward it to Korry if this is useful?
>
> Regards,
> Nikhils
>
> Bruce Momjian wrote:
> > korryd@enterprisedb.com wrote:
> >
> >>>>> What about a "--enable-gprof" (or "--enable-profiling"?) configure
> >>>>> flag? This could add the appropriate compiler flags to CFLAGS, enable
> >>>>> LINUX_PROFILE if on Linux, and enable the "gprof/pid" mkdir().
> >>>>>
> >>>> That would really only work for GCC, wouldn't it?
> >>>>
> >>> Well, yeah, but that's what many of us use anyway.  I would envision it
> >>> as adding $(PROFILE) to CFLAGS, and then there would be one place
> >>> to adjust "-pg" to something else for another compiler --- perhaps the
> >>> template files could be given a chance to change PROFILE to something
> >>> else.
> >>>
> >> I don't feel competent to muck around with configure.in (sorry, I'm not
> >> tying to shirk the work, I've just never had any success in writing
> >> configure/automake/autoconf stuff - I have the "leaping goats" book, but
> >> I need a small meaningful example to start with).
> >>
> >> Can someone else volunteer to make this change?  And then forward the
> >> patch to me so I can learn something useful about how to change
> >> configure.in without breaking it?
> >>
> >
> > I can work on this.
> >
> >
>


--
  Bruce Momjian  <bruce@momjian.us>          http://momjian.us
  EnterpriseDB                               http://www.enterprisedb.com

  + If your life is a hard drive, Christ can be your backup. +

Index: configure
===================================================================
RCS file: /cvsroot/pgsql/configure,v
retrieving revision 1.534
diff -c -c -r1.534 configure
*** configure    7 Feb 2007 00:28:54 -0000    1.534
--- configure    20 Feb 2007 02:18:22 -0000
***************
*** 314,320 ****
  # include <unistd.h>
  #endif"
  
! ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT
exec_prefixprefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir
libdirincludedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS
configure_argsbuild build_cpu build_vendor build_os host host_cpu host_vendor host_os PORTNAME docdir enable_nls
WANTED_LANGUAGESdefault_port enable_shared enable_rpath enable_debug DTRACE DTRACEFLAGS enable_dtrace CC CFLAGS LDFLAGS
CPPFLAGSac_ct_CC EXEEXT OBJEXT CPP GCC TAS autodepend INCLUDES enable_thread_safety with_tcl with_perl with_python
with_krb5krb_srvtab with_pam with_ldap with_bonjour with_openssl XML2_CONFIG with_zlib EGREP ELF_SYS LDFLAGS_SL AWK
FLEXFLEXFLAGS LN_S LD with_gnu_ld ld_R_works RANLIB ac_ct_RANLIB TAR STRIP ac_ct_STRIP STRIP_STATIC_LIB
STRIP_SHARED_LIBYACC YFLAGS PERL perl_archlibexp perl_privlibexp perl_useshrplib perl_embed_ldflags PYTHON
python_versionpython_configdir python_includespec python_libdir python_libspec python_additional_libs HAVE_IPV6 LIBOBJS
acx_pthread_configPTHREAD_CC PTHREAD_LIBS PTHREAD_CFLAGS LDAP_LIBS_FE LDAP_LIBS_BE HAVE_POSIX_SIGNALS MSGFMT MSGMERGE
XGETTEXTlocaledir TCLSH TCL_CONFIG_SH TCL_INCLUDE_SPEC TCL_LIB_FILE TCL_LIBS TCL_LIB_SPEC TCL_SHARED_BUILD
TCL_SHLIB_LD_LIBSNSGMLS JADE have_docbook DOCBOOKSTYLE COLLATEINDEX SGMLSPL vpath_build LTLIBOBJS'
 
  ac_subst_files=''
  
  # Initialize some variables set by options.
--- 314,320 ----
  # include <unistd.h>
  #endif"
  
! ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT
exec_prefixprefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir
libdirincludedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS
configure_argsbuild build_cpu build_vendor build_os host host_cpu host_vendor host_os PORTNAME docdir enable_nls
WANTED_LANGUAGESdefault_port enable_shared enable_rpath enable_debug enable_profiling DTRACE DTRACEFLAGS enable_dtrace
CCCFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP GCC TAS autodepend INCLUDES enable_thread_safety with_tcl
with_perlwith_python with_krb5 krb_srvtab with_pam with_ldap with_bonjour with_openssl XML2_CONFIG with_zlib EGREP
ELF_SYSLDFLAGS_SL AWK FLEX FLEXFLAGS LN_S LD with_gnu_ld ld_R_works RANLIB ac_ct_RANLIB TAR STRIP ac_ct_STRIP
STRIP_STATIC_LIBSTRIP_SHARED_LIB YACC YFLAGS PERL perl_archlibexp perl_privlibexp perl_useshrplib perl_embed_ldflags
PYTHONpython_version python_configdir python_includespec python_libdir python_libspec python_additional_libs HAVE_IPV6
LIBOBJSacx_pthread_config PTHREAD_CC PTHREAD_LIBS PTHREAD_CFLAGS LDAP_LIBS_FE LDAP_LIBS_BE HAVE_POSIX_SIGNALS MSGFMT
MSGMERGEXGETTEXT localedir TCLSH TCL_CONFIG_SH TCL_INCLUDE_SPEC TCL_LIB_FILE TCL_LIBS TCL_LIB_SPEC TCL_SHARED_BUILD
TCL_SHLIB_LD_LIBSNSGMLS JADE have_docbook DOCBOOKSTYLE COLLATEINDEX SGMLSPL vpath_build LTLIBOBJS'
 
  ac_subst_files=''
  
  # Initialize some variables set by options.
***************
*** 865,870 ****
--- 865,871 ----
    --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)
***************
*** 1949,1954 ****
--- 1950,1986 ----
  
  
  #
+ # --enable-profiling adds ${PROFILE_CFLAGS} to compiler flags
+ #
+ 
+ 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,3154 ****
--- 3181,3197 ----
    CFLAGS="$CFLAGS -g"
  fi
  
+ # supply ${PROFILE_CFLAGS} flag if --enable-profiling
+ if test "$enable_profiling" = yes && test "$ac_cv_prog_cc_g" = yes; then
+   if test "$GCC" = yes; then
+     CFLAGS="$CFLAGS -DPROFILE_PID_DIR -pg ${PROFILE_CFLAGS}"
+   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,23980 ****
--- 24018,24024 ----
  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
Index: configure.in
===================================================================
RCS file: /cvsroot/pgsql/configure.in,v
retrieving revision 1.501
diff -c -c -r1.501 configure.in
*** configure.in    7 Feb 2007 00:28:54 -0000    1.501
--- configure.in    20 Feb 2007 02:18:23 -0000
***************
*** 206,211 ****
--- 206,218 ----
  AC_SUBST(enable_debug)
  
  #
+ # --enable-profiling adds ${PROFILE_CFLAGS} to compiler flags
+ #
+ PGAC_ARG_BOOL(enable, profiling, no,
+               [  --enable-profiling      build with profiling enabled ])
+ AC_SUBST(enable_profiling)
+ 
+ #
  # DTrace
  #
  PGAC_ARG_BOOL(enable, dtrace, no,
***************
*** 297,302 ****
--- 304,318 ----
    CFLAGS="$CFLAGS -g"
  fi
  
+ # supply ${PROFILE_CFLAGS} flag if --enable-profiling
+ if test "$enable_profiling" = yes && test "$ac_cv_prog_cc_g" = yes; then
+   if test "$GCC" = yes; then
+     CFLAGS="$CFLAGS -DPROFILE_PID_DIR -pg ${PROFILE_CFLAGS}"
+   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
Index: doc/src/sgml/installation.sgml
===================================================================
RCS file: /cvsroot/pgsql/doc/src/sgml/installation.sgml,v
retrieving revision 1.284
diff -c -c -r1.284 installation.sgml
*** doc/src/sgml/installation.sgml    19 Feb 2007 18:57:18 -0000    1.284
--- doc/src/sgml/installation.sgml    20 Feb 2007 02:18:25 -0000
***************
*** 1041,1046 ****
--- 1041,1058 ----
        </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 us 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>
          <para>
Index: src/backend/storage/ipc/ipc.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/storage/ipc/ipc.c,v
retrieving revision 1.95
diff -c -c -r1.95 ipc.c
*** src/backend/storage/ipc/ipc.c    5 Jan 2007 22:19:37 -0000    1.95
--- src/backend/storage/ipc/ipc.c    20 Feb 2007 02:18:26 -0000
***************
*** 110,115 ****
--- 110,145 ----
                                    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[MAXPGPATH];
+ 
+         snprintf(gprofDirName, MAXPGPATH, "./gprof/%d", getpid());
+         
+         mkdir("./gprof", 0777);
+         mkdir(gprofDirName, 0777);
+         chdir(gprofDirName);
+     }
+ #endif
+ 
      exit(code);
  }
  

pgsql-patches by date:

Previous
From: ITAGAKI Takahiro
Date:
Subject: Re: Error correction for n_dead_tuples
Next
From: Andrew Dunstan
Date:
Subject: Re: [HACKERS] \copy (query) delimiter syntax error