threads / patch / 22371

patchWindows: avoid static dependency on advapi32.dll

Subject: [PATCH] Windows: avoid static dependency on advapi32.dll

## tl;dr

2 messages between Jan 24, 2010 and Jan 24, 2010. Diffs are folded; open one to read it.

replies: 1people: 2as markdown or json

Michael Lukashov· Jan 24, 2010, 18:53 UTC · lore

This DLL is used to get default user name. By looking up the only function that we need at runtime, we can avoid the startup costs of this DLL.

Signed-off-by: Michael Lukashov <michael.lukashov@gmail.com>
---
 compat/mingw.c |   31 ++++++++++++++++++++++++++++++-
 1 files changed, 30 insertions(+), 1 deletions(-)
Show changes to compat/mingw.c +30 −1
diff --git a/compat/mingw.c b/compat/mingw.c
index ab65f77..6ce398c 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -1176,13 +1176,42 @@ int mingw_getpagesize(void)
 	return si.dwAllocationGranularity;
 }
 
+static HMODULE advapi32_dll = NULL;
+static BOOL (WINAPI *advapi32_get_user_name)(char *, DWORD *);
+
+static void advapi32_cleanup(void)
+{
+	if (advapi32_dll)
+		FreeLibrary(advapi32_dll);
+	advapi32_dll = NULL;
+	advapi32_get_user_name = NULL;
+}
+
 struct passwd *getpwuid(int uid)
 {
 	static char user_name[100];
 	static struct passwd p;
+	static int advapi32_initialized = 0;
 
 	DWORD len = sizeof(user_name);
-	if (!GetUserName(user_name, &len))
+
+	if (!advapi32_initialized)
+	{
+		advapi32_dll = LoadLibrary("advapi32.dll");
+		if (!advapi32_dll)
+			die("cannot load advapi32.dll");
+		advapi32_get_user_name = (BOOL (WINAPI *)(char *, DWORD *))
+			GetProcAddress(advapi32_dll, "GetUserNameA");
+		if (!advapi32_get_user_name) {
+			FreeLibrary(advapi32_dll);
+			advapi32_dll = NULL;
+			die("cannot find GetUserNameA");
+		}
+		atexit(advapi32_cleanup);
+		advapi32_initialized = 1;
+	}
+
+	if (!advapi32_get_user_name(user_name, &len))
 		return NULL;
 	p.pw_name = user_name;
 	p.pw_gecos = "unknown";
-- 
1.6.6.1599.gaed1a
Johannes Sixt· Jan 24, 2010, 19:20 UTC · re: Michael Lukashov · lore

Re: [PATCH] Windows: avoid static dependency on advapi32.dll

On Sonntag, 24. Januar 2010, Michael Lukashov wrote:
> This DLL is used to get default user name. By looking
> up the only function that we need at runtime, we can
> avoid the startup costs of this DLL.

Sorry, no. This doesn't work. Even though git.exe does no longer depend on advapi32.dll directly, it does so indirectly (via ws_32.dll). This patch is not an improvement, therefore: NAK.

-- Hannes

← back to recent threads