#include "postgres.h"#include <signal.h>#include <unistd.h>#include "miscadmin.h"#include "postmaster/postmaster.h"#include "replication/walsender.h"#include "storage/pmsignal.h"#include "storage/shmem.h"
Go to the source code of this file.
Data Structures | |
| struct | PMSignalData |
Defines | |
| #define | PM_CHILD_UNUSED 0 |
| #define | PM_CHILD_ASSIGNED 1 |
| #define | PM_CHILD_ACTIVE 2 |
| #define | PM_CHILD_WALSENDER 3 |
Functions | |
| Size | PMSignalShmemSize (void) |
| void | PMSignalShmemInit (void) |
| void | SendPostmasterSignal (PMSignalReason reason) |
| bool | CheckPostmasterSignal (PMSignalReason reason) |
| int | AssignPostmasterChildSlot (void) |
| bool | ReleasePostmasterChildSlot (int slot) |
| bool | IsPostmasterChildWalSender (int slot) |
| void | MarkPostmasterChildActive (void) |
| void | MarkPostmasterChildWalSender (void) |
| void | MarkPostmasterChildInactive (void) |
| bool | PostmasterIsAlive (void) |
Variables | |
| NON_EXEC_STATIC volatile PMSignalData * | PMSignalState = NULL |
| #define PM_CHILD_ACTIVE 2 |
Definition at line 58 of file pmsignal.c.
Referenced by MarkPostmasterChildInactive(), and MarkPostmasterChildWalSender().
| #define PM_CHILD_ASSIGNED 1 |
Definition at line 57 of file pmsignal.c.
Referenced by MarkPostmasterChildActive().
| #define PM_CHILD_UNUSED 0 |
Definition at line 56 of file pmsignal.c.
Referenced by AssignPostmasterChildSlot().
| #define PM_CHILD_WALSENDER 3 |
Definition at line 59 of file pmsignal.c.
Referenced by IsPostmasterChildWalSender(), and MarkPostmasterChildInactive().
| int AssignPostmasterChildSlot | ( | void | ) |
Definition at line 151 of file pmsignal.c.
References elog, FATAL, PMSignalData::next_child_flag, PMSignalData::num_child_flags, PM_CHILD_UNUSED, PMSignalData::PMChildFlags, and PMSignalState.
Referenced by assign_backendlist_entry(), BackendStartup(), StartAutovacuumWorker(), and StartOneBackgroundWorker().
{
int slot = PMSignalState->next_child_flag;
int n;
/*
* Scan for a free slot. We track the last slot assigned so as not to
* waste time repeatedly rescanning low-numbered slots.
*/
for (n = PMSignalState->num_child_flags; n > 0; n--)
{
if (--slot < 0)
slot = PMSignalState->num_child_flags - 1;
if (PMSignalState->PMChildFlags[slot] == PM_CHILD_UNUSED)
{
PMSignalState->PMChildFlags[slot] = PM_CHILD_ASSIGNED;
PMSignalState->next_child_flag = slot;
return slot + 1;
}
}
/* Out of slots ... should never happen, else postmaster.c messed up */
elog(FATAL, "no free slots in PMChildFlags array");
return 0; /* keep compiler quiet */
}
| bool CheckPostmasterSignal | ( | PMSignalReason | reason | ) |
Definition at line 130 of file pmsignal.c.
References PMSignalData::PMSignalFlags, and PMSignalState.
Referenced by sigusr1_handler().
{
/* Careful here --- don't clear flag if we haven't seen it set */
if (PMSignalState->PMSignalFlags[reason])
{
PMSignalState->PMSignalFlags[reason] = false;
return true;
}
return false;
}
| bool IsPostmasterChildWalSender | ( | int | slot | ) |
Definition at line 207 of file pmsignal.c.
References Assert, PM_CHILD_WALSENDER, PMSignalData::PMChildFlags, and PMSignalState.
Referenced by CountChildren(), and SignalSomeChildren().
{
Assert(slot > 0 && slot <= PMSignalState->num_child_flags);
slot--;
if (PMSignalState->PMChildFlags[slot] == PM_CHILD_WALSENDER)
return true;
else
return false;
}
| void MarkPostmasterChildActive | ( | void | ) |
Definition at line 223 of file pmsignal.c.
References Assert, MyPMChildSlot, PM_CHILD_ASSIGNED, PMSignalData::PMChildFlags, and PMSignalState.
Referenced by InitProcess().
{
int slot = MyPMChildSlot;
Assert(slot > 0 && slot <= PMSignalState->num_child_flags);
slot--;
Assert(PMSignalState->PMChildFlags[slot] == PM_CHILD_ASSIGNED);
PMSignalState->PMChildFlags[slot] = PM_CHILD_ACTIVE;
}
| void MarkPostmasterChildInactive | ( | void | ) |
Definition at line 256 of file pmsignal.c.
References Assert, MyPMChildSlot, PM_CHILD_ACTIVE, PM_CHILD_WALSENDER, PMSignalData::PMChildFlags, and PMSignalState.
Referenced by ProcKill().
{
int slot = MyPMChildSlot;
Assert(slot > 0 && slot <= PMSignalState->num_child_flags);
slot--;
Assert(PMSignalState->PMChildFlags[slot] == PM_CHILD_ACTIVE ||
PMSignalState->PMChildFlags[slot] == PM_CHILD_WALSENDER);
PMSignalState->PMChildFlags[slot] = PM_CHILD_ASSIGNED;
}
| void MarkPostmasterChildWalSender | ( | void | ) |
Definition at line 239 of file pmsignal.c.
References am_walsender, Assert, MyPMChildSlot, PM_CHILD_ACTIVE, PMSignalData::PMChildFlags, and PMSignalState.
Referenced by InitWalSender().
{
int slot = MyPMChildSlot;
Assert(am_walsender);
Assert(slot > 0 && slot <= PMSignalState->num_child_flags);
slot--;
Assert(PMSignalState->PMChildFlags[slot] == PM_CHILD_ACTIVE);
PMSignalState->PMChildFlags[slot] = PM_CHILD_WALSENDER;
}
| void PMSignalShmemInit | ( | void | ) |
Definition at line 95 of file pmsignal.c.
References MaxLivePostmasterChildren(), MemSet, PMSignalData::num_child_flags, PMSignalShmemSize(), PMSignalState, and ShmemInitStruct().
Referenced by CreateSharedMemoryAndSemaphores().
{
bool found;
PMSignalState = (PMSignalData *)
ShmemInitStruct("PMSignalState", PMSignalShmemSize(), &found);
if (!found)
{
MemSet(PMSignalState, 0, PMSignalShmemSize());
PMSignalState->num_child_flags = MaxLivePostmasterChildren();
}
}
| Size PMSignalShmemSize | ( | void | ) |
Definition at line 80 of file pmsignal.c.
References add_size(), MaxLivePostmasterChildren(), mul_size(), and offsetof.
Referenced by CreateSharedMemoryAndSemaphores(), and PMSignalShmemInit().
{
Size size;
size = offsetof(PMSignalData, PMChildFlags);
size = add_size(size, mul_size(MaxLivePostmasterChildren(),
sizeof(sig_atomic_t)));
return size;
}
| bool PostmasterIsAlive | ( | void | ) |
Definition at line 272 of file pmsignal.c.
References EAGAIN, elog, EWOULDBLOCK, FATAL, postmaster_alive_fds, POSTMASTER_FD_WATCH, and read.
Referenced by HandleStartupProcInterrupts(), pgarch_ArchiverCopyLoop(), pgarch_MainLoop(), SyncRepWaitForLSN(), WaitLatchOrSocket(), WalRcvWaitForStartPosition(), WalReceiverMain(), and WalSndLoop().
{
#ifndef WIN32
char c;
ssize_t rc;
rc = read(postmaster_alive_fds[POSTMASTER_FD_WATCH], &c, 1);
if (rc < 0)
{
if (errno == EAGAIN || errno == EWOULDBLOCK)
return true;
else
elog(FATAL, "read on postmaster death monitoring pipe failed: %m");
}
else if (rc > 0)
elog(FATAL, "unexpected data in postmaster death monitoring pipe");
return false;
#else /* WIN32 */
return (WaitForSingleObject(PostmasterHandle, 0) == WAIT_TIMEOUT);
#endif /* WIN32 */
}
| bool ReleasePostmasterChildSlot | ( | int | slot | ) |
Definition at line 185 of file pmsignal.c.
References Assert, PMSignalData::PMChildFlags, and PMSignalState.
Referenced by BackendStartup(), CleanupBackend(), CleanupBackgroundWorker(), HandleChildCrash(), and StartAutovacuumWorker().
{
bool result;
Assert(slot > 0 && slot <= PMSignalState->num_child_flags);
slot--;
/*
* Note: the slot state might already be unused, because the logic in
* postmaster.c is such that this might get called twice when a child
* crashes. So we don't try to Assert anything about the state.
*/
result = (PMSignalState->PMChildFlags[slot] == PM_CHILD_ASSIGNED);
PMSignalState->PMChildFlags[slot] = PM_CHILD_UNUSED;
return result;
}
| void SendPostmasterSignal | ( | PMSignalReason | reason | ) |
Definition at line 113 of file pmsignal.c.
References IsUnderPostmaster, PMSignalData::PMSignalFlags, PMSignalState, PostmasterPid, and SIGUSR1.
Referenced by AutoVacLauncherMain(), CheckRecoveryConsistency(), do_start_worker(), GetNewMultiXactId(), GetNewTransactionId(), InitWalSender(), pg_rotate_logfile(), RequestXLogStreaming(), SetMultiXactIdLimit(), SetTransactionIdLimit(), StartupXLOG(), and XLogArchiveNotify().
{
/* If called in a standalone backend, do nothing */
if (!IsUnderPostmaster)
return;
/* Atomically set the proper flag */
PMSignalState->PMSignalFlags[reason] = true;
/* Send signal to postmaster */
kill(PostmasterPid, SIGUSR1);
}
| NON_EXEC_STATIC volatile PMSignalData* PMSignalState = NULL |
Definition at line 72 of file pmsignal.c.
Referenced by AssignPostmasterChildSlot(), CheckPostmasterSignal(), IsPostmasterChildWalSender(), MarkPostmasterChildActive(), MarkPostmasterChildInactive(), MarkPostmasterChildWalSender(), PMSignalShmemInit(), ReleasePostmasterChildSlot(), and SendPostmasterSignal().
1.7.1