static ProcSignalSlot *ProcSignalSlots = NULL;
static volatile ProcSignalSlot *MyProcSignalSlot = NULL;
-static bool CheckProcSignal(ProcSignalReason reason);
+static sig_atomic_t CheckProcSignal(ProcSignalReason reason);
static void CleanupProcSignalState(int status, Datum arg);
/*
* On success (a signal was sent), zero is returned.
* On error, -1 is returned, and errno is set (typically to ESRCH or EPERM).
*
+ * The data value may contain any value except 0
+ *
* Not to be confused with ProcSendSignal
*/
int
-SendProcSignal(pid_t pid, ProcSignalReason reason, BackendId backendId)
+SendProcSignal(pid_t pid, ProcSignalReason reason, BackendId backendId,
+ sig_atomic_t data)
{
volatile ProcSignalSlot *slot;
if (slot->pss_pid == pid)
{
/* Atomically set the proper flag */
- slot->pss_signalFlags[reason] = true;
+ slot->pss_signalFlags[reason] = data;
/* Send signal */
return kill(pid, SIGUSR1);
}
/* the above note about race conditions applies here too */
/* Atomically set the proper flag */
- slot->pss_signalFlags[reason] = true;
+ slot->pss_signalFlags[reason] = data;
/* Send signal */
return kill(pid, SIGUSR1);
}
* signaled, and clear the signal flag. Should be called after receiving
* SIGUSR1.
*/
-static bool
+static sig_atomic_t
CheckProcSignal(ProcSignalReason reason)
{
volatile ProcSignalSlot *slot = MyProcSignalSlot;
/* Careful here --- don't clear flag if we haven't seen it set */
if (slot->pss_signalFlags[reason])
{
- slot->pss_signalFlags[reason] = false;
- return true;
+ sig_atomic_t retval = slot->pss_signalFlags[reason];
+ slot->pss_signalFlags[reason] = 0;
+ return retval;
}
}
- return false;
+ return 0;
}
/*
LWLockRelease(SInvalReadLock);
LWLockRelease(SInvalWriteLock);
elog(DEBUG4, "sending sinval catchup signal to PID %d", (int) his_pid);
- SendProcSignal(his_pid, PROCSIG_CATCHUP_INTERRUPT, his_backendId);
+ SendProcSignal(his_pid, PROCSIG_CATCHUP_INTERRUPT, his_backendId, true);
if (callerHasWriteLock)
LWLockAcquire(SInvalWriteLock, LW_EXCLUSIVE);
}