Re: [PATCH] Add a new lstat implementation based on Win32 API, and make stat use that implementation too.
- From
Johannes Sixt <johannes.sixt@telecom.at>
- Date
- Sep 2, 2007, 18:16 UTC
- Message-ID
- <200709022016.54262.johannes.sixt@telecom.at>
- In-Reply-To
- <46DACE0D.5070501@trolltech.com>
On Sunday 02 September 2007 16:51, Marius Storm-Olsen wrote:
Show 5 quoted lines
> This gives us a significant speedup when adding, committing and stat'ing > files. (Also, since Windows doesn't really handle symlinks, it's fine that > stat just uses lstat) > > Signed-off-by: Marius Storm-Olsen <mstormo_git@storm-olsen.com>
Your numbers show an improvement of 50% and more. That is terrific!
I'll test it out an put the patch into mingw.git. I hope you don't mind if I also include your analysis and statistics in the commit message. It's worth keeping around! BTW, which of your email addresses would you like registered as author?
Show 7 quoted lines
> + ext = strrchr(file_name, '.'); > + if (ext && (!_stricmp(ext, ".exe") || > + !_stricmp(ext, ".com") || > + !_stricmp(ext, ".bat") || > + !_stricmp(ext, ".cmd"))) > + fMode |= S_IEXEC; > + }
I'm slightly negative about this. For a native Windows project the executable bit does not matter, and for a cross-platform project this check is not sufficient, but can even become annoying (think of a file named 'www.google.com'). So we can just as well spare the few cycles.
> + buf->st_size = fdata.nFileSizeLow; /* Can't use nFileSizeHigh, since > it's not a stat64 */
Here's an idea for the future: With this self-made stat() implementation it should also be possible to get rid of Windows's native struct stat: Make a private definition of it, too, and use all 64 bits.
> return 0; > + } > + errno = ENOENT;
Of course we need a bit more detailed error conditions, most importantly EACCES should be distinguished.
Show 5 quoted lines
> +/* Make git on Windows use git_lstat and git_stat instead of lstat and > stat */ +int git_lstat(const char *file_name, struct stat *buf); > +int git_stat(const char *file_name, struct stat *buf); > +#define lstat(x,y) git_lstat(x,y) > +#define stat(x,y) git_stat(x,y)
I'd go the short route without git_stat() and
#define stat(x,y) git_lstat(x,y)
-- Hannes