diff options
author | Noah Misch <noah@leadboat.com> | 2015-01-07 22:35:44 -0500 |
---|---|---|
committer | Noah Misch <noah@leadboat.com> | 2015-01-07 22:35:44 -0500 |
commit | 894459e59ffa5c7fee297b246c17e1f72564db1d (patch) | |
tree | 852b8503ace4e86b14c552254fced85c97186ce3 /src/common/exec.c | |
parent | 6fdba8ceb071a3512d5685f1cd4f971ab4d562d1 (diff) | |
download | postgresql-894459e59ffa5c7fee297b246c17e1f72564db1d.tar.gz postgresql-894459e59ffa5c7fee297b246c17e1f72564db1d.zip |
On Darwin, detect and report a multithreaded postmaster.
Darwin --enable-nls builds use a substitute setlocale() that may start a
thread. Buildfarm member orangutan experienced BackendList corruption
on account of different postmaster threads executing signal handlers
simultaneously. Furthermore, a multithreaded postmaster risks undefined
behavior from sigprocmask() and fork(). Emit LOG messages about the
problem and its workaround. Back-patch to 9.0 (all supported versions).
Diffstat (limited to 'src/common/exec.c')
-rw-r--r-- | src/common/exec.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/src/common/exec.c b/src/common/exec.c index b31d621e370..e5575d5f50e 100644 --- a/src/common/exec.c +++ b/src/common/exec.c @@ -556,8 +556,20 @@ set_pglocale_pgservice(const char *argv0, const char *app) /* don't set LC_ALL in the backend */ if (strcmp(app, PG_TEXTDOMAIN("postgres")) != 0) + { setlocale(LC_ALL, ""); + /* + * One could make a case for reproducing here PostmasterMain()'s test + * for whether the process is multithreaded. Unlike the postmaster, + * no frontend program calls sigprocmask() or otherwise provides for + * mutual exclusion between signal handlers. While frontends using + * fork(), if multithreaded, are formally exposed to undefined + * behavior, we have not witnessed a concrete bug. Therefore, + * complaining about multithreading here may be mere pedantry. + */ + } + if (find_my_exec(argv0, my_exec_path) < 0) return; |