PostgreSQL Source Code git master
launch_backend.c File Reference
Include dependency graph for launch_backend.c:

Go to the source code of this file.

Data Structures

struct  child_process_kind
 

Functions

const char * PostmasterChildName (BackendType child_type)
 
pid_t postmaster_child_launch (BackendType child_type, int child_slot, const void *startup_data, size_t startup_data_len, ClientSocket *client_sock)
 

Variables

static child_process_kind child_process_kinds []
 

Function Documentation

◆ postmaster_child_launch()

pid_t postmaster_child_launch ( BackendType  child_type,
int  child_slot,
const void *  startup_data,
size_t  startup_data_len,
ClientSocket client_sock 
)

Definition at line 229 of file launch_backend.c.

232{
233 pid_t pid;
234
236
237 /* Capture time Postmaster initiates process creation for logging */
238 if (IsExternalConnectionBackend(child_type))
239 ((BackendStartupData *) startup_data)->fork_started = GetCurrentTimestamp();
240
241#ifdef EXEC_BACKEND
242 pid = internal_forkexec(child_process_kinds[child_type].name, child_slot,
243 startup_data, startup_data_len, client_sock);
244 /* the child process will arrive in SubPostmasterMain */
245#else /* !EXEC_BACKEND */
246 pid = fork_process();
247 if (pid == 0) /* child */
248 {
249 /* Capture and transfer timings that may be needed for logging */
250 if (IsExternalConnectionBackend(child_type))
251 {
253 ((BackendStartupData *) startup_data)->socket_created;
255 ((BackendStartupData *) startup_data)->fork_started;
257 }
258
259 /* Close the postmaster's sockets */
260 ClosePostmasterPorts(child_type == B_LOGGER);
261
262 /* Detangle from postmaster */
264
265 /* Detach shared memory if not needed. */
266 if (!child_process_kinds[child_type].shmem_attach)
267 {
270 }
271
272 /*
273 * Enter the Main function with TopMemoryContext. The startup data is
274 * allocated in PostmasterContext, so we cannot release it here yet.
275 * The Main function will do it after it's done handling the startup
276 * data.
277 */
279
280 MyPMChildSlot = child_slot;
281 if (client_sock)
282 {
284 memcpy(MyClientSocket, client_sock, sizeof(ClientSocket));
285 }
286
287 /*
288 * Run the appropriate Main function
289 */
290 child_process_kinds[child_type].main_fn(startup_data, startup_data_len);
291 pg_unreachable(); /* main_fn never returns */
292 }
293#endif /* EXEC_BACKEND */
294 return pid;
295}
TimestampTz GetCurrentTimestamp(void)
Definition: timestamp.c:1645
ConnectionTiming conn_timing
#define pg_unreachable()
Definition: c.h:332
void dsm_detach_all(void)
Definition: dsm.c:775
pid_t fork_process(void)
Definition: fork_process.c:33
struct ClientSocket * MyClientSocket
Definition: globals.c:51
int MyPMChildSlot
Definition: globals.c:55
bool IsUnderPostmaster
Definition: globals.c:121
bool IsPostmasterEnvironment
Definition: globals.c:120
Assert(PointerIsAligned(start, uint64))
static child_process_kind child_process_kinds[]
MemoryContext TopMemoryContext
Definition: mcxt.c:165
void * palloc(Size size)
Definition: mcxt.c:1945
#define IsExternalConnectionBackend(backend_type)
Definition: miscadmin.h:405
@ B_LOGGER
Definition: miscadmin.h:374
void InitPostmasterChild(void)
Definition: miscinit.c:96
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition: palloc.h:124
void ClosePostmasterPorts(bool am_syslogger)
Definition: postmaster.c:1855
TimestampTz socket_create
TimestampTz fork_start
TimestampTz fork_end
void(* main_fn)(const void *startup_data, size_t startup_data_len)
void PGSharedMemoryDetach(void)
Definition: sysv_shmem.c:970
const char * name

References Assert(), B_LOGGER, child_process_kinds, ClosePostmasterPorts(), conn_timing, dsm_detach_all(), ConnectionTiming::fork_end, fork_process(), ConnectionTiming::fork_start, GetCurrentTimestamp(), InitPostmasterChild(), IsExternalConnectionBackend, IsPostmasterEnvironment, IsUnderPostmaster, child_process_kind::main_fn, MemoryContextSwitchTo(), MyClientSocket, MyPMChildSlot, name, palloc(), pg_unreachable, PGSharedMemoryDetach(), ConnectionTiming::socket_create, and TopMemoryContext.

Referenced by BackendStartup(), StartBackgroundWorker(), StartChildProcess(), and SysLogger_Start().

