Ref-count the filespecs used by diffcore
Rather than copy the filespecs when introducing new versions of them (for rename or copy detection), use a refcount and increment the count when reusing the diff_filespec. This avoids unnecessary allocations, but the real reason behind this is a future enhancement: we will want to track shared data across the copy/rename detection. In order to efficiently notice when a filespec is used by a rename, the rename machinery wants to keep track of a rename usage count which is shared across all different users of the filespec. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
cb1491b6bf
commit
9fb88419ba
15
diff.c
15
diff.c
@ -1440,9 +1440,18 @@ struct diff_filespec *alloc_filespec(const char *path)
|
||||
memset(spec, 0, sizeof(*spec));
|
||||
spec->path = (char *)(spec + 1);
|
||||
memcpy(spec->path, path, namelen+1);
|
||||
spec->count = 1;
|
||||
return spec;
|
||||
}
|
||||
|
||||
void free_filespec(struct diff_filespec *spec)
|
||||
{
|
||||
if (!--spec->count) {
|
||||
diff_free_filespec_data(spec);
|
||||
free(spec);
|
||||
}
|
||||
}
|
||||
|
||||
void fill_filespec(struct diff_filespec *spec, const unsigned char *sha1,
|
||||
unsigned short mode)
|
||||
{
|
||||
@ -2435,10 +2444,8 @@ struct diff_filepair *diff_queue(struct diff_queue_struct *queue,
|
||||
|
||||
void diff_free_filepair(struct diff_filepair *p)
|
||||
{
|
||||
diff_free_filespec_data(p->one);
|
||||
diff_free_filespec_data(p->two);
|
||||
free(p->one);
|
||||
free(p->two);
|
||||
free_filespec(p->one);
|
||||
free_filespec(p->two);
|
||||
free(p);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user