Re: [PATCH 03/19] read-cache: allow to keep mmap'd memory after reading
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Mar 9, 2016, 23:02 UTC
- Message-ID
- <xmqqziu7fe6u.fsf@gitster.mtv.corp.google.com>
- In-Reply-To
- <1457548582-28302-4-git-send-email-dturner@twopensource.com>
David Turner <dturner@twopensource.com> writes:
> From: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> > > Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> > ---
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.
Show 67 quoted lines
> 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;