David Turner <[email protected]> writes:
> From: Nguyễn Thái Ngọc Duy <[email protected]>
>
> Signed-off-by: Nguyễn Thái Ngọc Duy <[email protected]>
> ---
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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html