git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Windows: avoid static dependency on advapi32.dll
@ 2010-01-24 18:53 Michael Lukashov
  2010-01-24 19:20 ` Johannes Sixt
  0 siblings, 1 reply; 2+ messages in thread
From: Michael Lukashov @ 2010-01-24 18:53 UTC (permalink / raw)
  To: git; +Cc: Johannes Sixt, Michael Lukashov

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(-)

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

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] Windows: avoid static dependency on advapi32.dll
  2010-01-24 18:53 [PATCH] Windows: avoid static dependency on advapi32.dll Michael Lukashov
@ 2010-01-24 19:20 ` Johannes Sixt
  0 siblings, 0 replies; 2+ messages in thread
From: Johannes Sixt @ 2010-01-24 19:20 UTC (permalink / raw)
  To: Michael Lukashov; +Cc: git

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

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2010-01-24 19:21 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-01-24 18:53 [PATCH] Windows: avoid static dependency on advapi32.dll Michael Lukashov
2010-01-24 19:20 ` Johannes Sixt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).