Skip to content

Commit

Permalink
Windows: boost startup by avoiding a static dependency on shell32.dll
Browse files Browse the repository at this point in the history
This DLL is only needed to invoke the browser in a "git help" call. By
looking up the only function that we need at runtime, we can avoid the
startup costs of this DLL.

DLL usage can be profiled with Microsoft's Dependency Walker. For example,
a call to "git diff-files" loaded

before:  19 DLLs
after:    9 DLLs

As a result, the runtime of 'make -j2 test' went down from 16:00min
to 12:40min on one of my boxes.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Johannes Sixt authored and Junio C Hamano committed Jan 17, 2010
1 parent 5693224 commit 928500e
Showing 1 changed file with 14 additions and 2 deletions.
16 changes: 14 additions & 2 deletions compat/mingw.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
#include <conio.h>
#include "../strbuf.h"

#include <shellapi.h>

static int err_win_to_posix(DWORD winerr)
{
int error = ENOSYS;
Expand Down Expand Up @@ -1338,8 +1336,22 @@ static const char *make_backslash_path(const char *path)
void mingw_open_html(const char *unixpath)
{
const char *htmlpath = make_backslash_path(unixpath);
typedef HINSTANCE (WINAPI *T)(HWND, const char *,
const char *, const char *, const char *, INT);
T ShellExecute;
HMODULE shell32;

shell32 = LoadLibrary("shell32.dll");
if (!shell32)
die("cannot load shell32.dll");
ShellExecute = (T)GetProcAddress(shell32, "ShellExecuteA");
if (!ShellExecute)
die("cannot run browser");

printf("Launching default browser to display HTML ...\n");
ShellExecute(NULL, "open", htmlpath, NULL, "\\", 0);

FreeLibrary(shell32);
}

int link(const char *oldpath, const char *newpath)
Expand Down

0 comments on commit 928500e

Please sign in to comment.