"Thomas Gummerer" <t.gummerer@gmail.com> schrieb im Newsbeitrag news:<1345111129-6925-3-git-send-email-t.gummerer@gmail.com>...
Show 16 quoted lines
> 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.gummerer@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
Show 67 quoted lines
> @@ -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