Replace unpack_entry_gently with unpack_entry.
The unpack_entry_gently function currently has only two callers: the delta base resolution in sha1_file.c and the main loop of pack-check.c. Both of these must change to using unpack_entry directly when we implement sliding window mmap logic, so I'm doing it earlier to help break down the change set. This may cause a slight performance decrease for delta base resolution as well as for pack-check.c's verify_packfile(), as the pack use counter will be incremented and decremented for every object that is unpacked. Signed-off-by: Shawn O. Pearce <spearce@spearce.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
1ed4813f7d
commit
4d703a1a90
2
cache.h
2
cache.h
@ -394,7 +394,7 @@ extern struct packed_git *add_packed_git(char *, int, int);
|
|||||||
extern int num_packed_objects(const struct packed_git *p);
|
extern int num_packed_objects(const struct packed_git *p);
|
||||||
extern int nth_packed_object_sha1(const struct packed_git *, int, unsigned char*);
|
extern int nth_packed_object_sha1(const struct packed_git *, int, unsigned char*);
|
||||||
extern unsigned long find_pack_entry_one(const unsigned char *, struct packed_git *);
|
extern unsigned long find_pack_entry_one(const unsigned char *, struct packed_git *);
|
||||||
extern void *unpack_entry_gently(struct packed_git *, unsigned long, char *, unsigned long *);
|
extern void *unpack_entry(struct packed_git *, unsigned long, char *, unsigned long *);
|
||||||
extern unsigned long unpack_object_header_gently(const unsigned char *buf, unsigned long len, enum object_type *type, unsigned long *sizep);
|
extern unsigned long unpack_object_header_gently(const unsigned char *buf, unsigned long len, enum object_type *type, unsigned long *sizep);
|
||||||
extern void packed_object_info_detail(struct packed_git *, unsigned long, char *, unsigned long *, unsigned long *, unsigned int *, unsigned char *);
|
extern void packed_object_info_detail(struct packed_git *, unsigned long, char *, unsigned long *, unsigned long *, unsigned int *, unsigned char *);
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ static int verify_packfile(struct packed_git *p)
|
|||||||
offset = find_pack_entry_one(sha1, p);
|
offset = find_pack_entry_one(sha1, p);
|
||||||
if (!offset)
|
if (!offset)
|
||||||
die("internal error pack-check find-pack-entry-one");
|
die("internal error pack-check find-pack-entry-one");
|
||||||
data = unpack_entry_gently(p, offset, type, &size);
|
data = unpack_entry(p, offset, type, &size);
|
||||||
if (!data) {
|
if (!data) {
|
||||||
err = error("cannot unpack %s from %s",
|
err = error("cannot unpack %s from %s",
|
||||||
sha1_to_hex(sha1), p->pack_name);
|
sha1_to_hex(sha1), p->pack_name);
|
||||||
|
35
sha1_file.c
35
sha1_file.c
@ -1110,7 +1110,7 @@ static void *unpack_delta_entry(struct packed_git *p,
|
|||||||
unsigned long result_size, base_size, base_offset;
|
unsigned long result_size, base_size, base_offset;
|
||||||
|
|
||||||
offset = get_delta_base(p, offset, kind, obj_offset, &base_offset);
|
offset = get_delta_base(p, offset, kind, obj_offset, &base_offset);
|
||||||
base = unpack_entry_gently(p, base_offset, type, &base_size);
|
base = unpack_entry(p, base_offset, type, &base_size);
|
||||||
if (!base)
|
if (!base)
|
||||||
die("failed to read delta base object at %lu from %s",
|
die("failed to read delta base object at %lu from %s",
|
||||||
base_offset, p->pack_name);
|
base_offset, p->pack_name);
|
||||||
@ -1127,43 +1127,34 @@ static void *unpack_delta_entry(struct packed_git *p,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *unpack_entry(struct pack_entry *entry,
|
void *unpack_entry(struct packed_git *p, unsigned long offset,
|
||||||
char *type, unsigned long *sizep)
|
|
||||||
{
|
|
||||||
struct packed_git *p = entry->p;
|
|
||||||
void *retval;
|
|
||||||
|
|
||||||
if (use_packed_git(p))
|
|
||||||
die("cannot map packed file");
|
|
||||||
retval = unpack_entry_gently(p, entry->offset, type, sizep);
|
|
||||||
unuse_packed_git(p);
|
|
||||||
if (!retval)
|
|
||||||
die("corrupted pack file %s", p->pack_name);
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The caller is responsible for use_packed_git()/unuse_packed_git() pair */
|
|
||||||
void *unpack_entry_gently(struct packed_git *p, unsigned long offset,
|
|
||||||
char *type, unsigned long *sizep)
|
char *type, unsigned long *sizep)
|
||||||
{
|
{
|
||||||
unsigned long size, obj_offset = offset;
|
unsigned long size, obj_offset = offset;
|
||||||
enum object_type kind;
|
enum object_type kind;
|
||||||
|
void *retval;
|
||||||
|
|
||||||
|
if (use_packed_git(p))
|
||||||
|
die("cannot map packed file");
|
||||||
offset = unpack_object_header(p, offset, &kind, &size);
|
offset = unpack_object_header(p, offset, &kind, &size);
|
||||||
switch (kind) {
|
switch (kind) {
|
||||||
case OBJ_OFS_DELTA:
|
case OBJ_OFS_DELTA:
|
||||||
case OBJ_REF_DELTA:
|
case OBJ_REF_DELTA:
|
||||||
return unpack_delta_entry(p, offset, size, kind, obj_offset, type, sizep);
|
retval = unpack_delta_entry(p, offset, size, kind, obj_offset, type, sizep);
|
||||||
|
break;
|
||||||
case OBJ_COMMIT:
|
case OBJ_COMMIT:
|
||||||
case OBJ_TREE:
|
case OBJ_TREE:
|
||||||
case OBJ_BLOB:
|
case OBJ_BLOB:
|
||||||
case OBJ_TAG:
|
case OBJ_TAG:
|
||||||
strcpy(type, type_names[kind]);
|
strcpy(type, type_names[kind]);
|
||||||
*sizep = size;
|
*sizep = size;
|
||||||
return unpack_compressed_entry(p, offset, size);
|
retval = unpack_compressed_entry(p, offset, size);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return NULL;
|
die("unknown object type %i in %s", kind, p->pack_name);
|
||||||
}
|
}
|
||||||
|
unuse_packed_git(p);
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
int num_packed_objects(const struct packed_git *p)
|
int num_packed_objects(const struct packed_git *p)
|
||||||
@ -1312,7 +1303,7 @@ static void *read_packed_sha1(const unsigned char *sha1, char *type, unsigned lo
|
|||||||
error("cannot read sha1_file for %s", sha1_to_hex(sha1));
|
error("cannot read sha1_file for %s", sha1_to_hex(sha1));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return unpack_entry(&e, type, size);
|
return unpack_entry(e.p, e.offset, type, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void * read_sha1_file(const unsigned char *sha1, char *type, unsigned long *size)
|
void * read_sha1_file(const unsigned char *sha1, char *type, unsigned long *size)
|
||||||
|
Loading…
Reference in New Issue
Block a user