diff options
Diffstat (limited to 'src/backend/postmaster/postmaster.c')
-rw-r--r-- | src/backend/postmaster/postmaster.c | 79 |
1 files changed, 31 insertions, 48 deletions
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 54e9bfb8c48..0d876c61fd7 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -227,7 +227,8 @@ int ReservedConnections; /* The socket(s) we're listening to. */ #define MAXLISTEN 64 -static pgsocket ListenSocket[MAXLISTEN]; +static int NumListenSockets = 0; +static pgsocket *ListenSockets = NULL; /* still more option variables */ bool EnableSSL = false; @@ -588,7 +589,6 @@ PostmasterMain(int argc, char *argv[]) int status; char *userDoption = NULL; bool listen_addr_saved = false; - int i; char *output_config_variable = NULL; InitProcessGlobals(); @@ -1143,17 +1143,6 @@ PostmasterMain(int argc, char *argv[]) LOG_METAINFO_DATAFILE))); /* - * Initialize input sockets. - * - * Mark them all closed, and set up an on_proc_exit function that's - * charged with closing the sockets again at postmaster shutdown. - */ - for (i = 0; i < MAXLISTEN; i++) - ListenSocket[i] = PGINVALID_SOCKET; - - on_proc_exit(CloseServerPorts, 0); - - /* * If enabled, start up syslogger collection subprocess */ SysLoggerPID = SysLogger_Start(); @@ -1187,7 +1176,13 @@ PostmasterMain(int argc, char *argv[]) /* * Establish input sockets. + * + * First set up an on_proc_exit function that's charged with closing the + * sockets again at postmaster shutdown. */ + ListenSockets = palloc(MAXLISTEN * sizeof(pgsocket)); + on_proc_exit(CloseServerPorts, 0); + if (ListenAddresses) { char *rawstring; @@ -1216,12 +1211,16 @@ PostmasterMain(int argc, char *argv[]) status = StreamServerPort(AF_UNSPEC, NULL, (unsigned short) PostPortNumber, NULL, - ListenSocket, MAXLISTEN); + ListenSockets, + &NumListenSockets, + MAXLISTEN); else status = StreamServerPort(AF_UNSPEC, curhost, (unsigned short) PostPortNumber, NULL, - ListenSocket, MAXLISTEN); + ListenSockets, + &NumListenSockets, + MAXLISTEN); if (status == STATUS_OK) { @@ -1249,7 +1248,7 @@ PostmasterMain(int argc, char *argv[]) #ifdef USE_BONJOUR /* Register for Bonjour only if we opened TCP socket(s) */ - if (enable_bonjour && ListenSocket[0] != PGINVALID_SOCKET) + if (enable_bonjour && NumListenSockets > 0) { DNSServiceErrorType err; @@ -1313,7 +1312,9 @@ PostmasterMain(int argc, char *argv[]) status = StreamServerPort(AF_UNIX, NULL, (unsigned short) PostPortNumber, socketdir, - ListenSocket, MAXLISTEN); + ListenSockets, + &NumListenSockets, + MAXLISTEN); if (status == STATUS_OK) { @@ -1339,7 +1340,7 @@ PostmasterMain(int argc, char *argv[]) /* * check that we have some socket to listen on */ - if (ListenSocket[0] == PGINVALID_SOCKET) + if (NumListenSockets == 0) ereport(FATAL, (errmsg("no socket created for listening"))); @@ -1487,14 +1488,9 @@ CloseServerPorts(int status, Datum arg) * before we remove the postmaster.pid lockfile; otherwise there's a race * condition if a new postmaster wants to re-use the TCP port number. */ - for (i = 0; i < MAXLISTEN; i++) - { - if (ListenSocket[i] != PGINVALID_SOCKET) - { - StreamClose(ListenSocket[i]); - ListenSocket[i] = PGINVALID_SOCKET; - } - } + for (i = 0; i < NumListenSockets; i++) + StreamClose(ListenSockets[i]); + NumListenSockets = 0; /* * Next, remove any filesystem entries for Unix sockets. To avoid race @@ -1695,29 +1691,19 @@ DetermineSleepTime(void) static void ConfigurePostmasterWaitSet(bool accept_connections) { - int nsockets; - if (pm_wait_set) FreeWaitEventSet(pm_wait_set); pm_wait_set = NULL; - /* How many server sockets do we need to wait for? */ - nsockets = 0; - if (accept_connections) - { - while (nsockets < MAXLISTEN && - ListenSocket[nsockets] != PGINVALID_SOCKET) - ++nsockets; - } - - pm_wait_set = CreateWaitEventSet(CurrentMemoryContext, 1 + nsockets); + pm_wait_set = CreateWaitEventSet(CurrentMemoryContext, + accept_connections ? (1 + NumListenSockets) : 1); AddWaitEventToSet(pm_wait_set, WL_LATCH_SET, PGINVALID_SOCKET, MyLatch, NULL); if (accept_connections) { - for (int i = 0; i < nsockets; i++) - AddWaitEventToSet(pm_wait_set, WL_SOCKET_ACCEPT, ListenSocket[i], + for (int i = 0; i < NumListenSockets; i++) + AddWaitEventToSet(pm_wait_set, WL_SOCKET_ACCEPT, ListenSockets[i], NULL, NULL); } } @@ -2579,14 +2565,11 @@ ClosePostmasterPorts(bool am_syslogger) * EXEC_BACKEND mode. */ #ifndef EXEC_BACKEND - for (int i = 0; i < MAXLISTEN; i++) - { - if (ListenSocket[i] != PGINVALID_SOCKET) - { - StreamClose(ListenSocket[i]); - ListenSocket[i] = PGINVALID_SOCKET; - } - } + for (int i = 0; i < NumListenSockets; i++) + StreamClose(ListenSockets[i]); + NumListenSockets = 0; + pfree(ListenSockets); + ListenSockets = NULL; #endif /* |