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,