diff options
author | Peter Eisentraut <peter@eisentraut.org> | 2020-03-11 13:51:55 +0100 |
---|---|---|
committer | Peter Eisentraut <peter@eisentraut.org> | 2020-03-11 13:51:55 +0100 |
commit | 1c918381814ca6ff976aab2bf130b0c582ca30e4 (patch) | |
tree | 6129162bd282ccead8f4aabc3740d90ebcb59a05 /src | |
parent | aaa3aeddee51dd0058d38469907865052706a590 (diff) | |
download | postgresql-1c918381814ca6ff976aab2bf130b0c582ca30e4.tar.gz postgresql-1c918381814ca6ff976aab2bf130b0c582ca30e4.zip |
Clean up order in miscinit.c a bit
The code around InitPostmasterChild() from commit 31c453165b5 somehow
ended up in the middle of a block of code related to "User ID state".
Move it into its own block instead.
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/utils/init/miscinit.c | 220 | ||||
-rw-r--r-- | src/include/miscadmin.h | 12 |
2 files changed, 118 insertions, 114 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(). diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h index f985453ec32..6b9093733fb 100644 --- a/src/include/miscadmin.h +++ b/src/include/miscadmin.h @@ -303,8 +303,13 @@ extern char *DatabasePath; /* now in utils/init/miscinit.c */ extern void InitPostmasterChild(void); extern void InitStandaloneProcess(const char *argv0); +extern void SwitchToSharedLatch(void); +extern void SwitchBackToLocalLatch(void); extern void SetDatabasePath(const char *path); +extern void checkDataDir(void); +extern void SetDataDir(const char *dir); +extern void ChangeToDataDir(void); extern char *GetUserNameFromId(Oid roleid, bool noerr); extern Oid GetUserId(void); @@ -324,13 +329,6 @@ extern void SetSessionAuthorization(Oid userid, bool is_superuser); extern Oid GetCurrentRoleId(void); extern void SetCurrentRoleId(Oid roleid, bool is_superuser); -extern void checkDataDir(void); -extern void SetDataDir(const char *dir); -extern void ChangeToDataDir(void); - -extern void SwitchToSharedLatch(void); -extern void SwitchBackToLocalLatch(void); - /* in utils/misc/superuser.c */ extern bool superuser(void); /* current user is superuser */ extern bool superuser_arg(Oid roleid); /* given user is superuser */ |