88 #define NumProcSignalSlots (MaxBackends + NUM_AUXPROCTYPES) 91 #define BARRIER_SHOULD_CHECK(flags, type) \ 92 (((flags) & (((uint32) 1) << (uint32) (type))) != 0) 95 #define BARRIER_CLEAR_BIT(flags, type) \ 96 ((flags) &= ~(((uint32) 1) << (uint32) (type))) 164 uint64 barrier_generation;
168 slot = &ProcSignal->
psh_slot[pss_idx - 1];
172 elog(
LOG,
"process %d taking over ProcSignal slot %d, but it's not empty",
199 MyProcSignalSlot = slot;
217 slot = &ProcSignal->
psh_slot[pss_idx - 1];
218 Assert(slot == MyProcSignalSlot);
225 MyProcSignalSlot = NULL;
234 elog(
LOG,
"process %d releasing ProcSignal slot %d, but it contains %d",
267 slot = &ProcSignal->
psh_slot[backendId - 1];
371 for (
int i = NumProcSignalSlots - 1;
i >= 0;
i--)
408 while (oldval < generation)
475 Assert(local_gen <= shared_gen);
477 if (local_gen == shared_gen)
525 bool processed =
true;
644 int save_errno = errno;
uint64 EmitProcSignalBarrier(ProcSignalBarrierType type)
volatile sig_atomic_t pss_signalFlags[NUM_PROCSIGNALS]
void RecoveryConflictInterrupt(ProcSignalReason reason)
static void HandleProcSignalBarrierInterrupt(void)
void ProcessProcSignalBarrier(void)
#define FLEXIBLE_ARRAY_MEMBER
void ConditionVariableBroadcast(ConditionVariable *cv)
static bool ProcessBarrierPlaceholder(void)
#define MemSet(start, val, len)
void SetLatch(Latch *latch)
pg_atomic_uint64 pss_barrierGeneration
static ProcSignalSlot * MyProcSignalSlot
static void pg_atomic_write_u64(volatile pg_atomic_uint64 *ptr, uint64 val)
static uint32 pg_atomic_exchange_u32(volatile pg_atomic_uint32 *ptr, uint32 newval)
static void CleanupProcSignalState(int status, Datum arg)
void ConditionVariableInit(ConditionVariable *cv)
void HandleWalSndInitStopping(void)
int SendProcSignal(pid_t pid, ProcSignalReason reason, BackendId backendId)
static void pg_atomic_init_u64(volatile pg_atomic_uint64 *ptr, uint64 val)
void ConditionVariableCancelSleep(void)
void * ShmemInitStruct(const char *name, Size size, bool *foundPtr)
void on_shmem_exit(pg_on_exit_callback function, Datum arg)
pg_atomic_uint32 pss_barrierCheckMask
Size ProcSignalShmemSize(void)
Size mul_size(Size s1, Size s2)
Size add_size(Size s1, Size s2)
static ProcSignalHeader * ProcSignal
static bool CheckProcSignal(ProcSignalReason reason)
#define BARRIER_CLEAR_BIT(flags, type)
#define pg_memory_barrier()
void ConditionVariableSleep(ConditionVariable *cv, uint32 wait_event_info)
#define Assert(condition)
volatile sig_atomic_t ProcSignalBarrierPending
static void ResetProcSignalBarrierBits(uint32 flags)
volatile sig_atomic_t InterruptPending
static uint64 pg_atomic_add_fetch_u64(volatile pg_atomic_uint64 *ptr, int64 add_)
void ProcSignalInit(int pss_idx)
static uint64 pg_atomic_read_u64(volatile pg_atomic_uint64 *ptr)
void HandleNotifyInterrupt(void)
void ProcSignalShmemInit(void)
#define NumProcSignalSlots
static uint32 pg_atomic_fetch_or_u32(volatile pg_atomic_uint32 *ptr, uint32 or_)
void HandleParallelMessageInterrupt(void)
void WaitForProcSignalBarrier(uint64 generation)
static void pg_atomic_init_u32(volatile pg_atomic_uint32 *ptr, uint32 val)
void HandleLogMemoryContextInterrupt(void)
static void pg_atomic_write_u32(volatile pg_atomic_uint32 *ptr, uint32 val)
void procsignal_sigusr1_handler(SIGNAL_ARGS)
static void static void status(const char *fmt,...) pg_attribute_printf(1
ConditionVariable pss_barrierCV
void HandleCatchupInterrupt(void)
#define offsetof(type, field)
static int pg_rightmost_one_pos32(uint32 word)