v2 removes unrelated changes and the dummy_entry. strip_len is also
replaced with copy_len to reduce repeated subtraction calculation.
Diff:
diff --git a/read-cache.c b/read-cache.c
index 5c04c8f200..8628d0f3a8 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -1713,7 +1713,7 @@ int read_index(struct index_state *istate)
return read_index_from(istate, get_index_file(), get_git_dir());
}
-static struct cache_entry *create_from_disk(struct mem_pool *mem_pool,
+static struct cache_entry *create_from_disk(struct index_state *istate,
struct ondisk_cache_entry *ondisk,
unsigned long *ent_size,
const struct cache_entry
*previous_ce)
@@ -1722,7 +1722,15 @@ static struct cache_entry *create_from_disk(struct
mem_pool *mem_pool,
size_t len;
const char *name;
unsigned int flags;
- size_t strip_len;
+ size_t copy_len;
+ /*
+ * Adjacent cache entries tend to share the leading paths, so it makes
+ * sense to only store the differences in later entries. In the v4
+ * on-disk format of the index, each on-disk cache entry stores the
+ * number of bytes to be stripped from the end of the previous name,
+ * and the bytes to append to the result, to come up with its name.
+ */
+ int expand_name_field = istate->version == 4;
/* On-disk flags are just 16 bits */
flags = get_be16(&ondisk->flags);
@@ -1735,37 +1743,37 @@ static struct cache_entry *create_from_disk(struct
mem_pool *mem_pool,
extended_flags = get_be16(&ondisk2->flags2) << 16;
/* We do not yet understand any bit out of CE_EXTENDED_FLAGS */
if (extended_flags & ~CE_EXTENDED_FLAGS)
- die(_("unknown index entry format %08x"),
extended_flags);
+ die("Unknown index entry format %08x", extended_flags);
flags |= extended_flags;
name = ondisk2->name;
}
else
name = ondisk->name;
- /*
- * Adjacent cache entries tend to share the leading paths, so it makes
- * sense to only store the differences in later entries. In the v4
- * on-disk format of the index, each on-disk cache entry stores the
- * number of bytes to be stripped from the end of the previous name,
- * and the bytes to append to the result, to come up with its name.
- */
- if (previous_ce) {
+ if (expand_name_field) {
const unsigned char *cp = (const unsigned char *)name;
+ size_t strip_len, previous_len;
+ previous_len = previous_ce ? previous_ce->ce_namelen : 0;
strip_len = decode_varint(&cp);
- if (previous_ce->ce_namelen < strip_len)
- die(_("malformed name field in the index, path '%s'"),
- previous_ce->name);
+ if (previous_len < strip_len) {
+ if (previous_ce)
+ die(_("malformed name field in the index, near
path '%s'"),
+ previous_ce->name);
+ else
+ die(_("malformed name field in the index in the
first path"));
+ }
+ copy_len = previous_len - strip_len;
name = (const char *)cp;
}
if (len == CE_NAMEMASK) {
len = strlen(name);
- if (previous_ce)
- len += previous_ce->ce_namelen - strip_len;
+ if (expand_name_field)
+ len += copy_len;
}
- ce = mem_pool__ce_alloc(mem_pool, len);
+ ce = mem_pool__ce_alloc(istate->ce_mem_pool, len);
ce->ce_stat_data.sd_ctime.sec = get_be32(&ondisk->ctime.sec);
ce->ce_stat_data.sd_mtime.sec = get_be32(&ondisk->mtime.sec);
@@ -1782,9 +1790,9 @@ static struct cache_entry *create_from_disk(struct
mem_pool *mem_pool,
ce->index = 0;
hashcpy(ce->oid.hash, ondisk->sha1);
- if (previous_ce) {
- size_t copy_len = previous_ce->ce_namelen - strip_len;
- memcpy(ce->name, previous_ce->name, copy_len);
+ if (expand_name_field) {
+ if (copy_len)
+ memcpy(ce->name, previous_ce->name, copy_len);
memcpy(ce->name + copy_len, name, len + 1 - copy_len);
*ent_size = (name - ((char *)ondisk)) + len + 1 - copy_len;
} else {
@@ -1885,7 +1893,6 @@ int do_read_index(struct index_state *istate, const char
*path, int must_exist)
void *mmap;
size_t mmap_size;
const struct cache_entry *previous_ce = NULL;
- struct cache_entry *dummy_entry = NULL;
if (istate->initialized)
return istate->cache_nr;
@@ -1923,7 +1930,6 @@ int do_read_index(struct index_state *istate, const char
*path, int must_exist)
istate->initialized = 1;
if (istate->version == 4) {
- previous_ce = dummy_entry = make_empty_transient_cache_entry(0);
mem_pool_init(&istate->ce_mem_pool,
estimate_cache_size_from_compressed(istate->cache_nr));
} else {
@@ -1938,14 +1944,12 @@ int do_read_index(struct index_state *istate, const
char *path, int must_exist)
unsigned long consumed;
disk_ce = (struct ondisk_cache_entry *)((char *)mmap +
src_offset);
- ce = create_from_disk(istate->ce_mem_pool, disk_ce, &consumed,
previous_ce);
+ ce = create_from_disk(istate, disk_ce, &consumed, previous_ce);
set_index_entry(istate, i, ce);
src_offset += consumed;
- if (previous_ce)
- previous_ce = ce;
+ previous_ce = ce;
}
- free(dummy_entry);
istate->timestamp.sec = st.st_mtime;
istate->timestamp.nsec = ST_MTIME_NSEC(st);
Nguyễn Thái Ngọc Duy (1):
read-cache.c: optimize reading index format v4
read-cache.c | 128 ++++++++++++++++++++++++---------------------------
1 file changed, 60 insertions(+), 68 deletions(-)
--
2.19.0.rc0.337.ge906d732e7