|
20 | 20 | #include"postmaster/bgworker_internals.h"
|
21 | 21 | #include"postmaster/postmaster.h"
|
22 | 22 | #include"storage/barrier.h"
|
| 23 | +#include"storage/dsm.h" |
23 | 24 | #include"storage/ipc.h"
|
24 | 25 | #include"storage/latch.h"
|
25 | 26 | #include"storage/lwlock.h"
|
| 27 | +#include"storage/pg_shmem.h" |
26 | 28 | #include"storage/pmsignal.h"
|
27 | 29 | #include"storage/proc.h"
|
28 | 30 | #include"storage/procsignal.h"
|
@@ -400,12 +402,16 @@ BackgroundWorkerStopNotifications(pid_t pid)
|
400 | 402 | BackgroundWorker*
|
401 | 403 | BackgroundWorkerEntry(intslotno)
|
402 | 404 | {
|
| 405 | +staticBackgroundWorkermyEntry; |
403 | 406 | BackgroundWorkerSlot*slot;
|
404 | 407 |
|
405 | 408 | Assert(slotno<BackgroundWorkerData->total_slots);
|
406 | 409 | slot=&BackgroundWorkerData->slot[slotno];
|
407 | 410 | Assert(slot->in_use);
|
408 |
| -return&slot->worker;/* can't become free while we're still here */ |
| 411 | + |
| 412 | +/* must copy this in case we don't intend to retain shmem access */ |
| 413 | +memcpy(&myEntry,&slot->worker,sizeofmyEntry); |
| 414 | +return&myEntry; |
409 | 415 | }
|
410 | 416 | #endif
|
411 | 417 |
|
@@ -542,6 +548,20 @@ StartBackgroundWorker(void)
|
542 | 548 | snprintf(buf,MAXPGPATH,"bgworker: %s",worker->bgw_name);
|
543 | 549 | init_ps_display(buf,"","","");
|
544 | 550 |
|
| 551 | +/* |
| 552 | + * If we're not supposed to have shared memory access, then detach from |
| 553 | + * shared memory. If we didn't request shared memory access, the |
| 554 | + * postmaster won't force a cluster-wide restart if we exit unexpectedly, |
| 555 | + * so we'd better make sure that we don't mess anything up that would |
| 556 | + * require that sort of cleanup. |
| 557 | + */ |
| 558 | +if ((worker->bgw_flags&BGWORKER_SHMEM_ACCESS)==0) |
| 559 | +{ |
| 560 | +on_exit_reset(); |
| 561 | +dsm_detach_all(); |
| 562 | +PGSharedMemoryDetach(); |
| 563 | +} |
| 564 | + |
545 | 565 | SetProcessingMode(InitProcessing);
|
546 | 566 |
|
547 | 567 | /* Apply PostAuthDelay */
|
@@ -616,19 +636,29 @@ StartBackgroundWorker(void)
|
616 | 636 | /* We can now handle ereport(ERROR) */
|
617 | 637 | PG_exception_stack=&local_sigjmp_buf;
|
618 | 638 |
|
619 |
| -/* Early initialization */ |
620 |
| -BaseInit(); |
621 |
| - |
622 | 639 | /*
|
623 |
| - * If necessary, create a per-backend PGPROC struct in shared memory, |
624 |
| - * except in the EXEC_BACKEND case where this was done in |
625 |
| - * SubPostmasterMain. We must do this before we can use LWLocks (and in |
626 |
| - * the EXEC_BACKEND case we already had to do some stuff with LWLocks). |
| 640 | + * If the background worker request shared memory access, set that up now; |
| 641 | + * else, detach all shared memory segments. |
627 | 642 | */
|
628 |
| -#ifndefEXEC_BACKEND |
629 | 643 | if (worker->bgw_flags&BGWORKER_SHMEM_ACCESS)
|
| 644 | +{ |
| 645 | +/* |
| 646 | + * Early initialization. Some of this could be useful even for |
| 647 | + * background workers that aren't using shared memory, but they can |
| 648 | + * call the individual startup routines for those subsystems if needed. |
| 649 | + */ |
| 650 | +BaseInit(); |
| 651 | + |
| 652 | +/* |
| 653 | + * Create a per-backend PGPROC struct in shared memory, except in the |
| 654 | + * EXEC_BACKEND case where this was done in SubPostmasterMain. We must |
| 655 | + * do this before we can use LWLocks (and in the EXEC_BACKEND case we |
| 656 | + * already had to do some stuff with LWLocks). |
| 657 | + */ |
| 658 | +#ifndefEXEC_BACKEND |
630 | 659 | InitProcess();
|
631 | 660 | #endif
|
| 661 | +} |
632 | 662 |
|
633 | 663 | /*
|
634 | 664 | * If bgw_main is set, we use that value as the initial entrypoint.
|
|