On Sat, Oct 08, 2005 at 09:11:03AM -0700, Linus Torvalds wrote: > > On Fri, 7 Oct 2005, Alex Riesen wrote: > > > > Make read_cache copy the index into memory, to improve portability on > > other OS's which have mmap too, tend to use it less commonly. > > I really think that you should just get rid of the mmap. > > As it is, you're just slowing the code down on sane architectures. That's > not good. > > So I'd suggest something like this instead. > > Totally untested, of course. > > Linus Slightly adjusted diff below so it compiles ;) (Note: only the second die() un hunk #1 was changed.) Best, Elfyn ---- diff --git a/read-cache.c b/read-cache.c --- a/read-cache.c +++ b/read-cache.c @@ -454,13 +454,39 @@ static int verify_hdr(struct cache_heade return 0; } +static void *map_index_file(int fd, size_t size) +{ + void *map; +#ifdef NO_MMAP + map = malloc(size); + if (!map) + die("Unable to allocate index file mapping"); + if (read(fd, map, size) != size) + die("Unable to read %z bytes from index", size); +#else + map = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); + if (map == MAP_FAILED) + die("index file mmap failed (%s)", strerror(errno)); +#endif + return map; +} + +static void unmap_index_file(void *map, size_t size) +{ +#ifdef NO_MMAP + free(map); +#else + munmap(map, size); +#endif +} + int read_cache(void) { int fd, i; struct stat st; unsigned long size, offset; - void *map; struct cache_header *hdr; + void *map; errno = EBUSY; if (active_cache) @@ -475,16 +501,15 @@ int read_cache(void) } size = 0; // avoid gcc warning - map = MAP_FAILED; - if (!fstat(fd, &st)) { - size = st.st_size; - errno = EINVAL; - if (size >= sizeof(struct cache_header) + 20) - map = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); - } + if (fstat(fd, &st)) + die("unable to fstat index file"); + + size = st.st_size; + errno = EINVAL; + if (size < sizeof(struct cache_header) + 20) + goto corrupt; + map = map_index_file(fd, size); close(fd); - if (map == MAP_FAILED) - die("index file mmap failed (%s)", strerror(errno)); hdr = map; if (verify_hdr(hdr, size) < 0) @@ -503,8 +528,9 @@ int read_cache(void) return active_nr; unmap: - munmap(map, size); + unmap_index_file(map, size); errno = EINVAL; +corrupt: die("index file corrupt"); } -- Elfyn McBratney Gentoo Developer/Perl Team Lead beu/irc.freenode.net http://dev.gentoo.org/~beu/ +------------O.o--------------------- http://dev.gentoo.org/~beu/pubkey.asc PGP Key ID: 0x69DF17AD PGP Key Fingerprint: DBD3 B756 ED58 B1B4 47B9 B3BD 8D41 E597 69DF 17AD