Commonalize process startup code.

Move common code, that was duplicated in every postmaster child/every
standalone process, into two functions in miscinit.c.  Not only does
that already result in a fair amount of net code reduction but it also
makes it much easier to remove more duplication in the future. The
prime motivation wasn't code deduplication though, but easier addition
of new common code.
This commit is contained in:
Andres Freund 2015-01-13 13:12:37 +01:00
parent 2be82dcf17
commit 31c453165b
15 changed files with 96 additions and 274 deletions

View File

@ -14,7 +14,6 @@
*/ */
#include "postgres.h" #include "postgres.h"
#include <time.h>
#include <unistd.h> #include <unistd.h>
#include <signal.h> #include <signal.h>
@ -191,19 +190,11 @@ AuxiliaryProcessMain(int argc, char *argv[])
char *userDoption = NULL; char *userDoption = NULL;
/* /*
* initialize globals * Initialize process environment (already done if under postmaster, but
* not if standalone).
*/ */
MyProcPid = getpid(); if (!IsUnderPostmaster)
InitStandaloneProcess(argv[0]);
MyStartTime = time(NULL);
/* Compute paths, if we didn't inherit them from postmaster */
if (my_exec_path[0] == '\0')
{
if (find_my_exec(progname, my_exec_path) < 0)
elog(FATAL, "%s: could not locate my own executable path",
progname);
}
/* /*
* process command arguments * process command arguments
@ -515,15 +506,6 @@ bootstrap_signals(void)
{ {
if (IsUnderPostmaster) if (IsUnderPostmaster)
{ {
/*
* If possible, make this process a group leader, so that the
* postmaster can signal any child processes too.
*/
#ifdef HAVE_SETSID
if (setsid() < 0)
elog(FATAL, "setsid() failed: %m");
#endif
/* /*
* Properly accept or ignore signals the postmaster might send us * Properly accept or ignore signals the postmaster might send us
*/ */

View File

