From eeece9e60984e76e5a41c1e2fa9efc5a1761e560 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut <peter_e@gmx.net> Date: Mon, 25 Jun 2012 21:25:26 +0300 Subject: [PATCH] Unify calling conventions for postgres/postmaster sub-main functions There was a wild mix of calling conventions: Some were declared to return void and didn't return, some returned an int exit code, some claimed to return an exit code, which the callers checked, but actually never returned, and so on. Now all of these functions are declared to return void and decorated with attribute noreturn and don't return. That's easiest, and most code already worked that way. --- src/backend/main/main.c | 17 ++++++------ src/backend/postmaster/autovacuum.c | 4 +-- src/backend/postmaster/pgarch.c | 2 +- src/backend/postmaster/pgstat.c | 2 +- src/backend/postmaster/postmaster.c | 38 +++++++++++---------------- src/backend/postmaster/syslogger.c | 1 + src/backend/replication/walsender.c | 10 +++---- src/backend/tcop/postgres.c | 9 ++++--- src/backend/utils/misc/help_config.c | 4 +-- src/include/bootstrap/bootstrap.h | 2 +- src/include/pgstat.h | 2 +- src/include/postmaster/autovacuum.h | 4 +-- src/include/postmaster/bgwriter.h | 4 +-- src/include/postmaster/pgarch.h | 2 +- src/include/postmaster/postmaster.h | 4 +-- src/include/postmaster/startup.h | 2 +- src/include/postmaster/syslogger.h | 2 +- src/include/postmaster/walwriter.h | 2 +- src/include/replication/walreceiver.h | 2 +- src/include/replication/walsender.h | 2 +- src/include/storage/ipc.h | 2 +- src/include/tcop/tcopprot.h | 4 +-- src/include/utils/help_config.h | 2 +- 23 files changed, 60 insertions(+), 63 deletions(-) diff --git a/src/backend/main/main.c b/src/backend/main/main.c index c7d48e95ad6..33c5a0a4e64 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 1cfac9e80ba..dade5cc3c05 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 5c43cdde653..d5d8be0587d 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 243dc8bc53e..2371cd2ff9b 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 eeea933b192..913734fbd00 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 25d095b158d..919cc49fa94 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 d5cb778f7e6..616d4e73e3b 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 51b6df54f4c..9a5438f18af 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 5f772f96717..386ec98a32f 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 e966a73977c..b31bca94110 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 cad9b54e7b5..613c1c2ad8a 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 8009fde1e07..a851758aeb6 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 f46d4ad7077..996065c2edf 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 8e4472544f1..be61031db17 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 683ce3c4074..7d01d3d6248 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 3ec69502eb1..54400b5d2ac 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 dc88207b3d9..cb0ccb6955b 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 41c539a359d..922142a9d11 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 d21ec94a455..31449d214ec 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 128d2dbf592..65536016c28 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 16025c3dde3..3bc2e58345f 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 964dd19c2c3..2ac6554e645 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 b569a4edad8..61e04e95697 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 -- GitLab