Skip to content

Commit 8d8aa93

Browse files
committed
Add code to allow profiling of backends on Linux: save and restore the
profiling timer setting across fork(). The correct way to build a profilable backend on Linux is now gmake PROFILE="-pg -DLINUX_PROFILE"
1 parent 78ab803 commit 8d8aa93

File tree

1 file changed

+44
-3
lines changed

1 file changed

+44
-3
lines changed

src/backend/postmaster/postmaster.c

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
*
3838
*
3939
* IDENTIFICATION
40-
* $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.267 2002/02/23 01:31:35 petere Exp $
40+
* $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.268 2002/03/02 20:46:12 tgl Exp $
4141
*
4242
* NOTES
4343
*
@@ -769,6 +769,14 @@ pmdaemonize(int argc, char *argv[])
769769
{
770770
int i;
771771
pid_t pid;
772+
#ifdef LINUX_PROFILE
773+
struct itimerval prof_itimer;
774+
#endif
775+
776+
#ifdef LINUX_PROFILE
777+
/* see comments in BackendStartup */
778+
getitimer(ITIMER_PROF, &prof_itimer);
779+
#endif
772780

773781
pid = fork();
774782
if (pid == (pid_t) -1)
@@ -783,6 +791,10 @@ pmdaemonize(int argc, char *argv[])
783791
_exit(0);
784792
}
785793

794+
#ifdef LINUX_PROFILE
795+
setitimer(ITIMER_PROF, &prof_itimer, NULL);
796+
#endif
797+
786798
MyProcPid = getpid(); /* reset MyProcPid to child */
787799

788800
/* GH: If there's no setsid(), we hopefully don't need silent mode.
@@ -1801,13 +1813,16 @@ SignalChildren(int signal)
18011813
/*
18021814
* BackendStartup -- start backend process
18031815
*
1804-
* returns: STATUS_ERROR if the fork/exec failed, STATUS_OK otherwise.
1816+
* returns: STATUS_ERROR if the fork failed, STATUS_OK otherwise.
18051817
*/
18061818
static int
18071819
BackendStartup(Port *port)
18081820
{
18091821
Backend *bn; /* for backend cleanup */
18101822
pid_t pid;
1823+
#ifdef LINUX_PROFILE
1824+
struct itimerval prof_itimer;
1825+
#endif
18111826

18121827
/*
18131828
* Compute the cancel key that will be assigned to this backend. The
@@ -1838,6 +1853,16 @@ BackendStartup(Port *port)
18381853
fflush(stdout);
18391854
fflush(stderr);
18401855

1856+
#ifdef LINUX_PROFILE
1857+
/*
1858+
* Linux's fork() resets the profiling timer in the child process.
1859+
* If we want to profile child processes then we need to save and restore
1860+
* the timer setting. This is a waste of time if not profiling, however,
1861+
* so only do it if commanded by specific -DLINUX_PROFILE switch.
1862+
*/
1863+
getitimer(ITIMER_PROF, &prof_itimer);
1864+
#endif
1865+
18411866
#ifdef __BEOS__
18421867
/* Specific beos actions before backend startup */
18431868
beos_before_backend_startup();
@@ -1849,6 +1874,10 @@ BackendStartup(Port *port)
18491874
{
18501875
int status;
18511876

1877+
#ifdef LINUX_PROFILE
1878+
setitimer(ITIMER_PROF, &prof_itimer, NULL);
1879+
#endif
1880+
18521881
#ifdef __BEOS__
18531882
/* Specific beos backend startup actions */
18541883
beos_backend_startup();
@@ -2487,10 +2516,18 @@ SSDataBase(int xlop)
24872516
{
24882517
pid_t pid;
24892518
Backend *bn;
2519+
#ifdef LINUX_PROFILE
2520+
struct itimerval prof_itimer;
2521+
#endif
24902522

24912523
fflush(stdout);
24922524
fflush(stderr);
24932525

2526+
#ifdef LINUX_PROFILE
2527+
/* see comments in BackendStartup */
2528+
getitimer(ITIMER_PROF, &prof_itimer);
2529+
#endif
2530+
24942531
#ifdef __BEOS__
24952532
/* Specific beos actions before backend startup */
24962533
beos_before_backend_startup();
@@ -2505,6 +2542,10 @@ SSDataBase(int xlop)
25052542
char dbbuf[ARGV_SIZE];
25062543
char xlbuf[ARGV_SIZE];
25072544

2545+
#ifdef LINUX_PROFILE
2546+
setitimer(ITIMER_PROF, &prof_itimer, NULL);
2547+
#endif
2548+
25082549
#ifdef __BEOS__
25092550
/* Specific beos actions after backend startup */
25102551
beos_backend_startup();
@@ -2603,7 +2644,7 @@ SSDataBase(int xlop)
26032644
*/
26042645
if (xlop == BS_XLOG_CHECKPOINT)
26052646
{
2606-
if (!(bn = (Backend *) calloc(1, sizeof(Backend))))
2647+
if (!(bn = (Backend *) malloc(sizeof(Backend))))
26072648
{
26082649
elog(DEBUG, "CheckPointDataBase: malloc failed");
26092650
ExitPostmaster(1);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy