"Thomas Gummerer" <t.gumme...@gmail.com> schrieb im Newsbeitrag 
news:<1345111129-6925-3-git-send-email-t.gumme...@gmail.com>...
> Add the possibility of re-reading the index file, if it changed
> while reading.
> 
> The index file might change during the read, causing outdated
> information to be displayed. We check if the index file changed
> by using its stat data as heuristic.
> 
> Signed-off-by: Thomas Gummerer <t.gumme...@gmail.com>
> ---
>  read-cache.c | 87 
> +++++++++++++++++++++++++++++++++++++++++-------------------
>  1 file changed, 60 insertions(+), 27 deletions(-)
> 
> diff --git a/read-cache.c b/read-cache.c
> index 6a8b4b1..cdd8480 100644
> --- a/read-cache.c
> +++ b/read-cache.c
...
> @@ -1186,38 +1209,48 @@ int read_index_from(struct index_state *istate, const 
> char *path)
>       errno = ENOENT;
>       istate->timestamp.sec = 0;
>       istate->timestamp.nsec = 0;
> -     fd = open(path, O_RDONLY);
> -     if (fd < 0) {
> -             if (errno == ENOENT)
> -                     return 0;
> -             die_errno("index file open failed");
> -     }
> +     do {
> +             err = 0;
> +             fd = open(path, O_RDONLY);
> +             if (fd < 0) {
> +                     if (errno == ENOENT)
> +                             return 0;
> +                     die_errno("index file open failed");
> +             }
>  
> -     if (fstat(fd, &st))
> -             die_errno("cannot stat the open index");
> +             if (fstat(fd, &st_old))
> +                     die_errno("cannot stat the open index");
>  
> -     errno = EINVAL;
> -     mmap_size = xsize_t(st.st_size);
> -     mmap = xmmap(NULL, mmap_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 
> 0);
> -     close(fd);
> -     if (mmap == MAP_FAILED)
> -             die_errno("unable to map index file");
> +             errno = EINVAL;
> +             mmap_size = xsize_t(st_old.st_size);
> +             mmap = xmmap(NULL, mmap_size, PROT_READ | PROT_WRITE, 
> MAP_PRIVATE, fd, 0);
> +             close(fd);
> +             if (mmap == MAP_FAILED)
> +                     die_errno("unable to map index file");
>  
> -     hdr = mmap;
> -     if (verify_hdr_version(istate, hdr, mmap_size) < 0)
> -             goto unmap;
> +             hdr = mmap;
> +             if (verify_hdr_version(istate, hdr, mmap_size) < 0)
> +                     err = 1;
>  
> -     if (istate->ops->verify_hdr(mmap, mmap_size) < 0)
> -             goto unmap;
> +             if (istate->ops->verify_hdr(mmap, mmap_size) < 0)
> +                     err = 1;
>  
> -     istate->ops->read_index(istate, mmap, mmap_size);
> -     istate->timestamp.sec = st.st_mtime;
> -     istate->timestamp.nsec = ST_MTIME_NSEC(st);
> +             if (istate->ops->read_index(istate, mmap, mmap_size) < 0)
> +                     err = 1;
> +             istate->timestamp.sec = st_old.st_mtime;
> +             istate->timestamp.nsec = ST_MTIME_NSEC(st_old);
> +             if (lstat(path, &st_new))
> +                     die_errno("cannot stat the open index");
>  
> -     munmap(mmap, mmap_size);
> -     return istate->cache_nr;
> +             munmap(mmap, mmap_size);
> +
> +             if (!index_changed(st_old, st_new) && !err)
> +                     return istate->cache_nr;
> +
> +             usleep(10*1000);


usleep() is not available to anybody, e.g. it is not in HP NonStop (not in 
every case at least)

Bye, Jojo

--
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