PostgreSQL Source Code git master
Loading...
Searching...
No Matches
pmsignal.h File Reference
#include <signal.h>
Include dependency graph for pmsignal.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define NUM_PMSIGNALS   (PMSIGNAL_XLOG_IS_SHUTDOWN+1)
 
#define PostmasterIsAlive()   PostmasterIsAliveInternal()
 

Typedefs

typedef struct PMSignalData PMSignalData
 

Enumerations

enum  PMSignalReason {
  PMSIGNAL_RECOVERY_STARTED , PMSIGNAL_RECOVERY_CONSISTENT , PMSIGNAL_BEGIN_HOT_STANDBY , PMSIGNAL_ROTATE_LOGFILE ,
  PMSIGNAL_START_AUTOVAC_LAUNCHER , PMSIGNAL_START_AUTOVAC_WORKER , PMSIGNAL_IO_WORKER_GROW , PMSIGNAL_BACKGROUND_WORKER_CHANGE ,
  PMSIGNAL_START_WALRECEIVER , PMSIGNAL_ADVANCE_STATE_MACHINE , PMSIGNAL_XLOG_IS_SHUTDOWN
}
 
enum  QuitSignalReason { PMQUIT_NOT_SENT = 0 , PMQUIT_FOR_CRASH , PMQUIT_FOR_STOP }
 

Functions

void SendPostmasterSignal (PMSignalReason reason)
 
bool CheckPostmasterSignal (PMSignalReason reason)
 
void SetQuitSignalReason (QuitSignalReason reason)
 
QuitSignalReason GetQuitSignalReason (void)
 
void MarkPostmasterChildSlotAssigned (int slot)
 
bool MarkPostmasterChildSlotUnassigned (int slot)
 
bool IsPostmasterChildWalSender (int slot)
 
void RegisterPostmasterChildActive (void)
 
void MarkPostmasterChildWalSender (void)
 
bool PostmasterIsAliveInternal (void)
 
void PostmasterDeathSignalInit (void)
 

Macro Definition Documentation

◆ NUM_PMSIGNALS

#define NUM_PMSIGNALS   (PMSIGNAL_XLOG_IS_SHUTDOWN+1)

Definition at line 48 of file pmsignal.h.

◆ PostmasterIsAlive

#define PostmasterIsAlive ( )    PostmasterIsAliveInternal()

Definition at line 106 of file pmsignal.h.

Typedef Documentation

◆ PMSignalData

Definition at line 61 of file pmsignal.h.

Enumeration Type Documentation

◆ PMSignalReason

Enumerator
PMSIGNAL_RECOVERY_STARTED 
PMSIGNAL_RECOVERY_CONSISTENT 
PMSIGNAL_BEGIN_HOT_STANDBY 
PMSIGNAL_ROTATE_LOGFILE 
PMSIGNAL_START_AUTOVAC_LAUNCHER 
PMSIGNAL_START_AUTOVAC_WORKER 
PMSIGNAL_IO_WORKER_GROW 
PMSIGNAL_BACKGROUND_WORKER_CHANGE 
PMSIGNAL_START_WALRECEIVER 
PMSIGNAL_ADVANCE_STATE_MACHINE 
PMSIGNAL_XLOG_IS_SHUTDOWN 

Definition at line 33 of file pmsignal.h.

