summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/postmaster/bgworker.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/backend/postmaster/bgworker.c b/src/backend/postmaster/bgworker.c
index 9754c370fc2..cacd8fe7a9b 100644
--- a/src/backend/postmaster/bgworker.c
+++ b/src/backend/postmaster/bgworker.c
@@ -290,9 +290,11 @@ BackgroundWorkerStateChange(void)
* bgw_notify_pid completes before the store to in_use.
*/
notify_pid = slot->worker.bgw_notify_pid;
- pg_memory_barrier();
slot->pid = 0;
+
+ pg_memory_barrier();
slot->in_use = false;
+
if (notify_pid != 0)
kill(notify_pid, SIGUSR1);
@@ -378,6 +380,8 @@ BackgroundWorkerStateChange(void)
* points to it. This convention allows deletion of workers during
* searches of the worker list, and saves having to search the list again.
*
+ * Caller is responsible for notifying bgw_notify_pid, if appropriate.
+ *
* This function must be invoked only in the postmaster.
*/
void
@@ -390,6 +394,13 @@ ForgetBackgroundWorker(slist_mutable_iter *cur)
Assert(rw->rw_shmem_slot < max_worker_processes);
slot = &BackgroundWorkerData->slot[rw->rw_shmem_slot];
+ Assert(slot->in_use);
+
+ /*
+ * This memory barrier might not be completely necessary, but let's be
+ * sure.
+ */
+ pg_memory_barrier();
slot->in_use = false;
ereport(DEBUG1,