From 344d0cae64dbf398559b855806fc7338ec0a2e64 Mon Sep 17 00:00:00 2001 From: Magnus Hagander Date: Tue, 23 Oct 2007 17:58:01 +0000 Subject: [PATCH] Use snprintf instead of wsprintf, and use getenv("APPDATA") instead of SHGetFolderPath. This removes the direct dependency on shell32.dll and user32.dll, which eats a lot of "desktop heap" for each backend that's started. The desktop heap is a very limited resource, causing backends to no longer start once it's been exhausted. We still have indirect depdendencies on user32.dll through third party libraries, but those can't easily be removed. Dave Page --- src/backend/port/win32/signal.c | 6 +++--- src/port/kill.c | 4 ++-- src/port/path.c | 12 ++++++++---- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/backend/port/win32/signal.c b/src/backend/port/win32/signal.c index a6b2715e07..c073c84b34 100644 --- a/src/backend/port/win32/signal.c +++ b/src/backend/port/win32/signal.c @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/port/win32/signal.c,v 1.18 2007/01/05 22:19:35 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/port/win32/signal.c,v 1.19 2007/10/23 17:58:01 mha Exp $ * *------------------------------------------------------------------------- */ @@ -178,7 +178,7 @@ pgwin32_create_signal_listener(pid_t pid) char pipename[128]; HANDLE pipe; - wsprintf(pipename, "\\\\.\\pipe\\pgsignal_%d", (int) pid); + snprintf(pipename, sizeof(pipename), "\\\\.\\pipe\\pgsignal_%u", (int) pid); pipe = CreateNamedPipe(pipename, PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, @@ -251,7 +251,7 @@ pg_signal_thread(LPVOID param) char pipename[128]; HANDLE pipe = pgwin32_initial_signal_pipe; - wsprintf(pipename, "\\\\.\\pipe\\pgsignal_%d", GetCurrentProcessId()); + snprintf(pipename, sizeof(pipename), "\\\\.\\pipe\\pgsignal_%u", GetCurrentProcessId()); for (;;) { diff --git a/src/port/kill.c b/src/port/kill.c index 12d5dec456..d097051bae 100644 --- a/src/port/kill.c +++ b/src/port/kill.c @@ -9,7 +9,7 @@ * signals that the backend can recognize. * * IDENTIFICATION - * $PostgreSQL: pgsql/src/port/kill.c,v 1.8 2007/01/05 22:20:02 momjian Exp $ + * $PostgreSQL: pgsql/src/port/kill.c,v 1.9 2007/10/23 17:58:01 mha Exp $ * *------------------------------------------------------------------------- */ @@ -38,7 +38,7 @@ pgkill(int pid, int sig) errno = EINVAL; return -1; } - wsprintf(pipename, "\\\\.\\pipe\\pgsignal_%i", pid); + snprintf(pipename, sizeof(pipename), "\\\\.\\pipe\\pgsignal_%u", pid); if (!CallNamedPipe(pipename, &sigData, 1, &sigRet, 1, &bytes, 1000)) { if (GetLastError() == ERROR_FILE_NOT_FOUND) diff --git a/src/port/path.c b/src/port/path.c index 10307d0988..c43843bb46 100644 --- a/src/port/path.c +++ b/src/port/path.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/port/path.c,v 1.71 2007/01/05 22:20:02 momjian Exp $ + * $PostgreSQL: pgsql/src/port/path.c,v 1.72 2007/10/23 17:58:01 mha Exp $ * *------------------------------------------------------------------------- */ @@ -628,10 +628,14 @@ get_home_path(char *ret_path) strlcpy(ret_path, pwd->pw_dir, MAXPGPATH); return true; #else - char tmppath[MAX_PATH]; + char *tmppath; - ZeroMemory(tmppath, sizeof(tmppath)); - if (SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, tmppath) != S_OK) + /* + * Note: We use getenv here because the more modern SHGetSpecialFolderPath() + * will force us to link with shell32.lib which eats valuable desktop heap. + */ + tmppath = getenv("APPDATA"); + if (!tmppath) return false; snprintf(ret_path, MAXPGPATH, "%s/postgresql", tmppath); return true;