slot = &ProcSignalSlots[pss_idx - 1];
    Assert(slot == MyProcSignalSlot);
 
+   /*
+    * Clear MyProcSignalSlot, so that a SIGUSR1 received after this point
+    * won't try to access it after it's no longer ours (and perhaps even
+    * after we've unmapped the shared memory segment).
+    */
+   MyProcSignalSlot = NULL;
+
    /* sanity check */
    if (slot->pss_pid != MyProcPid)
    {
 
 {
    /* use volatile pointer to prevent code rearrangement */
    volatile PROC_HDR *procglobal = ProcGlobal;
+   PGPROC     *proc;
 
    Assert(MyProc != NULL);
 
     */
    LWLockReleaseAll();
 
-   /* Release ownership of the process's latch, too */
-   DisownLatch(&MyProc->procLatch);
+   /*
+    * Clear MyProc first; then disown the process latch.  This is so that
+    * signal handlers won't try to clear the process latch after it's no
+    * longer ours.
+    */
+   proc = MyProc;
+   MyProc = NULL;
+   DisownLatch(&proc->procLatch);
 
    SpinLockAcquire(ProcStructLock);
 
    /* Return PGPROC structure (and semaphore) to appropriate freelist */
    if (IsAnyAutoVacuumProcess())
    {
-       MyProc->links.next = (SHM_QUEUE *) procglobal->autovacFreeProcs;
-       procglobal->autovacFreeProcs = MyProc;
+       proc->links.next = (SHM_QUEUE *) procglobal->autovacFreeProcs;
+       procglobal->autovacFreeProcs = proc;
    }
    else
    {
-       MyProc->links.next = (SHM_QUEUE *) procglobal->freeProcs;
-       procglobal->freeProcs = MyProc;
+       proc->links.next = (SHM_QUEUE *) procglobal->freeProcs;
+       procglobal->freeProcs = proc;
    }
 
-   /* PGPROC struct isn't mine anymore */
-   MyProc = NULL;
-
    /* Update shared estimate of spins_per_delay */
    procglobal->spins_per_delay = update_spins_per_delay(procglobal->spins_per_delay);
 
 {
    int         proctype = DatumGetInt32(arg);
    PGPROC     *auxproc;
+   PGPROC     *proc;
 
    Assert(proctype >= 0 && proctype < NUM_AUXILIARY_PROCS);
 
    /* Release any LW locks I am holding (see notes above) */
    LWLockReleaseAll();
 
-   /* Release ownership of the process's latch, too */
-   DisownLatch(&MyProc->procLatch);
+   /*
+    * Clear MyProc first; then disown the process latch.  This is so that
+    * signal handlers won't try to clear the process latch after it's no
+    * longer ours.
+    */
+   proc = MyProc;
+   MyProc = NULL;
+   DisownLatch(&proc->procLatch);
 
    SpinLockAcquire(ProcStructLock);
 
    /* Mark auxiliary proc no longer in use */
-   MyProc->pid = 0;
-
-   /* PGPROC struct isn't mine anymore */
-   MyProc = NULL;
+   proc->pid = 0;
 
    /* Update shared estimate of spins_per_delay */
    ProcGlobal->spins_per_delay = update_spins_per_delay(ProcGlobal->spins_per_delay);