mirror of
https://github.com/postgres/postgres.git
synced 2025-08-19 23:22:23 +03:00
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).
This commit is contained in:
@@ -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;
|
||||
|
||||
|
Reference in New Issue
Block a user