34{
35 PMSIGNAL_RECOVERY_STARTED, /* recovery has started */
36 PMSIGNAL_RECOVERY_CONSISTENT, /* recovery has reached consistent state */
37 PMSIGNAL_BEGIN_HOT_STANDBY, /* begin Hot Standby */
38 PMSIGNAL_ROTATE_LOGFILE, /* send SIGUSR1 to syslogger to rotate logfile */
39 PMSIGNAL_START_AUTOVAC_LAUNCHER, /* start an autovacuum launcher */
40 PMSIGNAL_START_AUTOVAC_WORKER, /* start an autovacuum worker */
41 PMSIGNAL_IO_WORKER_GROW, /* I/O worker pool wants to grow */
42 PMSIGNAL_BACKGROUND_WORKER_CHANGE, /* background worker state change */
43 PMSIGNAL_START_WALRECEIVER, /* start a walreceiver */
44 PMSIGNAL_ADVANCE_STATE_MACHINE, /* advance postmaster's state machine */
45 PMSIGNAL_XLOG_IS_SHUTDOWN, /* ShutdownXLOG() completed */
PMSignalReason
Definition pmsignal.h:34
@ PMSIGNAL_START_AUTOVAC_WORKER
Definition pmsignal.h:40
@ PMSIGNAL_RECOVERY_STARTED
Definition pmsignal.h:35
@ PMSIGNAL_START_WALRECEIVER
Definition pmsignal.h:43
@ PMSIGNAL_START_AUTOVAC_LAUNCHER
Definition pmsignal.h:39
@ PMSIGNAL_BEGIN_HOT_STANDBY
Definition pmsignal.h:37
@ PMSIGNAL_RECOVERY_CONSISTENT
Definition pmsignal.h:36
@ PMSIGNAL_IO_WORKER_GROW
Definition pmsignal.h:41
@ PMSIGNAL_XLOG_IS_SHUTDOWN
Definition pmsignal.h:45
@ PMSIGNAL_BACKGROUND_WORKER_CHANGE
Definition pmsignal.h:42
@ PMSIGNAL_ROTATE_LOGFILE
Definition pmsignal.h:38
@ PMSIGNAL_ADVANCE_STATE_MACHINE
Definition pmsignal.h:44

◆ QuitSignalReason

Enumerator
PMQUIT_NOT_SENT 
PMQUIT_FOR_CRASH 
PMQUIT_FOR_STOP 

Definition at line 53 of file pmsignal.h.

54{
55 PMQUIT_NOT_SENT = 0, /* postmaster hasn't sent SIGQUIT */
56 PMQUIT_FOR_CRASH, /* some other backend bought the farm */
57 PMQUIT_FOR_STOP, /* immediate stop was commanded */
QuitSignalReason
Definition pmsignal.h:54
@ PMQUIT_FOR_STOP
Definition pmsignal.h:57
@ PMQUIT_FOR_CRASH
Definition pmsignal.h:56
@ PMQUIT_NOT_SENT
Definition pmsignal.h:55

Function Documentation

◆ CheckPostmasterSignal()

bool CheckPostmasterSignal ( PMSignalReason  reason)
extern

Definition at line 181 of file pmsignal.c.

182{
183 /* Careful here --- don't clear flag if we haven't seen it set */
184 if (PMSignalState->PMSignalFlags[reason])
185 {
186 PMSignalState->PMSignalFlags[reason] = false;
187 return true;
188 }
189 return false;
190}
NON_EXEC_STATIC volatile PMSignalData * PMSignalState
Definition pmsignal.c:85
sig_atomic_t PMSignalFlags[NUM_PMSIGNALS]
Definition pmsignal.c:76

References PMSignalData::PMSignalFlags, and PMSignalState.

Referenced by process_pm_pmsignal().

◆ GetQuitSignalReason()

QuitSignalReason GetQuitSignalReason ( void  )
extern

Definition at line 212 of file pmsignal.c.

213{
214 /* This is called in signal handlers, so be extra paranoid. */
216 return PMQUIT_NOT_SENT;
218}
bool IsUnderPostmaster
Definition globals.c:122
static int fb(int x)
QuitSignalReason sigquit_reason
Definition pmsignal.c:78

References fb(), IsUnderPostmaster, PMQUIT_NOT_SENT, PMSignalState, and PMSignalData::sigquit_reason.

Referenced by quickdie().

◆ IsPostmasterChildWalSender()

bool IsPostmasterChildWalSender ( int  slot)
extern

Definition at line 270 of file pmsignal.c.

271{
272 Assert(slot > 0 && slot <= num_child_flags);
273 slot--;
274
276 return true;
277 else
278 return false;
279}
#define Assert(condition)
Definition c.h:943
#define PM_CHILD_WALSENDER
Definition pmsignal.c:70
static int num_child_flags
Definition pmsignal.c:100
sig_atomic_t PMChildFlags[FLEXIBLE_ARRAY_MEMBER]
Definition pmsignal.c:81

References Assert, num_child_flags, PM_CHILD_WALSENDER, PMSignalData::PMChildFlags, and PMSignalState.

Referenced by CountChildren(), and SignalChildren().

◆ MarkPostmasterChildSlotAssigned()

void MarkPostmasterChildSlotAssigned ( int  slot)
extern

Definition at line 229 of file pmsignal.c.

230{
231 Assert(slot > 0 && slot <= num_child_flags);
232 slot--;
233
235 elog(FATAL, "postmaster child slot is already in use");
236
238}
#define FATAL
Definition elog.h:42
#define elog(elevel,...)
Definition elog.h:228
#define PM_CHILD_UNUSED
Definition pmsignal.c:67
#define PM_CHILD_ASSIGNED
Definition pmsignal.c:68

References Assert, elog, FATAL, num_child_flags, PM_CHILD_ASSIGNED, PM_CHILD_UNUSED, PMSignalData::PMChildFlags, and PMSignalState.

Referenced by AssignPostmasterChildSlot().

◆ MarkPostmasterChildSlotUnassigned()

bool MarkPostmasterChildSlotUnassigned ( int  slot)
extern

Definition at line 248 of file pmsignal.c.

249{
250 bool result;
251
252 Assert(slot > 0 && slot <= num_child_flags);
253 slot--;
254
255 /*
256 * Note: the slot state might already be unused, because the logic in
257 * postmaster.c is such that this might get called twice when a child
258 * crashes. So we don't try to Assert anything about the state.
259 */
262 return result;
263}
uint32 result

References Assert, num_child_flags, PM_CHILD_ASSIGNED, PM_CHILD_UNUSED, PMSignalData::PMChildFlags, PMSignalState, and result.

Referenced by ReleasePostmasterChildSlot().

◆ MarkPostmasterChildWalSender()

void MarkPostmasterChildWalSender ( void  )
extern

Definition at line 308 of file pmsignal.c.

309{
310 int slot = MyPMChildSlot;
311
313
315 slot--;
318}
int MyPMChildSlot
Definition globals.c:56
#define PM_CHILD_ACTIVE
Definition pmsignal.c:69
bool am_walsender
Definition walsender.c:135

References am_walsender, Assert, fb(), MyPMChildSlot, num_child_flags, PM_CHILD_ACTIVE, PM_CHILD_WALSENDER, PMSignalData::PMChildFlags, and PMSignalState.

Referenced by InitWalSender().

◆ PostmasterDeathSignalInit()

void PostmasterDeathSignalInit ( void  )
extern

Definition at line 406 of file pmsignal.c.

407{
408#ifdef USE_POSTMASTER_DEATH_SIGNAL
410
411 /* Register our signal handler. */
413
414 /* Request a signal on parent exit. */
415#if defined(PR_SET_PDEATHSIG)
416 if (prctl(PR_SET_PDEATHSIG, signum) < 0)
417 elog(ERROR, "could not request parent death signal: %m");
418#elif defined(PROC_PDEATHSIG_CTL)
419 if (procctl(P_PID, 0, PROC_PDEATHSIG_CTL, &signum) < 0)
420 elog(ERROR, "could not request parent death signal: %m");
421#else
422#error "USE_POSTMASTER_DEATH_SIGNAL set, but there is no mechanism to request the signal"
423#endif
424
425 /*
426 * Just in case the parent was gone already and we missed it, we'd better
427 * check the slow way on the first call.
428 */
430#endif /* USE_POSTMASTER_DEATH_SIGNAL */
431}
#define ERROR
Definition elog.h:40
#define pqsignal
Definition port.h:547

References elog, ERROR, fb(), and pqsignal.

Referenced by InitPostmasterChild().

◆ PostmasterIsAliveInternal()

bool PostmasterIsAliveInternal ( void  )
extern

Definition at line 345 of file pmsignal.c.

346{
347#ifdef USE_POSTMASTER_DEATH_SIGNAL
348 /*
349 * Reset the flag before checking, so that we don't miss a signal if
350 * postmaster dies right after the check. If postmaster was indeed dead,
351 * we'll re-arm it before returning to caller.
352 */
354#endif
355
356#ifndef WIN32
357 {
358 char c;
359 ssize_t rc;
360
362
363 /*
364 * In the usual case, the postmaster is still alive, and there is no
365 * data in the pipe.
366 */
367 if (rc < 0 && (errno == EAGAIN || errno == EWOULDBLOCK))
368 return true;
369 else
370 {
371 /*
372 * Postmaster is dead, or something went wrong with the read()
373 * call.
374 */
375
376#ifdef USE_POSTMASTER_DEATH_SIGNAL
378#endif
379
380 if (rc < 0)
381 elog(FATAL, "read on postmaster death monitoring pipe failed: %m");
382 else if (rc > 0)
383 elog(FATAL, "unexpected data in postmaster death monitoring pipe");
384
385 return false;
386 }
387 }
388
389#else /* WIN32 */
391 return true;
392 else
393 {
394#ifdef USE_POSTMASTER_DEATH_SIGNAL
396#endif
397 return false;
398 }
399#endif /* WIN32 */
400}
#define read(a, b, c)
Definition win32.h:13
int postmaster_alive_fds[2]
Definition postmaster.c:486
#define POSTMASTER_FD_WATCH
Definition postmaster.h:83
char * c
#define EWOULDBLOCK
Definition win32_port.h:367
#define EAGAIN
Definition win32_port.h:359

References EAGAIN, elog, EWOULDBLOCK, FATAL, fb(), postmaster_alive_fds, POSTMASTER_FD_WATCH, and read.

Referenced by WaitEventSetWaitBlock().

◆ RegisterPostmasterChildActive()

void RegisterPostmasterChildActive ( void  )
extern

Definition at line 289 of file pmsignal.c.

290{
291 int slot = MyPMChildSlot;
292
294 slot--;
297
298 /* Arrange to clean up at exit. */
300}
void on_shmem_exit(pg_on_exit_callback function, Datum arg)
Definition ipc.c:372
static void MarkPostmasterChildInactive(int code, Datum arg)
Definition pmsignal.c:325

References Assert, fb(), MarkPostmasterChildInactive(), MyPMChildSlot, num_child_flags, on_shmem_exit(), PM_CHILD_ACTIVE, PM_CHILD_ASSIGNED, PMSignalData::PMChildFlags, and PMSignalState.

Referenced by InitAuxiliaryProcess(), and InitProcess().

◆ SendPostmasterSignal()

void SendPostmasterSignal ( PMSignalReason  reason)
extern

Definition at line 164 of file pmsignal.c.

165{
166 /* If called in a standalone backend, do nothing */
168 return;
169 /* Atomically set the proper flag */
170 PMSignalState->PMSignalFlags[reason] = true;
171 /* Send signal to postmaster */
173}
pid_t PostmasterPid
Definition globals.c:108
#define kill(pid, sig)
Definition win32_port.h:490
#define SIGUSR1
Definition win32_port.h:170

References IsUnderPostmaster, kill, PMSignalData::PMSignalFlags, PMSignalState, PostmasterPid, and SIGUSR1.

Referenced by AutoVacLauncherMain(), CheckpointerMain(), CheckRecoveryConsistency(), do_start_worker(), GetNewMultiXactId(), GetNewTransactionId(), InitWalSender(), PerformWalRecovery(), pg_rotate_logfile(), pgaio_worker_request_grow(), RegisterDynamicBackgroundWorker(), RequestXLogStreaming(), SetMultiXactIdLimit(), SetTransactionIdLimit(), TerminateBackgroundWorker(), and TerminateBackgroundWorkersForDatabase().

◆ SetQuitSignalReason()

void SetQuitSignalReason ( QuitSignalReason  reason)
extern

Definition at line 201 of file pmsignal.c.

202{
204}

References PMSignalState, and PMSignalData::sigquit_reason.

Referenced by HandleFatalError(), and process_pm_shutdown_request().