Subject: Re: [PATCH 03/19] read-cache: allow to keep mmap'd memory after reading

From: Junio C Hamano <[email-masked]>
Date: Wed, 09 Mar 2016 15:02:01 -0800

David Turner <[email-masked]> writes:

> From: Nguyễn Thái Ngọc Duy <[email-masked]>
>
> Signed-off-by: Nguyễn Thái Ngọc Duy <[email-masked]>
> ---

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;