From ec97a0b68de76126508507fcb4305e6cad09a20a Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Fri, 8 Dec 2023 10:30:37 +0200 Subject: [PATCH v5 2/8] Remove ConnCreate and ConnFree, and allocate Port in stack By allocating Port in stack, we don't need to deal with out-of-memory errors, which makes the code a little less verbose. XXX: This should perhaps be squashed with the next commit. It changes how the Port structure is allocated again. But maybe it's easier to review separately. Reviewed-by: Tristan Partin, Andres Freund Discussion: https://www.postgresql.org/message-id/7a59b073-5b5b-151e-7ed3-8b01ff7ce9ef@iki.fi --- src/backend/postmaster/postmaster.c | 68 +++++------------------------ src/backend/tcop/postgres.c | 6 +-- 2 files changed, 13 insertions(+), 61 deletions(-) diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index e53057e83a7..8a12ca696de 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -397,8 +397,6 @@ static void CloseServerPorts(int status, Datum arg); static void unlink_external_pid_file(int status, Datum arg); static void getInstallationPaths(const char *argv0); static void checkControlFile(void); -static Port *ConnCreate(int serverFd); -static void ConnFree(Port *port); static void handle_pm_pmsignal_signal(SIGNAL_ARGS); static void handle_pm_child_exit_signal(SIGNAL_ARGS); static void handle_pm_reload_request_signal(SIGNAL_ARGS); @@ -1772,20 +1770,18 @@ ServerLoop(void) if (events[i].events & WL_SOCKET_ACCEPT) { - Port *port; + Port port; - port = ConnCreate(events[i].fd); - if (port) - { - BackendStartup(port); + memset(&port, 0, sizeof(port)); + if (StreamConnection(events[i].fd, &port) == STATUS_OK) + BackendStartup(&port); - /* - * We no longer need the open socket or port structure in - * this process - */ - StreamClose(port->sock); - ConnFree(port); - } + /* + * We no longer need the open socket or port structure in this + * process + */ + if (port.sock != PGINVALID_SOCKET) + StreamClose(port.sock); } } @@ -2447,50 +2443,6 @@ canAcceptConnections(int backend_type) return result; } - -/* - * ConnCreate -- create a local connection data structure - * - * Returns NULL on failure, other than out-of-memory which is fatal. - */ -static Port * -ConnCreate(int serverFd) -{ - Port *port; - - if (!(port = (Port *) calloc(1, sizeof(Port)))) - { - ereport(LOG, - (errcode(ERRCODE_OUT_OF_MEMORY), - errmsg("out of memory"))); - ExitPostmaster(1); - } - - if (StreamConnection(serverFd, port) != STATUS_OK) - { - if (port->sock != PGINVALID_SOCKET) - StreamClose(port->sock); - ConnFree(port); - return NULL; - } - - return port; -} - - -/* - * ConnFree -- free a local connection data structure - * - * Caller has already closed the socket if any, so there's not much - * to do here. - */ -static void -ConnFree(Port *port) -{ - free(port); -} - - /* * ClosePostmasterPorts -- close all the postmaster's open sockets * diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 7298a187d18..0dc2132dac5 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -4214,9 +4214,9 @@ PostgresMain(const char *dbname, const char *username) /* * If the PostmasterContext is still around, recycle the space; we don't * need it anymore after InitPostgres completes. Note this does not trash - * *MyProcPort, because ConnCreate() allocated that space with malloc() - * ... else we'd need to copy the Port data first. Also, subsidiary data - * such as the username isn't lost either; see ProcessStartupPacket(). + * *MyProcPort, because that space is allocated in stack ... else we'd + * need to copy the Port data first. Also, subsidiary data such as the + * username isn't lost either; see ProcessStartupPacket(). */ if (PostmasterContext) { -- 2.39.2