David Turner <dtur...@twopensource.com> writes:

> From: Nguyễn Thái Ngọc Duy <pclo...@gmail.com>
>
> Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@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.

> 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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to