Line data Source code
1 : /*-------------------------------------------------------------------------
2 : * auxprocess.c
3 : * functions related to auxiliary processes.
4 : *
5 : *
6 : * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
7 : * Portions Copyright (c) 1994, Regents of the University of California
8 : *
9 : * IDENTIFICATION
10 : * src/backend/postmaster/auxprocess.c
11 : *-------------------------------------------------------------------------
12 : */
13 : #include "postgres.h"
14 :
15 : #include <unistd.h>
16 : #include <signal.h>
17 :
18 : #include "miscadmin.h"
19 : #include "pgstat.h"
20 : #include "postmaster/auxprocess.h"
21 : #include "storage/condition_variable.h"
22 : #include "storage/ipc.h"
23 : #include "storage/proc.h"
24 : #include "storage/procsignal.h"
25 : #include "utils/memutils.h"
26 : #include "utils/ps_status.h"
27 :
28 :
29 : static void ShutdownAuxiliaryProcess(int code, Datum arg);
30 :
31 :
32 : /*
33 : * AuxiliaryProcessMainCommon
34 : *
35 : * Common initialization code for auxiliary processes, such as the bgwriter,
36 : * walwriter, walreceiver, and the startup process.
37 : */
38 : void
39 4531 : AuxiliaryProcessMainCommon(void)
40 : {
41 : Assert(IsUnderPostmaster);
42 :
43 : /* Release postmaster's working memory context */
44 4531 : if (PostmasterContext)
45 : {
46 4531 : MemoryContextDelete(PostmasterContext);
47 4531 : PostmasterContext = NULL;
48 : }
49 :
50 4531 : init_ps_display(NULL);
51 :
52 : Assert(GetProcessingMode() == InitProcessing);
53 :
54 4531 : IgnoreSystemIndexes = true;
55 :
56 : /*
57 : * As an auxiliary process, we aren't going to do the full InitPostgres
58 : * pushups, but there are a couple of things that need to get lit up even
59 : * in an auxiliary process.
60 : */
61 :
62 : /*
63 : * Create a PGPROC so we can use LWLocks and access shared memory.
64 : */
65 4531 : InitAuxiliaryProcess();
66 :
67 4531 : BaseInit();
68 :
69 4531 : ProcSignalInit(NULL, 0);
70 :
71 : /*
72 : * Auxiliary processes don't run transactions, but they may need a
73 : * resource owner anyway to manage buffer pins acquired outside
74 : * transactions (and, perhaps, other things in future).
75 : */
76 4531 : CreateAuxProcessResourceOwner();
77 :
78 :
79 : /* Initialize backend status information */
80 4531 : pgstat_beinit();
81 4531 : pgstat_bestart_initial();
82 4531 : pgstat_bestart_final();
83 :
84 : /* register a before-shutdown callback for LWLock cleanup */
85 4531 : before_shmem_exit(ShutdownAuxiliaryProcess, 0);
86 :
87 4531 : SetProcessingMode(NormalProcessing);
88 4531 : }
89 :
90 : /*
91 : * Begin shutdown of an auxiliary process. This is approximately the equivalent
92 : * of ShutdownPostgres() in postinit.c. We can't run transactions in an
93 : * auxiliary process, so most of the work of AbortTransaction() is not needed,
94 : * but we do need to make sure we've released any LWLocks we are holding.
95 : * (This is only critical during an error exit.)
96 : */
97 : static void
98 4531 : ShutdownAuxiliaryProcess(int code, Datum arg)
99 : {
100 4531 : LWLockReleaseAll();
101 4531 : ConditionVariableCancelSleep();
102 4531 : pgstat_report_wait_end();
103 4531 : }
|