@ -64,7 +64,6 @@
#include <signal.h> #include <signal.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/time.h> #include <sys/time.h>
#include <time.h>
#include <unistd.h> #include <unistd.h>
#include "access/heapam.h" #include "access/heapam.h"
@ -383,12 +382,11 @@ StartAutoVacLauncher(void)
#ifndef EXEC_BACKEND #ifndef EXEC_BACKEND
case 0: case 0:
/* in postmaster child ... */ /* in postmaster child ... */
InitPostmasterChild();
/* Close the postmaster's sockets */ /* Close the postmaster's sockets */
ClosePostmasterPorts(false); ClosePostmasterPorts(false);
/* Lose the postmaster's on-exit routines */
on_exit_reset();
AutoVacLauncherMain(0, NULL); AutoVacLauncherMain(0, NULL);
break; break;
#endif #endif
@ -408,16 +406,8 @@ AutoVacLauncherMain(int argc, char *argv[])
{ {
sigjmp_buf local_sigjmp_buf; sigjmp_buf local_sigjmp_buf;
/* we are a postmaster subprocess now */
IsUnderPostmaster = true;
am_autovacuum_launcher = true; am_autovacuum_launcher = true;
/* reset MyProcPid */
MyProcPid = getpid();
/* record Start Time for logging */
MyStartTime = time(NULL);
/* Identify myself via ps */ /* Identify myself via ps */
init_ps_display("autovacuum launcher process", "", "", ""); init_ps_display("autovacuum launcher process", "", "", "");
@ -429,17 +419,6 @@ AutoVacLauncherMain(int argc, char *argv[])
SetProcessingMode(InitProcessing); SetProcessingMode(InitProcessing);
/*
* If possible, make this process a group leader, so that the postmaster
* can signal any child processes too. (autovacuum probably never has any
* child processes, but for consistency we make all postmaster child
* processes do this.)
*/
#ifdef HAVE_SETSID
if (setsid() < 0)
elog(FATAL, "setsid() failed: %m");
#endif
/* /*
* Set up signal handlers. We operate on databases much like a regular * Set up signal handlers. We operate on databases much like a regular
* backend, so we use the same signal handling. See equivalent code in * backend, so we use the same signal handling. See equivalent code in
@ -1455,12 +1434,11 @@ StartAutoVacWorker(void)
#ifndef EXEC_BACKEND #ifndef EXEC_BACKEND
case 0: case 0:
/* in postmaster child ... */ /* in postmaster child ... */
InitPostmasterChild();
/* Close the postmaster's sockets */ /* Close the postmaster's sockets */
ClosePostmasterPorts(false); ClosePostmasterPorts(false);
/* Lose the postmaster's on-exit routines */
on_exit_reset();
AutoVacWorkerMain(0, NULL); AutoVacWorkerMain(0, NULL);
break; break;
#endif #endif
@ -1481,32 +1459,13 @@ AutoVacWorkerMain(int argc, char *argv[])
sigjmp_buf local_sigjmp_buf; sigjmp_buf local_sigjmp_buf;
Oid dbid; Oid dbid;
/* we are a postmaster subprocess now */
IsUnderPostmaster = true;
am_autovacuum_worker = true; am_autovacuum_worker = true;
/* reset MyProcPid */
MyProcPid = getpid();
/* record Start Time for logging */
MyStartTime = time(NULL);
/* Identify myself via ps */ /* Identify myself via ps */
init_ps_display("autovacuum worker process", "", "", ""); init_ps_display("autovacuum worker process", "", "", "");
SetProcessingMode(InitProcessing); SetProcessingMode(InitProcessing);
/*
* If possible, make this process a group leader, so that the postmaster
* can signal any child processes too. (autovacuum probably never has any
* child processes, but for consistency we make all postmaster child
* processes do this.)
*/
#ifdef HAVE_SETSID
if (setsid() < 0)
elog(FATAL, "setsid() failed: %m");
#endif
/* /*
* Set up signal handlers. We operate on databases much like a regular * Set up signal handlers. We operate on databases much like a regular
* backend, so we use the same signal handling. See equivalent code in * backend, so we use the same signal handling. See equivalent code in

View File

@ -13,7 +13,6 @@
#include "postgres.h" #include "postgres.h"
#include <unistd.h> #include <unistd.h>
#include <time.h>
#include "miscadmin.h" #include "miscadmin.h"
#include "libpq/pqsignal.h" #include "libpq/pqsignal.h"
@ -556,16 +555,8 @@ StartBackgroundWorker(void)
if (worker == NULL) if (worker == NULL)
elog(FATAL, "unable to find bgworker entry"); elog(FATAL, "unable to find bgworker entry");
/* we are a postmaster subprocess now */
IsUnderPostmaster = true;
IsBackgroundWorker = true; IsBackgroundWorker = true;
/* reset MyProcPid */
MyProcPid = getpid();
/* record Start Time for logging */
MyStartTime = time(NULL);
/* Identify myself via ps */ /* Identify myself via ps */
snprintf(buf, MAXPGPATH, "bgworker: %s", worker->bgw_name); snprintf(buf, MAXPGPATH, "bgworker: %s", worker->bgw_name);
init_ps_display(buf, "", "", ""); init_ps_display(buf, "", "", "");
@ -590,15 +581,6 @@ StartBackgroundWorker(void)
if (PostAuthDelay > 0) if (PostAuthDelay > 0)
pg_usleep(PostAuthDelay * 1000000L); pg_usleep(PostAuthDelay * 1000000L);
/*
* If possible, make this process a group leader, so that the postmaster
* can signal any child processes too.
*/
#ifdef HAVE_SETSID
if (setsid() < 0)
elog(FATAL, "setsid() failed: %m");
#endif
/* /*
* Set up signal handlers. * Set up signal handlers.
*/ */

View File

@ -36,7 +36,6 @@
#include <signal.h> #include <signal.h>
#include <sys/time.h> #include <sys/time.h>
#include <time.h>
#include <unistd.h> #include <unistd.h>
#include "access/xlog.h" #include "access/xlog.h"
@ -113,17 +112,6 @@ BackgroundWriterMain(void)
MemoryContext bgwriter_context; MemoryContext bgwriter_context;
bool prev_hibernate; bool prev_hibernate;
/*
* If possible, make this process a group leader, so that the postmaster
* can signal any child processes too. (bgwriter probably never has any
* child processes, but for consistency we make all postmaster child
* processes do this.)
*/
#ifdef HAVE_SETSID
if (setsid() < 0)
elog(FATAL, "setsid() failed: %m");
#endif
/* /*
* Properly accept or ignore signals the postmaster might send us. * Properly accept or ignore signals the postmaster might send us.
* *

View File

@ -196,17 +196,6 @@ CheckpointerMain(void)
CheckpointerShmem->checkpointer_pid = MyProcPid; CheckpointerShmem->checkpointer_pid = MyProcPid;
/*
* If possible, make this process a group leader, so that the postmaster
* can signal any child processes too. (checkpointer probably never has
* any child processes, but for consistency we make all postmaster child
* processes do this.)
*/
#ifdef HAVE_SETSID
if (setsid() < 0)
elog(FATAL, "setsid() failed: %m");
#endif
/* /*
* Properly accept or ignore signals the postmaster might send us * Properly accept or ignore signals the postmaster might send us
* *

View File

@ -157,12 +157,11 @@ pgarch_start(void)
#ifndef EXEC_BACKEND #ifndef EXEC_BACKEND
case 0: case 0:
/* in postmaster child ... */ /* in postmaster child ... */
InitPostmasterChild();
/* Close the postmaster's sockets */ /* Close the postmaster's sockets */
ClosePostmasterPorts(false); ClosePostmasterPorts(false);
/* Lose the postmaster's on-exit routines */
on_exit_reset();
/* Drop our connection to postmaster's shared memory, as well */ /* Drop our connection to postmaster's shared memory, as well */
dsm_detach_all(); dsm_detach_all();
PGSharedMemoryDetach(); PGSharedMemoryDetach();
@ -221,21 +220,6 @@ pgarch_forkexec(void)
NON_EXEC_STATIC void NON_EXEC_STATIC void
PgArchiverMain(int argc, char *argv[]) PgArchiverMain(int argc, char *argv[])
{ {
IsUnderPostmaster = true; /* we are a postmaster subprocess now */
MyProcPid = getpid(); /* reset MyProcPid */
MyStartTime = time(NULL); /* record Start Time for logging */
/*
* If possible, make this process a group leader, so that the postmaster
* can signal any child processes too.
*/
#ifdef HAVE_SETSID
if (setsid() < 0)
elog(FATAL, "setsid() failed: %m");
#endif
InitializeLatchSupport(); /* needed for latch waits */ InitializeLatchSupport(); /* needed for latch waits */
InitLatch(&mainloop_latch); /* initialize latch used in main loop */ InitLatch(&mainloop_latch); /* initialize latch used in main loop */

View File

@ -695,12 +695,11 @@ pgstat_start(void)
#ifndef EXEC_BACKEND #ifndef EXEC_BACKEND
case 0: case 0:
/* in postmaster child ... */ /* in postmaster child ... */
InitPostmasterChild();
/* Close the postmaster's sockets */ /* Close the postmaster's sockets */
ClosePostmasterPorts(false); ClosePostmasterPorts(false);
/* Lose the postmaster's on-exit routines */
on_exit_reset();
/* Drop our connection to postmaster's shared memory, as well */ /* Drop our connection to postmaster's shared memory, as well */
dsm_detach_all(); dsm_detach_all();
PGSharedMemoryDetach(); PGSharedMemoryDetach();
@ -3152,23 +3151,6 @@ PgstatCollectorMain(int argc, char *argv[])
PgStat_Msg msg; PgStat_Msg msg;
int wr; int wr;
IsUnderPostmaster = true; /* we are a postmaster subprocess now */
MyProcPid = getpid(); /* reset MyProcPid */
MyStartTime = time(NULL); /* record Start Time for logging */
/*
* If possible, make this process a group leader, so that the postmaster
* can signal any child processes too. (pgstat probably never has any
* child processes, but for consistency we make all postmaster child
* processes do this.)
*/
#ifdef HAVE_SETSID
if (setsid() < 0)
elog(FATAL, "setsid() failed: %m");
#endif
InitializeLatchSupport(); /* needed for latch waits */ InitializeLatchSupport(); /* needed for latch waits */
/* Initialize private latch for use by signal handlers */ /* Initialize private latch for use by signal handlers */

View File

@ -3811,19 +3811,8 @@ BackendStartup(Port *port)
{ {
free(bn); free(bn);
/* /* Detangle from postmaster */
* Let's clean up ourselves as the postmaster child, and close the InitPostmasterChild();
* postmaster's listen sockets. (In EXEC_BACKEND case this is all
* done in SubPostmasterMain.)
*/
IsUnderPostmaster = true; /* we are a postmaster subprocess now */
MyProcPid = getpid(); /* reset MyProcPid */
MyStartTime = time(NULL);
/* We don't want the postmaster's proc_exit() handlers */
on_exit_reset();
/* Close the postmaster's sockets */ /* Close the postmaster's sockets */
ClosePostmasterPorts(false); ClosePostmasterPorts(false);
@ -3953,16 +3942,6 @@ BackendInitialize(Port *port)
pq_init(); /* initialize libpq to talk to client */ pq_init(); /* initialize libpq to talk to client */
whereToSendOutput = DestRemote; /* now safe to ereport to client */ whereToSendOutput = DestRemote; /* now safe to ereport to client */
/*
* If possible, make this process a group leader, so that the postmaster
* can signal any child processes too. (We do this now on the off chance
* that something might spawn a child process during authentication.)
*/
#ifdef HAVE_SETSID
if (setsid() < 0)
elog(FATAL, "setsid() failed: %m");
#endif
/* /*
* We arrange for a simple exit(1) if we receive SIGTERM or SIGQUIT or * We arrange for a simple exit(1) if we receive SIGTERM or SIGQUIT or
* timeout while trying to collect the startup packet. Otherwise the * timeout while trying to collect the startup packet. Otherwise the
@ -4515,30 +4494,13 @@ SubPostmasterMain(int argc, char *argv[])
{ {
Port port; Port port;
/* Do this sooner rather than later... */
IsUnderPostmaster = true; /* we are a postmaster subprocess now */
MyProcPid = getpid(); /* reset MyProcPid */
MyStartTime = time(NULL);
/*
* make sure stderr is in binary mode before anything can possibly be
* written to it, in case it's actually the syslogger pipe, so the pipe
* chunking protocol isn't disturbed. Non-logpipe data gets translated on
* redirection (e.g. via pg_ctl -l) anyway.
*/
#ifdef WIN32
_setmode(fileno(stderr), _O_BINARY);
#endif
/* Lose the postmaster's on-exit routines (really a no-op) */
on_exit_reset();
/* In EXEC_BACKEND case we will not have inherited these settings */ /* In EXEC_BACKEND case we will not have inherited these settings */
IsPostmasterEnvironment = true; IsPostmasterEnvironment = true;
whereToSendOutput = DestNone; whereToSendOutput = DestNone;
/* Setup as postmaster child */
InitPostmasterChild();
/* Setup essential subsystems (to ensure elog() behaves sanely) */ /* Setup essential subsystems (to ensure elog() behaves sanely) */
InitializeGUCOptions(); InitializeGUCOptions();
@ -4718,6 +4680,8 @@ SubPostmasterMain(int argc, char *argv[])
/* do this as early as possible; in particular, before InitProcess() */ /* do this as early as possible; in particular, before InitProcess() */
IsBackgroundWorker = true; IsBackgroundWorker = true;
InitPostmasterChild();
/* Close the postmaster's sockets */ /* Close the postmaster's sockets */
ClosePostmasterPorts(false); ClosePostmasterPorts(false);
@ -5138,14 +5102,11 @@ StartChildProcess(AuxProcType type)
if (pid == 0) /* child */ if (pid == 0) /* child */
{ {
IsUnderPostmaster = true; /* we are a postmaster subprocess now */ InitPostmasterChild();
/* Close the postmaster's sockets */ /* Close the postmaster's sockets */
ClosePostmasterPorts(false); ClosePostmasterPorts(false);
/* Lose the postmaster's on-exit routines and port connections */
on_exit_reset();
/* Release postmaster's working memory context */ /* Release postmaster's working memory context */
MemoryContextSwitchTo(TopMemoryContext); MemoryContextSwitchTo(TopMemoryContext);
MemoryContextDelete(PostmasterContext); MemoryContextDelete(PostmasterContext);
@ -5424,12 +5385,11 @@ do_start_bgworker(RegisteredBgWorker *rw)
#ifndef EXEC_BACKEND #ifndef EXEC_BACKEND
case 0: case 0:
/* in postmaster child ... */ /* in postmaster child ... */
InitPostmasterChild();
/* Close the postmaster's sockets */ /* Close the postmaster's sockets */
ClosePostmasterPorts(false); ClosePostmasterPorts(false);
/* Lose the postmaster's on-exit routines */
on_exit_reset();
/* Do NOT release postmaster's working memory context */ /* Do NOT release postmaster's working memory context */
MyBgworkerEntry = &rw->rw_worker; MyBgworkerEntry = &rw->rw_worker;

View File

@ -177,15 +177,6 @@ HandleStartupProcInterrupts(void)
void void
StartupProcessMain(void) StartupProcessMain(void)
{ {
/*
* If possible, make this process a group leader, so that the postmaster
* can signal any child processes too.
*/
#ifdef HAVE_SETSID
if (setsid() < 0)
elog(FATAL, "setsid() failed: %m");
#endif
/* /*
* Properly accept or ignore signals the postmaster might send us. * Properly accept or ignore signals the postmaster might send us.
*/ */

View File

@ -164,11 +164,6 @@ SysLoggerMain(int argc, char *argv[])
int currentLogRotationAge; int currentLogRotationAge;
pg_time_t now; pg_time_t now;
IsUnderPostmaster = true; /* we are a postmaster subprocess now */
MyProcPid = getpid(); /* reset MyProcPid */
MyStartTime = time(NULL); /* set our start time in case we call elog */
now = MyStartTime; now = MyStartTime;
#ifdef EXEC_BACKEND #ifdef EXEC_BACKEND
@ -236,19 +231,9 @@ SysLoggerMain(int argc, char *argv[])
syslogPipe[1] = 0; syslogPipe[1] = 0;
#endif #endif
/*
* If possible, make this process a group leader, so that the postmaster
* can signal any child processes too. (syslogger probably never has any
* child processes, but for consistency we make all postmaster child
* processes do this.)
*/
#ifdef HAVE_SETSID
if (setsid() < 0)
elog(FATAL, "setsid() failed: %m");
#endif
InitializeLatchSupport(); /* needed for latch waits */ InitializeLatchSupport(); /* needed for latch waits */
/* Initialize private latch for use by signal handlers */ /* Initialize private latch for use by signal handlers */
InitLatch(&sysLoggerLatch); InitLatch(&sysLoggerLatch);
@ -609,12 +594,11 @@ SysLogger_Start(void)
#ifndef EXEC_BACKEND #ifndef EXEC_BACKEND
case 0: case 0:
/* in postmaster child ... */ /* in postmaster child ... */
InitPostmasterChild();
/* Close the postmaster's sockets */ /* Close the postmaster's sockets */
ClosePostmasterPorts(true); ClosePostmasterPorts(true);
/* Lose the postmaster's on-exit routines */
on_exit_reset();
/* Drop our connection to postmaster's shared memory, as well */ /* Drop our connection to postmaster's shared memory, as well */
dsm_detach_all(); dsm_detach_all();
PGSharedMemoryDetach(); PGSharedMemoryDetach();

View File

@ -42,8 +42,6 @@
#include "postgres.h" #include "postgres.h"
#include <signal.h> #include <signal.h>
#include <sys/time.h>
#include <time.h>
#include <unistd.h> #include <unistd.h>
#include "access/xlog.h" #include "access/xlog.h"
@ -101,17 +99,6 @@ WalWriterMain(void)
int left_till_hibernate; int left_till_hibernate;
bool hibernating; bool hibernating;
/*
* If possible, make this process a group leader, so that the postmaster
* can signal any child processes too. (walwriter probably never has any
* child processes, but for consistency we make all postmaster child
* processes do this.)
*/
#ifdef HAVE_SETSID
if (setsid() < 0)
elog(FATAL, "setsid() failed: %m");
#endif
/* /*
* Properly accept or ignore signals the postmaster might send us * Properly accept or ignore signals the postmaster might send us
* *

View File

@ -256,17 +256,6 @@ WalReceiverMain(void)
OwnLatch(&walrcv->latch); OwnLatch(&walrcv->latch);
/*
* If possible, make this process a group leader, so that the postmaster
* can signal any child processes too. (walreceiver probably never has
* any child processes, but for consistency we make all postmaster child
* processes do this.)
*/
#ifdef HAVE_SETSID
if (setsid() < 0)
elog(FATAL, "setsid() failed: %m");
#endif
/* Properly accept or ignore signals the postmaster might send us */ /* Properly accept or ignore signals the postmaster might send us */
pqsignal(SIGHUP, WalRcvSigHupHandler); /* set flag to read config pqsignal(SIGHUP, WalRcvSigHupHandler); /* set flag to read config
* file */ * file */

View File

@ -22,7 +22,6 @@
#include <fcntl.h> #include <fcntl.h>
#include <limits.h> #include <limits.h>
#include <signal.h> #include <signal.h>
#include <time.h>
#include <unistd.h> #include <unistd.h>
#include <sys/socket.h> #include <sys/socket.h>
#ifdef HAVE_SYS_SELECT_H #ifdef HAVE_SYS_SELECT_H
@ -3536,30 +3535,12 @@ PostgresMain(int argc, char *argv[],
sigjmp_buf local_sigjmp_buf; sigjmp_buf local_sigjmp_buf;
volatile bool send_ready_for_query = true; volatile bool send_ready_for_query = true;
/* /* Initialize startup process environment if necessary. */
* Initialize globals (already done if under postmaster, but not if
* standalone).
*/
if (!IsUnderPostmaster) if (!IsUnderPostmaster)
{ InitStandaloneProcess(argv[0]);
MyProcPid = getpid();
MyStartTime = time(NULL);
}
SetProcessingMode(InitProcessing); SetProcessingMode(InitProcessing);
/* Compute paths, if we didn't inherit them from postmaster */
if (my_exec_path[0] == '\0')
{
if (find_my_exec(argv[0], my_exec_path) < 0)
elog(FATAL, "%s: could not locate my own executable path",
argv[0]);
}
if (pkglib_path[0] == '\0')
get_pkglib_path(my_exec_path, pkglib_path);
/* /*
* Set default values for command-line options. * Set default values for command-line options.
*/ */
@ -3589,11 +3570,6 @@ PostgresMain(int argc, char *argv[],
proc_exit(1); proc_exit(1);
} }
/*
* You might expect to see a setsid() call here, but it's not needed,
* because if we are under a postmaster then BackendInitialize() did it.
*/
/* /*
* Set up signal handlers and masks. * Set up signal handlers and masks.
* *

View File

@ -16,9 +16,11 @@
#include <sys/param.h> #include <sys/param.h>
#include <signal.h> #include <signal.h>
#include <time.h>
#include <sys/file.h> #include <sys/file.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/time.h> #include <sys/time.h>
#include <sys/types.h>
#include <fcntl.h> #include <fcntl.h>
#include <unistd.h> #include <unistd.h>
#include <grp.h> #include <grp.h>
@ -160,6 +162,70 @@ static int SecurityRestrictionContext = 0;
/* We also remember if a SET ROLE is currently active */ /* We also remember if a SET ROLE is currently active */
static bool SetRoleIsActive = false; static bool SetRoleIsActive = false;
/*
* Initialize the basic environment for a postmaster child
*
* Should be called as early as possible after the child's startup.
*/
void
InitPostmasterChild(void)
{
IsUnderPostmaster = true; /* we are a postmaster subprocess now */
MyProcPid = getpid(); /* reset MyProcPid */
MyStartTime = time(NULL); /* set our start time in case we call elog */
/*
* make sure stderr is in binary mode before anything can possibly be
* written to it, in case it's actually the syslogger pipe, so the pipe
* chunking protocol isn't disturbed. Non-logpipe data gets translated on
* redirection (e.g. via pg_ctl -l) anyway.
*/
#ifdef WIN32
_setmode(fileno(stderr), _O_BINARY);
#endif
/* We don't want the postmaster's proc_exit() handlers */
on_exit_reset();
/*
* If possible, make this process a group leader, so that the postmaster
* can signal any child processes too. Not all processes will have
* children, but for consistency we , but for consistency we make all
* postmaster child processes do this.
*/
#ifdef HAVE_SETSID
if (setsid() < 0)
elog(FATAL, "setsid() failed: %m");
#endif
}
/*
* Initialize the basic environment for a standalone process.
*
* argv0 has to be suitable to find the program's executable.
*/
void
InitStandaloneProcess(const char *argv0)
{
Assert(!IsPostmasterEnvironment);
MyProcPid = getpid(); /* reset MyProcPid */
MyStartTime = time(NULL); /* set our start time in case we call elog */
/* Compute paths, no postmaster to inherit from */
if (my_exec_path[0] == '\0')
{
if (find_my_exec(argv0, my_exec_path) < 0)
elog(FATAL, "%s: could not locate my own executable path",
argv0);
}
if (pkglib_path[0] == '\0')
get_pkglib_path(my_exec_path, pkglib_path);
}
/* /*
* GetUserId - get the current effective user ID. * GetUserId - get the current effective user ID.

View File

@ -277,6 +277,9 @@ extern int trace_recovery(int trace_level);
extern char *DatabasePath; extern char *DatabasePath;
/* now in utils/init/miscinit.c */ /* now in utils/init/miscinit.c */
extern void InitPostmasterChild(void);
extern void InitStandaloneProcess(const char *argv0);
extern void SetDatabasePath(const char *path); extern void SetDatabasePath(const char *path);
extern char *GetUserNameFromId(Oid roleid); extern char *GetUserNameFromId(Oid roleid);