diff options
Diffstat (limited to 'src/backend/utils/init/miscinit.c')
-rw-r--r-- | src/backend/utils/init/miscinit.c | 220 |
1 files changed, 113 insertions, 107 deletions
diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index b02bad44203..cd099b0c709 100644 --- a/src/backend/utils/init/miscinit.c +++ b/src/backend/utils/init/miscinit.c @@ -76,6 +76,119 @@ bool IgnoreSystemIndexes = false; /* ---------------------------------------------------------------- + * common process startup code + * ---------------------------------------------------------------- + */ + +/* + * 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 */ + + InitProcessGlobals(); + + /* + * 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(); + + /* Initialize process-local latch support */ + InitializeLatchSupport(); + MyLatch = &LocalLatchData; + InitLatch(MyLatch); + + /* + * 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 make all postmaster child processes do + * this. + */ +#ifdef HAVE_SETSID + if (setsid() < 0) + elog(FATAL, "setsid() failed: %m"); +#endif + + /* Request a signal if the postmaster dies, if possible. */ + PostmasterDeathSignalInit(); +} + +/* + * 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); + + InitProcessGlobals(); + + /* Initialize process-local latch support */ + InitializeLatchSupport(); + MyLatch = &LocalLatchData; + InitLatch(MyLatch); + + /* 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); +} + +void +SwitchToSharedLatch(void) +{ + Assert(MyLatch == &LocalLatchData); + Assert(MyProc != NULL); + + MyLatch = &MyProc->procLatch; + + if (FeBeWaitSet) + ModifyWaitEvent(FeBeWaitSet, 1, WL_LATCH_SET, MyLatch); + + /* + * Set the shared latch as the local one might have been set. This + * shouldn't normally be necessary as code is supposed to check the + * condition before waiting for the latch, but a bit care can't hurt. + */ + SetLatch(MyLatch); +} + +void +SwitchBackToLocalLatch(void) +{ + Assert(MyLatch != &LocalLatchData); + Assert(MyProc != NULL && MyLatch == &MyProc->procLatch); + + MyLatch = &LocalLatchData; + + if (FeBeWaitSet) + ModifyWaitEvent(FeBeWaitSet, 1, WL_LATCH_SET, MyLatch); + + SetLatch(MyLatch); +} + + +/* ---------------------------------------------------------------- * database path / name support stuff * ---------------------------------------------------------------- */ @@ -263,113 +376,6 @@ static int SecurityRestrictionContext = 0; 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 */ - - InitProcessGlobals(); - - /* - * 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(); - - /* Initialize process-local latch support */ - InitializeLatchSupport(); - MyLatch = &LocalLatchData; - InitLatch(MyLatch); - - /* - * 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 make all postmaster child processes do - * this. - */ -#ifdef HAVE_SETSID - if (setsid() < 0) - elog(FATAL, "setsid() failed: %m"); -#endif - - /* Request a signal if the postmaster dies, if possible. */ - PostmasterDeathSignalInit(); -} - -/* - * 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); - - InitProcessGlobals(); - - /* Initialize process-local latch support */ - InitializeLatchSupport(); - MyLatch = &LocalLatchData; - InitLatch(MyLatch); - - /* 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); -} - -void -SwitchToSharedLatch(void) -{ - Assert(MyLatch == &LocalLatchData); - Assert(MyProc != NULL); - - MyLatch = &MyProc->procLatch; - - if (FeBeWaitSet) - ModifyWaitEvent(FeBeWaitSet, 1, WL_LATCH_SET, MyLatch); - - /* - * Set the shared latch as the local one might have been set. This - * shouldn't normally be necessary as code is supposed to check the - * condition before waiting for the latch, but a bit care can't hurt. - */ - SetLatch(MyLatch); -} - -void -SwitchBackToLocalLatch(void) -{ - Assert(MyLatch != &LocalLatchData); - Assert(MyProc != NULL && MyLatch == &MyProc->procLatch); - - MyLatch = &LocalLatchData; - - if (FeBeWaitSet) - ModifyWaitEvent(FeBeWaitSet, 1, WL_LATCH_SET, MyLatch); - - SetLatch(MyLatch); -} - -/* * GetUserId - get the current effective user ID. * * Note: there's no SetUserId() anymore; use SetUserIdAndSecContext(). |