◆ PostmasterChildName()

const char * PostmasterChildName ( BackendType  child_type)

Definition at line 211 of file launch_backend.c.

212{
213 return child_process_kinds[child_type].name;
214}

References child_process_kinds, and child_process_kind::name.

Referenced by AssignPostmasterChildSlot(), and StartChildProcess().

Variable Documentation

◆ child_process_kinds

child_process_kind child_process_kinds[]
static
Initial value:
= {
[B_INVALID] = {"invalid", NULL, false},
[B_BACKEND] = {"backend", BackendMain, true},
[B_DEAD_END_BACKEND] = {"dead-end backend", BackendMain, true},
[B_AUTOVAC_LAUNCHER] = {"autovacuum launcher", AutoVacLauncherMain, true},
[B_AUTOVAC_WORKER] = {"autovacuum worker", AutoVacWorkerMain, true},
[B_BG_WORKER] = {"bgworker", BackgroundWorkerMain, true},
[B_WAL_SENDER] = {"wal sender", NULL, true},
[B_SLOTSYNC_WORKER] = {"slot sync worker", ReplSlotSyncWorkerMain, true},
[B_STANDALONE_BACKEND] = {"standalone backend", NULL, false},
[B_ARCHIVER] = {"archiver", PgArchiverMain, true},
[B_BG_WRITER] = {"bgwriter", BackgroundWriterMain, true},
[B_CHECKPOINTER] = {"checkpointer", CheckpointerMain, true},
[B_IO_WORKER] = {"io_worker", IoWorkerMain, true},
[B_STARTUP] = {"startup", StartupProcessMain, true},
[B_WAL_RECEIVER] = {"wal_receiver", WalReceiverMain, true},
[B_WAL_SUMMARIZER] = {"wal_summarizer", WalSummarizerMain, true},
[B_WAL_WRITER] = {"wal_writer", WalWriterMain, true},
[B_LOGGER] = {"syslogger", SysLoggerMain, false},
}
void AutoVacLauncherMain(const void *startup_data, size_t startup_data_len)
Definition: autovacuum.c:368
void AutoVacWorkerMain(const void *startup_data, size_t startup_data_len)
Definition: autovacuum.c:1380
void StartupProcessMain(const void *startup_data, size_t startup_data_len)
Definition: startup.c:220
void BackendMain(const void *startup_data, size_t startup_data_len)
void BackgroundWorkerMain(const void *startup_data, size_t startup_data_len)
Definition: bgworker.c:717
void BackgroundWriterMain(const void *startup_data, size_t startup_data_len)
Definition: bgwriter.c:88
void CheckpointerMain(const void *startup_data, size_t startup_data_len)
Definition: checkpointer.c:179
void IoWorkerMain(const void *startup_data, size_t startup_data_len)
@ B_WAL_SUMMARIZER
Definition: miscadmin.h:367
@ B_WAL_WRITER
Definition: miscadmin.h:368
@ B_WAL_RECEIVER
Definition: miscadmin.h:366
@ B_CHECKPOINTER
Definition: miscadmin.h:363
@ B_WAL_SENDER
Definition: miscadmin.h:347
@ B_IO_WORKER
Definition: miscadmin.h:364
@ B_STARTUP
Definition: miscadmin.h:365
@ B_BG_WORKER
Definition: miscadmin.h:346
@ B_INVALID
Definition: miscadmin.h:339
@ B_STANDALONE_BACKEND
Definition: miscadmin.h:350
@ B_BG_WRITER
Definition: miscadmin.h:362
@ B_BACKEND
Definition: miscadmin.h:342
@ B_ARCHIVER
Definition: miscadmin.h:361
@ B_AUTOVAC_LAUNCHER
Definition: miscadmin.h:344
@ B_SLOTSYNC_WORKER
Definition: miscadmin.h:348
@ B_DEAD_END_BACKEND
Definition: miscadmin.h:343
@ B_AUTOVAC_WORKER
Definition: miscadmin.h:345
void PgArchiverMain(const void *startup_data, size_t startup_data_len)
Definition: pgarch.c:216
void ReplSlotSyncWorkerMain(const void *startup_data, size_t startup_data_len)
Definition: slotsync.c:1350
void SysLoggerMain(const void *startup_data, size_t startup_data_len)
Definition: syslogger.c:165
void WalReceiverMain(const void *startup_data, size_t startup_data_len)
Definition: walreceiver.c:152
void WalSummarizerMain(const void *startup_data, size_t startup_data_len)
void WalWriterMain(const void *startup_data, size_t startup_data_len)
Definition: walwriter.c:88

Definition at line 179 of file launch_backend.c.

Referenced by postmaster_child_launch(), and PostmasterChildName().