LCOV - code coverage report
Current view: top level - src/include/storage - pmsignal.h (source / functions) Coverage Total Hit
Test: PostgreSQL 19devel Lines: 100.0 % 4 4
Test Date: 2026-03-04 15:14:37 Functions: 100.0 % 1 1
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /*-------------------------------------------------------------------------
       2              :  *
       3              :  * pmsignal.h
       4              :  *    routines for signaling between the postmaster and its child processes
       5              :  *
       6              :  *
       7              :  * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
       8              :  * Portions Copyright (c) 1994, Regents of the University of California
       9              :  *
      10              :  * src/include/storage/pmsignal.h
      11              :  *
      12              :  *-------------------------------------------------------------------------
      13              :  */
      14              : #ifndef PMSIGNAL_H
      15              : #define PMSIGNAL_H
      16              : 
      17              : #include <signal.h>
      18              : 
      19              : #ifdef HAVE_SYS_PRCTL_H
      20              : #include <sys/prctl.h>
      21              : #endif
      22              : 
      23              : #ifdef HAVE_SYS_PROCCTL_H
      24              : #include <sys/procctl.h>
      25              : #endif
      26              : 
      27              : /*
      28              :  * Reasons for signaling the postmaster.  We can cope with simultaneous
      29              :  * signals for different reasons.  If the same reason is signaled multiple
      30              :  * times in quick succession, however, the postmaster is likely to observe
      31              :  * only one notification of it.  This is okay for the present uses.
      32              :  */
      33              : typedef enum
      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_BACKGROUND_WORKER_CHANGE,  /* background worker state change */
      42              :     PMSIGNAL_START_WALRECEIVER, /* start a walreceiver */
      43              :     PMSIGNAL_ADVANCE_STATE_MACHINE, /* advance postmaster's state machine */
      44              :     PMSIGNAL_XLOG_IS_SHUTDOWN,  /* ShutdownXLOG() completed */
      45              : } PMSignalReason;
      46              : 
      47              : #define NUM_PMSIGNALS (PMSIGNAL_XLOG_IS_SHUTDOWN+1)
      48              : 
      49              : /*
      50              :  * Reasons why the postmaster would send SIGQUIT to its children.
      51              :  */
      52              : typedef enum
      53              : {
      54              :     PMQUIT_NOT_SENT = 0,        /* postmaster hasn't sent SIGQUIT */
      55              :     PMQUIT_FOR_CRASH,           /* some other backend bought the farm */
      56              :     PMQUIT_FOR_STOP,            /* immediate stop was commanded */
      57              : } QuitSignalReason;
      58              : 
      59              : /* PMSignalData is an opaque struct, details known only within pmsignal.c */
      60              : typedef struct PMSignalData PMSignalData;
      61              : 
      62              : #ifdef EXEC_BACKEND
      63              : extern PGDLLIMPORT volatile PMSignalData *PMSignalState;
      64              : #endif
      65              : 
      66              : /*
      67              :  * prototypes for functions in pmsignal.c
      68              :  */
      69              : extern Size PMSignalShmemSize(void);
      70              : extern void PMSignalShmemInit(void);
      71              : extern void SendPostmasterSignal(PMSignalReason reason);
      72              : extern bool CheckPostmasterSignal(PMSignalReason reason);
      73              : extern void SetQuitSignalReason(QuitSignalReason reason);
      74              : extern QuitSignalReason GetQuitSignalReason(void);
      75              : extern void MarkPostmasterChildSlotAssigned(int slot);
      76              : extern bool MarkPostmasterChildSlotUnassigned(int slot);
      77              : extern bool IsPostmasterChildWalSender(int slot);
      78              : extern void RegisterPostmasterChildActive(void);
      79              : extern void MarkPostmasterChildWalSender(void);
      80              : extern bool PostmasterIsAliveInternal(void);
      81              : extern void PostmasterDeathSignalInit(void);
      82              : 
      83              : 
      84              : /*
      85              :  * Do we have a way to ask for a signal on parent death?
      86              :  *
      87              :  * If we do, pmsignal.c will set up a signal handler, that sets a flag when
      88              :  * the parent dies.  Checking the flag first makes PostmasterIsAlive() a lot
      89              :  * cheaper in usual case that the postmaster is alive.
      90              :  */
      91              : #if (defined(HAVE_SYS_PRCTL_H) && defined(PR_SET_PDEATHSIG)) || \
      92              :     (defined(HAVE_SYS_PROCCTL_H) && defined(PROC_PDEATHSIG_CTL))
      93              : #define USE_POSTMASTER_DEATH_SIGNAL
      94              : #endif
      95              : 
      96              : #ifdef USE_POSTMASTER_DEATH_SIGNAL
      97              : extern PGDLLIMPORT volatile sig_atomic_t postmaster_possibly_dead;
      98              : 
      99              : static inline bool
     100      2790619 : PostmasterIsAlive(void)
     101              : {
     102      2790619 :     if (likely(!postmaster_possibly_dead))
     103      2790046 :         return true;
     104          573 :     return PostmasterIsAliveInternal();
     105              : }
     106              : #else
     107              : #define PostmasterIsAlive() PostmasterIsAliveInternal()
     108              : #endif
     109              : 
     110              : #endif                          /* PMSIGNAL_H */
        

Generated by: LCOV version 2.0-1