David Turner <dturner@xxxxxxxxxxxxxxxx> writes: > From: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> > > Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> > --- As usual in Duy's patches, this one seriously lacks "why". And also makes the reader wonder if the memory region is ever unmapped() and if so under what condition. > diff --git a/cache.h b/cache.h > index 7e01403..c43ef3d 100644 > --- a/cache.h > +++ b/cache.h > @@ -333,11 +333,14 @@ struct index_state { > struct split_index *split_index; > struct cache_time timestamp; > unsigned name_hash_initialized : 1, > + keep_mmap : 1, > initialized : 1; > struct hashmap name_hash; > struct hashmap dir_hash; > unsigned char sha1[20]; > struct untracked_cache *untracked; > + void *mmap; > + size_t mmap_size; > }; > > extern struct index_state the_index; > diff --git a/read-cache.c b/read-cache.c > index 16cc487..7e387e9 100644 > --- a/read-cache.c > +++ b/read-cache.c > @@ -1574,6 +1574,10 @@ int do_read_index(struct index_state *istate, const char *path, int must_exist) > mmap = xmmap(NULL, mmap_size, PROT_READ, MAP_PRIVATE, fd, 0); > if (mmap == MAP_FAILED) > die_errno("unable to map index file"); > + if (istate->keep_mmap) { > + istate->mmap = mmap; > + istate->mmap_size = mmap_size; > + } > close(fd); > > hdr = mmap; > @@ -1626,10 +1630,12 @@ int do_read_index(struct index_state *istate, const char *path, int must_exist) > src_offset += 8; > src_offset += extsize; > } > - munmap(mmap, mmap_size); > + if (!istate->keep_mmap) > + munmap(mmap, mmap_size); > return istate->cache_nr; > > unmap: > + istate->mmap = NULL; > munmap(mmap, mmap_size); > die("index file corrupt"); > } > @@ -1655,6 +1661,7 @@ int read_index_from(struct index_state *istate, const char *path) > discard_index(split_index->base); > else > split_index->base = xcalloc(1, sizeof(*split_index->base)); > + split_index->base->keep_mmap = istate->keep_mmap; > ret = do_read_index(split_index->base, > git_path("sharedindex.%s", > sha1_to_hex(split_index->base_sha1)), 1); > @@ -1698,6 +1705,10 @@ int discard_index(struct index_state *istate) > free(istate->cache); > istate->cache = NULL; > istate->cache_alloc = 0; > + if (istate->keep_mmap && istate->mmap) { > + munmap(istate->mmap, istate->mmap_size); > + istate->mmap = NULL; > + } > discard_split_index(istate); > free_untracked_cache(istate->untracked); > istate->untracked = NULL; -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html