"Thomas Gummerer" <t.gummerer@xxxxxxxxx> schrieb im Newsbeitrag news:<1345111129-6925-3-git-send-email-t.gummerer@xxxxxxxxx>... > 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@xxxxxxxxx> > --- > 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html