git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] MinGW: implement mmap

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Mar 18, 2009, 11:18 UTC
Message-ID
<alpine.DEB.1.00.0903181213050.10279@pacific.mpi-cbg.de>
In-Reply-To
<49C0A462.3060902@kdbg.org>
Hi,
On Wed, 18 Mar 2009, Johannes Sixt wrote:
Show 25 quoted lines
> From: Janos Laube <janos.dev@gmail.com>
> Date: Fri, 13 Mar 2009 16:50:45 +0100
> 
> Add USE_WIN32_MMAP which triggers the use of windows' native
> file memory mapping functionality in git_mmap()/git_munmap() functions.
> 
> As git functions currently use mmap with MAP_PRIVATE set only, this
> implementation supports only that mode for now.
> 
> On Windows, offsets for memory mapped files need to match the allocation
> granularity. Take this into account when calculating the packed git-
> windowsize and file offsets. At the moment, the only function which makes
> use of offsets in conjunction with mmap is use_pack() in sha1-file.c.
> 
> Git fast-import's code path tries to map a portion of the temporary
> packfile that exceeds the current filesize, i.e. offset+length is
> greater than the filesize. The NO_MMAP code worked with that since pread()
> just reads the file content until EOF and returns gracefully, while
> MapViewOfFile() aborts the mapping and returns 'Access Denied'.
> Working around that by determining the filesize and adjusting the length
> parameter.
> 
> Signed-off-by: Janos Laube <janos.dev@gmail.com>
> Signed-off-by: Johannes Sixt <j6t@kdbg.org>
> ---

In case anybody wonders why this is not integrated into mingw.[ch]: I asked for it, as it is Windows-specific and could benefit Cygwin (or MSVC, should someone attempt that), too.

And I think I missed this style in the patch:
> +void *git_mmap
> +(void *start, size_t length, int prot, int flags, int fd, off_t offset)
> +{
... which I would like to see fixed, of course... :-)

Unfortunately, there is also a long line, which is corrupted due to wrapping:

> +	hmap = CreateFileMapping((HANDLE)_get_osfhandle(fd), 0,
> PAGE_WRITECOPY,
> +		0, 0, 0);
It is easily fixed by moving the PAGE_WRITECOPY to the next line.
These are only style issues, though.

The more important part is: how much does this buy us (or is it more expensive, as we saw one MacOSX at one stage). Janos was nice enough to perform some benchmark tests, and saw a ~40% improvement on rev-list --objects --all on a sizeable project (GCC 'twas, IIRC). Funnily, the numbers got better when reducing the window, up until 1MB, and they got worse when enlarging the window.

So I guess there will be a follow-up patch at some stage which changes the default pack window size on Windows to something smaller than 64MB.

Ciao, Dscho

Previous: Johannes Sixt
Message 2 of 2 in “MinGW: implement mmap”
  1. MinGW: implement mmapJohannes Sixt, Mar 18, 2009
  2. Johannes SchindelinMar 18, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.