diff --git a/src/backend/main/main.c b/src/backend/main/main.c index c7d48e95ad..33c5a0a4e6 100644 --- a/src/backend/main/main.c +++ b/src/backend/main/main.c @@ -173,7 +173,7 @@ main(int argc, char *argv[]) #ifdef EXEC_BACKEND if (argc > 1 && strncmp(argv[1], "--fork", 6) == 0) - exit(SubPostmasterMain(argc, argv)); + SubPostmasterMain(argc, argv); /* does not return */ #endif #ifdef WIN32 @@ -189,14 +189,13 @@ main(int argc, char *argv[]) if (argc > 1 && strcmp(argv[1], "--boot") == 0) AuxiliaryProcessMain(argc, argv); /* does not return */ - - if (argc > 1 && strcmp(argv[1], "--describe-config") == 0) - exit(GucInfoMain()); - - if (argc > 1 && strcmp(argv[1], "--single") == 0) - exit(PostgresMain(argc, argv, get_current_username(progname))); - - exit(PostmasterMain(argc, argv)); + else if (argc > 1 && strcmp(argv[1], "--describe-config") == 0) + GucInfoMain(); /* does not return */ + else if (argc > 1 && strcmp(argv[1], "--single") == 0) + PostgresMain(argc, argv, get_current_username(progname)); /* does not return */ + else + PostmasterMain(argc, argv); /* does not return */ + abort(); /* should not get here */ } diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 1cfac9e80b..dade5cc3c0 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -269,8 +269,8 @@ int AutovacuumLauncherPid = 0; static pid_t avlauncher_forkexec(void); static pid_t avworker_forkexec(void); #endif -NON_EXEC_STATIC void AutoVacWorkerMain(int argc, char *argv[]); -NON_EXEC_STATIC void AutoVacLauncherMain(int argc, char *argv[]); +NON_EXEC_STATIC void AutoVacWorkerMain(int argc, char *argv[]) __attribute__((noreturn)); +NON_EXEC_STATIC void AutoVacLauncherMain(int argc, char *argv[]) __attribute__((noreturn)); static Oid do_start_worker(void); static void launcher_determine_sleep(bool canlaunch, bool recursing, diff --git a/src/backend/postmaster/pgarch.c b/src/backend/postmaster/pgarch.c index 5c43cdde65..d5d8be0587 100644 --- a/src/backend/postmaster/pgarch.c +++ b/src/backend/postmaster/pgarch.c @@ -101,7 +101,7 @@ static Latch mainloop_latch; static pid_t pgarch_forkexec(void); #endif -NON_EXEC_STATIC void PgArchiverMain(int argc, char *argv[]); +NON_EXEC_STATIC void PgArchiverMain(int argc, char *argv[]) __attribute__((noreturn)); static void pgarch_exit(SIGNAL_ARGS); static void ArchSigHupHandler(SIGNAL_ARGS); static void ArchSigTermHandler(SIGNAL_ARGS); diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 243dc8bc53..2371cd2ff9 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -243,7 +243,7 @@ static instr_time total_func_time; static pid_t pgstat_forkexec(void); #endif -NON_EXEC_STATIC void PgstatCollectorMain(int argc, char *argv[]); +NON_EXEC_STATIC void PgstatCollectorMain(int argc, char *argv[]) __attribute__((noreturn)); static void pgstat_exit(SIGNAL_ARGS); static void pgstat_beshutdown_hook(int code, Datum arg); static void pgstat_sighup_handler(SIGNAL_ARGS); diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index eeea933b19..913734fbd0 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -343,8 +343,8 @@ static void LogChildExit(int lev, const char *procname, int pid, int exitstatus); static void PostmasterStateMachine(void); static void BackendInitialize(Port *port); -static int BackendRun(Port *port); -static void ExitPostmaster(int status); +static void BackendRun(Port *port) __attribute__((noreturn)); +static void ExitPostmaster(int status) __attribute__((noreturn)); static int ServerLoop(void); static int BackendStartup(Port *port); static int ProcessStartupPacket(Port *port, bool SSLdone); @@ -491,7 +491,7 @@ HANDLE PostmasterHandle; /* * Postmaster main entry point */ -int +void PostmasterMain(int argc, char *argv[]) { int opt; @@ -1125,7 +1125,7 @@ PostmasterMain(int argc, char *argv[]) */ ExitPostmaster(status != STATUS_OK); - return 0; /* not reached */ + abort(); /* not reached */ } @@ -3295,7 +3295,7 @@ BackendStartup(Port *port) BackendInitialize(port); /* And run the backend */ - proc_exit(BackendRun(port)); + BackendRun(port); } #endif /* EXEC_BACKEND */ @@ -3539,7 +3539,7 @@ BackendInitialize(Port *port) * Shouldn't return at all. * If PostgresMain() fails, return status. */ -static int +static void BackendRun(Port *port) { char **av; @@ -3610,7 +3610,7 @@ BackendRun(Port *port) */ MemoryContextSwitchTo(TopMemoryContext); - return (PostgresMain(ac, av, port->user_name)); + PostgresMain(ac, av, port->user_name); } @@ -3960,7 +3960,7 @@ internal_forkexec(int argc, char *argv[], Port *port) * have been inherited by fork() on Unix. Remaining arguments go to the * subprocess FooMain() routine. */ -int +void SubPostmasterMain(int argc, char *argv[]) { Port port; @@ -4111,7 +4111,7 @@ SubPostmasterMain(int argc, char *argv[]) CreateSharedMemoryAndSemaphores(false, 0); /* And run the backend */ - proc_exit(BackendRun(&port)); + BackendRun(&port); /* does not return */ } if (strcmp(argv[1], "--forkboot") == 0) { @@ -4127,8 +4127,7 @@ SubPostmasterMain(int argc, char *argv[]) /* Attach process to shared data structures */ CreateSharedMemoryAndSemaphores(false, 0); - AuxiliaryProcessMain(argc - 2, argv + 2); - proc_exit(0); + AuxiliaryProcessMain(argc - 2, argv + 2); /* does not return */ } if (strcmp(argv[1], "--forkavlauncher") == 0) { @@ -4144,8 +4143,7 @@ SubPostmasterMain(int argc, char *argv[]) /* Attach process to shared data structures */ CreateSharedMemoryAndSemaphores(false, 0); - AutoVacLauncherMain(argc - 2, argv + 2); - proc_exit(0); + AutoVacLauncherMain(argc - 2, argv + 2); /* does not return */ } if (strcmp(argv[1], "--forkavworker") == 0) { @@ -4161,8 +4159,7 @@ SubPostmasterMain(int argc, char *argv[]) /* Attach process to shared data structures */ CreateSharedMemoryAndSemaphores(false, 0); - AutoVacWorkerMain(argc - 2, argv + 2); - proc_exit(0); + AutoVacWorkerMain(argc - 2, argv + 2); /* does not return */ } if (strcmp(argv[1], "--forkarch") == 0) { @@ -4171,8 +4168,7 @@ SubPostmasterMain(int argc, char *argv[]) /* Do not want to attach to shared memory */ - PgArchiverMain(argc, argv); - proc_exit(0); + PgArchiverMain(argc, argv); /* does not return */ } if (strcmp(argv[1], "--forkcol") == 0) { @@ -4181,8 +4177,7 @@ SubPostmasterMain(int argc, char *argv[]) /* Do not want to attach to shared memory */ - PgstatCollectorMain(argc, argv); - proc_exit(0); + PgstatCollectorMain(argc, argv); /* does not return */ } if (strcmp(argv[1], "--forklog") == 0) { @@ -4191,11 +4186,10 @@ SubPostmasterMain(int argc, char *argv[]) /* Do not want to attach to shared memory */ - SysLoggerMain(argc, argv); - proc_exit(0); + SysLoggerMain(argc, argv); /* does not return */ } - return 1; /* shouldn't get here */ + abort(); /* shouldn't get here */ } #endif /* EXEC_BACKEND */ diff --git a/src/backend/postmaster/syslogger.c b/src/backend/postmaster/syslogger.c index 25d095b158..919cc49fa9 100644 --- a/src/backend/postmaster/syslogger.c +++ b/src/backend/postmaster/syslogger.c @@ -139,6 +139,7 @@ static volatile sig_atomic_t rotation_requested = false; static pid_t syslogger_forkexec(void); static void syslogger_parseArgs(int argc, char *argv[]); #endif +NON_EXEC_STATIC void SysLoggerMain(int argc, char *argv[]) __attribute__((noreturn)); static void process_pipe_input(char *logbuffer, int *bytes_in_logbuffer); static void flush_pipe_input(char *logbuffer, int *bytes_in_logbuffer); static void open_csvlogfile(void); diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index d5cb778f7e..616d4e73e3 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -120,7 +120,7 @@ static void WalSndLastCycleHandler(SIGNAL_ARGS); /* Prototypes for private functions */ static bool HandleReplicationCommand(const char *cmd_string); -static int WalSndLoop(void); +static void WalSndLoop(void) __attribute__((noreturn)); static void InitWalSnd(void); static void WalSndHandshake(void); static void WalSndKill(int code, Datum arg); @@ -135,7 +135,7 @@ static void WalSndKeepalive(char *msgbuf); /* Main entry point for walsender process */ -int +void WalSenderMain(void) { MemoryContext walsnd_context; @@ -192,7 +192,7 @@ WalSenderMain(void) SyncRepInitConfig(); /* Main loop of walsender */ - return WalSndLoop(); + WalSndLoop(); } /* @@ -706,7 +706,7 @@ ProcessStandbyHSFeedbackMessage(void) } /* Main loop of walsender process */ -static int +static void WalSndLoop(void) { char *output_message; @@ -882,7 +882,7 @@ WalSndLoop(void) whereToSendOutput = DestNone; proc_exit(0); - return 1; /* keep the compiler quiet */ + abort(); /* keep the compiler quiet */ } /* Initialize a per-walsender data structure for this walsender process */ diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 51b6df54f4..9a5438f18a 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -3507,7 +3507,7 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx) * for the session. * ---------------------------------------------------------------- */ -int +void PostgresMain(int argc, char *argv[], const char *username) { const char *dbname; @@ -3721,7 +3721,10 @@ PostgresMain(int argc, char *argv[], const char *username) /* If this is a WAL sender process, we're done with initialization. */ if (am_walsender) - proc_exit(WalSenderMain()); + { + WalSenderMain(); /* does not return */ + abort(); + } /* * process any libraries that should be preloaded at backend start (this @@ -4199,7 +4202,7 @@ PostgresMain(int argc, char *argv[], const char *username) /* can't get here because the above loop never exits */ Assert(false); - return 1; /* keep compiler quiet */ + abort(); /* keep compiler quiet */ } diff --git a/src/backend/utils/misc/help_config.c b/src/backend/utils/misc/help_config.c index 5f772f9671..386ec98a32 100644 --- a/src/backend/utils/misc/help_config.c +++ b/src/backend/utils/misc/help_config.c @@ -43,7 +43,7 @@ static void printMixedStruct(mixedStruct *structToPrint); static bool displayStruct(mixedStruct *structToDisplay); -int +void GucInfoMain(void) { struct config_generic **guc_vars; @@ -64,7 +64,7 @@ GucInfoMain(void) printMixedStruct(var); } - return 0; + exit(0); } diff --git a/src/include/bootstrap/bootstrap.h b/src/include/bootstrap/bootstrap.h index e966a73977..b31bca9411 100644 --- a/src/include/bootstrap/bootstrap.h +++ b/src/include/bootstrap/bootstrap.h @@ -40,7 +40,7 @@ extern Form_pg_attribute attrtypes[MAXATTR]; extern int numattr; -extern void AuxiliaryProcessMain(int argc, char *argv[]); +extern void AuxiliaryProcessMain(int argc, char *argv[]) __attribute__((noreturn)); extern void err_out(void); diff --git a/src/include/pgstat.h b/src/include/pgstat.h index cad9b54e7b..613c1c2ad8 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -749,7 +749,7 @@ extern void pgstat_reset_all(void); extern void allow_immediate_pgstat_restart(void); #ifdef EXEC_BACKEND -extern void PgstatCollectorMain(int argc, char *argv[]); +extern void PgstatCollectorMain(int argc, char *argv[]) __attribute__((noreturn)); #endif diff --git a/src/include/postmaster/autovacuum.h b/src/include/postmaster/autovacuum.h index 8009fde1e0..a851758aeb 100644 --- a/src/include/postmaster/autovacuum.h +++ b/src/include/postmaster/autovacuum.h @@ -52,8 +52,8 @@ extern void AutoVacWorkerFailed(void); extern void AutoVacuumUpdateDelay(void); #ifdef EXEC_BACKEND -extern void AutoVacLauncherMain(int argc, char *argv[]); -extern void AutoVacWorkerMain(int argc, char *argv[]); +extern void AutoVacLauncherMain(int argc, char *argv[]) __attribute__((noreturn)); +extern void AutoVacWorkerMain(int argc, char *argv[]) __attribute__((noreturn)); extern void AutovacuumWorkerIAm(void); extern void AutovacuumLauncherIAm(void); #endif diff --git a/src/include/postmaster/bgwriter.h b/src/include/postmaster/bgwriter.h index f46d4ad707..996065c2ed 100644 --- a/src/include/postmaster/bgwriter.h +++ b/src/include/postmaster/bgwriter.h @@ -25,8 +25,8 @@ extern int CheckPointTimeout; extern int CheckPointWarning; extern double CheckPointCompletionTarget; -extern void BackgroundWriterMain(void); -extern void CheckpointerMain(void); +extern void BackgroundWriterMain(void) __attribute__((noreturn)); +extern void CheckpointerMain(void) __attribute__((noreturn)); extern void RequestCheckpoint(int flags); extern void CheckpointWriteDelay(int flags, double progress); diff --git a/src/include/postmaster/pgarch.h b/src/include/postmaster/pgarch.h index 8e4472544f..be61031db1 100644 --- a/src/include/postmaster/pgarch.h +++ b/src/include/postmaster/pgarch.h @@ -20,7 +20,7 @@ extern int pgarch_start(void); #ifdef EXEC_BACKEND -extern void PgArchiverMain(int argc, char *argv[]); +extern void PgArchiverMain(int argc, char *argv[]) __attribute__((noreturn)); #endif #endif /* _PGARCH_H */ diff --git a/src/include/postmaster/postmaster.h b/src/include/postmaster/postmaster.h index 683ce3c407..7d01d3d624 100644 --- a/src/include/postmaster/postmaster.h +++ b/src/include/postmaster/postmaster.h @@ -46,14 +46,14 @@ extern int postmaster_alive_fds[2]; extern const char *progname; -extern int PostmasterMain(int argc, char *argv[]); +extern void PostmasterMain(int argc, char *argv[]) __attribute__((noreturn)); extern void ClosePostmasterPorts(bool am_syslogger); extern int MaxLivePostmasterChildren(void); #ifdef EXEC_BACKEND extern pid_t postmaster_forkexec(int argc, char *argv[]); -extern int SubPostmasterMain(int argc, char *argv[]); +extern void SubPostmasterMain(int argc, char *argv[]) __attribute__((noreturn)); extern Size ShmemBackendArraySize(void); extern void ShmemBackendArrayAllocation(void); diff --git a/src/include/postmaster/startup.h b/src/include/postmaster/startup.h index 3ec69502eb..54400b5d2a 100644 --- a/src/include/postmaster/startup.h +++ b/src/include/postmaster/startup.h @@ -13,7 +13,7 @@ #define _STARTUP_H extern void HandleStartupProcInterrupts(void); -extern void StartupProcessMain(void); +extern void StartupProcessMain(void) __attribute__((noreturn)); extern void PreRestoreCommand(void); extern void PostRestoreCommand(void); extern bool IsPromoteTriggered(void); diff --git a/src/include/postmaster/syslogger.h b/src/include/postmaster/syslogger.h index dc88207b3d..cb0ccb6955 100644 --- a/src/include/postmaster/syslogger.h +++ b/src/include/postmaster/syslogger.h @@ -84,7 +84,7 @@ extern int SysLogger_Start(void); extern void write_syslogger_file(const char *buffer, int count, int dest); #ifdef EXEC_BACKEND -extern void SysLoggerMain(int argc, char *argv[]); +extern void SysLoggerMain(int argc, char *argv[]) __attribute__((noreturn)); #endif #endif /* _SYSLOGGER_H */ diff --git a/src/include/postmaster/walwriter.h b/src/include/postmaster/walwriter.h index 41c539a359..922142a9d1 100644 --- a/src/include/postmaster/walwriter.h +++ b/src/include/postmaster/walwriter.h @@ -15,6 +15,6 @@ /* GUC options */ extern int WalWriterDelay; -extern void WalWriterMain(void); +extern void WalWriterMain(void) __attribute__((noreturn)); #endif /* _WALWRITER_H */ diff --git a/src/include/replication/walreceiver.h b/src/include/replication/walreceiver.h index d21ec94a45..31449d214e 100644 --- a/src/include/replication/walreceiver.h +++ b/src/include/replication/walreceiver.h @@ -109,7 +109,7 @@ typedef void (*walrcv_disconnect_type) (void); extern PGDLLIMPORT walrcv_disconnect_type walrcv_disconnect; /* prototypes for functions in walreceiver.c */ -extern void WalReceiverMain(void); +extern void WalReceiverMain(void) __attribute__((noreturn)); /* prototypes for functions in walreceiverfuncs.c */ extern Size WalRcvShmemSize(void); diff --git a/src/include/replication/walsender.h b/src/include/replication/walsender.h index 128d2dbf59..65536016c2 100644 --- a/src/include/replication/walsender.h +++ b/src/include/replication/walsender.h @@ -26,7 +26,7 @@ extern volatile sig_atomic_t walsender_ready_to_stop; extern int max_wal_senders; extern int replication_timeout; -extern int WalSenderMain(void); +extern void WalSenderMain(void) __attribute__((noreturn)); extern void WalSndSignals(void); extern Size WalSndShmemSize(void); extern void WalSndShmemInit(void); diff --git a/src/include/storage/ipc.h b/src/include/storage/ipc.h index 16025c3dde..3bc2e58345 100644 --- a/src/include/storage/ipc.h +++ b/src/include/storage/ipc.h @@ -64,7 +64,7 @@ typedef void (*shmem_startup_hook_type) (void); /* ipc.c */ extern bool proc_exit_inprogress; -extern void proc_exit(int code); +extern void proc_exit(int code) __attribute__((noreturn)); extern void shmem_exit(int code); extern void on_proc_exit(pg_on_exit_callback function, Datum arg); extern void on_shmem_exit(pg_on_exit_callback function, Datum arg); diff --git a/src/include/tcop/tcopprot.h b/src/include/tcop/tcopprot.h index 964dd19c2c..2ac6554e64 100644 --- a/src/include/tcop/tcopprot.h +++ b/src/include/tcop/tcopprot.h @@ -61,7 +61,7 @@ extern bool check_max_stack_depth(int *newval, void **extra, GucSource source); extern void assign_max_stack_depth(int newval, void *extra); extern void die(SIGNAL_ARGS); -extern void quickdie(SIGNAL_ARGS); +extern void quickdie(SIGNAL_ARGS) __attribute__((noreturn)); extern void StatementCancelHandler(SIGNAL_ARGS); extern void FloatExceptionHandler(SIGNAL_ARGS); extern void RecoveryConflictInterrupt(ProcSignalReason reason); /* called from SIGUSR1 @@ -70,7 +70,7 @@ extern void prepare_for_client_read(void); extern void client_read_ended(void); extern const char *process_postgres_switches(int argc, char *argv[], GucContext ctx); -extern int PostgresMain(int argc, char *argv[], const char *username); +extern void PostgresMain(int argc, char *argv[], const char *username) __attribute__((noreturn)); extern long get_stack_depth_rlimit(void); extern void ResetUsage(void); extern void ShowUsage(const char *title); diff --git a/src/include/utils/help_config.h b/src/include/utils/help_config.h index b569a4edad..61e04e9569 100644 --- a/src/include/utils/help_config.h +++ b/src/include/utils/help_config.h @@ -12,6 +12,6 @@ #ifndef HELP_CONFIG_H #define HELP_CONFIG_H 1 -extern int GucInfoMain(void); +extern void GucInfoMain(void) __attribute__((noreturn)); #endif