mirror of
https://github.com/postgres/postgres.git
synced 2025-11-10 17:42:29 +03:00
Add a default local latch for use in signal handlers.
To do so, move InitializeLatchSupport() into the new common process initialization functions, and add a new global variable MyLatch. MyLatch is usable as soon InitPostmasterChild() has been called (i.e. very early during startup). Initially it points to a process local latch that exists in all processes. InitProcess/InitAuxiliaryProcess then replaces that local latch with PGPROC->procLatch. During shutdown the reverse happens. This is primarily advantageous for two reasons: For one it simplifies dealing with the shared process latch, especially in signal handlers, because instead of having to check for MyProc, MyLatch can be used unconditionally. For another, a later patch that makes FEs/BE communication use latches, now can rely on the existence of a latch, even before having gone through InitProcess. Discussion: 20140927191243.GD5423@alap3.anarazel.de
This commit is contained in:
@@ -40,6 +40,15 @@ struct Port *MyProcPort;
|
||||
long MyCancelKey;
|
||||
int MyPMChildSlot;
|
||||
|
||||
/*
|
||||
* MyLatch points to the latch that should be used for signal handling by the
|
||||
* current process. It will either point to a process local latch if the
|
||||
* current process does not have a PGPROC entry in that moment, or to
|
||||
* PGPROC->procLatch if it has. Thus it can always be used in signal handlers,
|
||||
* without checking for its existence.
|
||||
*/
|
||||
struct Latch *MyLatch;
|
||||
|
||||
/*
|
||||
* DataDir is the absolute path to the top level of the PGDATA directory tree.
|
||||
* Except during early startup, this is also the server's working directory;
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
#include "postmaster/postmaster.h"
|
||||
#include "storage/fd.h"
|
||||
#include "storage/ipc.h"
|
||||
#include "storage/latch.h"
|
||||
#include "storage/pg_shmem.h"
|
||||
#include "storage/proc.h"
|
||||
#include "storage/procarray.h"
|
||||
@@ -55,6 +56,7 @@ ProcessingMode Mode = InitProcessing;
|
||||
/* List of lock files to be removed at proc exit */
|
||||
static List *lock_files = NIL;
|
||||
|
||||
static Latch LocalLatchData;
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* ignoring system indexes support stuff
|
||||
@@ -189,6 +191,11 @@ InitPostmasterChild(void)
|
||||
/* 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
|
||||
@@ -215,6 +222,11 @@ InitStandaloneProcess(const char *argv0)
|
||||
|
||||
MyStartTime = time(NULL); /* set our start time in case we call elog */
|
||||
|
||||
/* Initialize process-local latch support */
|
||||
InitializeLatchSupport();
|
||||
MyLatch = &LocalLatchData;
|
||||
InitLatch(MyLatch);
|
||||
|
||||
/* Compute paths, no postmaster to inherit from */
|
||||
if (my_exec_path[0] == '\0')
|
||||
{
|
||||
@@ -227,6 +239,31 @@ InitStandaloneProcess(const char *argv0)
|
||||
get_pkglib_path(my_exec_path, pkglib_path);
|
||||
}
|
||||
|
||||
void
|
||||
SwitchToSharedLatch(void)
|
||||
{
|
||||
Assert(MyLatch == &LocalLatchData);
|
||||
Assert(MyProc != NULL);
|
||||
|
||||
MyLatch = &MyProc->procLatch;
|
||||
/*
|
||||
* 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;
|
||||
SetLatch(MyLatch);
|
||||
}
|
||||
|
||||
/*
|
||||
* GetUserId - get the current effective user ID.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user