]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Revert "name-rev: release unused name strings"
authorRené Scharfe <l.s.r@web.de>
Fri, 22 Apr 2022 18:44:40 +0000 (20:44 +0200)
committerJunio C Hamano <gitster@pobox.com>
Sat, 23 Apr 2022 16:46:40 +0000 (09:46 -0700)
This reverts commit 2d53975488df195e1431c3f90bfb5b60018d5bf6.

3656f84278 (name-rev: prefer shorter names over following merges,
2021-12-04) broke the assumption of 2d53975488 (name-rev: release unused
name strings, 2020-02-04) that a better name for a child is a better
name for all of its ancestors as well, because it added a penalty for
generation > 0.  This leads to strings being free(3)'d that are still
needed.

079f970971 (name-rev: sort tip names before applying, 2020-02-05)
already reduced the number of free(3) calls for the use case that
motivated the original patch (name-rev --all in the Chromium repository)
from ca. 44000 to 5, and 3656f84278 eliminated even those few.  So this
revert won't affect name-rev's performance on that particular repo.

Reported-by: Thomas Hurst <tom@hur.st>
Helped-by: Elijah Newren <newren@gmail.com>
Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/name-rev.c

index 27f60153a6c732c9a47ed47eb79f4e736f714841..228eab439829589c5dbe64b9b6264f6d3f09f90d 100644 (file)
@@ -17,7 +17,7 @@
 #define CUTOFF_DATE_SLOP 86400
 
 struct rev_name {
-       char *tip_name;
+       const char *tip_name;
        timestamp_t taggerdate;
        int generation;
        int distance;
@@ -34,7 +34,7 @@ static struct commit_rev_name rev_names;
 
 static int is_valid_rev_name(const struct rev_name *name)
 {
-       return name && (name->generation || name->tip_name);
+       return name && name->tip_name;
 }
 
 static struct rev_name *get_commit_rev_name(const struct commit *commit)
@@ -96,20 +96,9 @@ static struct rev_name *create_or_update_name(struct commit *commit,
 {
        struct rev_name *name = commit_rev_name_at(&rev_names, commit);
 
-       if (is_valid_rev_name(name)) {
-               if (!is_better_name(name, taggerdate, generation, distance, from_tag))
-                       return NULL;
-
-               /*
-                * This string might still be shared with ancestors
-                * (generation > 0).  We can release it here regardless,
-                * because the new name that has just won will be better
-                * for them as well, so name_rev() will replace these
-                * stale pointers when it processes the parents.
-                */
-               if (!name->generation)
-                       free(name->tip_name);
-       }
+       if (is_valid_rev_name(name) &&
+           !is_better_name(name, taggerdate, generation, distance, from_tag))
+               return NULL;
 
        name->taggerdate = taggerdate;
        name->generation = generation;