]> git.ipfire.org Git - thirdparty/git.git/commitdiff
use commit_stack instead of prio_queue in LIFO mode
authorRené Scharfe <l.s.r@web.de>
Tue, 17 Mar 2026 21:40:07 +0000 (22:40 +0100)
committerJunio C Hamano <gitster@pobox.com>
Wed, 18 Mar 2026 17:39:56 +0000 (10:39 -0700)
A prio_queue with a NULL compare function acts as a stack -- the last
element in is the first one out (LIFO).  Use an actual commit_stack
instead where possible, as it documents the behavior better, provides
type safety and saves some memory because prio_queue stores an
additional tie-breaking counter per element.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/name-rev.c
negotiator/default.c
negotiator/skipping.c

index 6188cf98ce0157efe14ae3c5d8533bca82454f15..d6594ada53f49d33ca370ecbb49cdf090bcccdf5 100644 (file)
@@ -12,7 +12,6 @@
 #include "object-name.h"
 #include "pager.h"
 #include "parse-options.h"
-#include "prio-queue.h"
 #include "hash-lookup.h"
 #include "commit-slab.h"
 #include "commit-graph.h"
@@ -178,7 +177,7 @@ static void name_rev(struct commit *start_commit,
                const char *tip_name, timestamp_t taggerdate,
                int from_tag, int deref, struct mem_pool *string_pool)
 {
-       struct prio_queue queue;
+       struct commit_stack stack = COMMIT_STACK_INIT;
        struct commit *commit;
        struct commit_stack parents_to_queue = COMMIT_STACK_INIT;
        struct rev_name *start_name;
@@ -197,10 +196,9 @@ static void name_rev(struct commit *start_commit,
        else
                start_name->tip_name = mem_pool_strdup(string_pool, tip_name);
 
-       memset(&queue, 0, sizeof(queue)); /* Use the prio_queue as LIFO */
-       prio_queue_put(&queue, start_commit);
+       commit_stack_push(&stack, start_commit);
 
-       while ((commit = prio_queue_get(&queue))) {
+       while ((commit = commit_stack_pop(&stack))) {
                struct rev_name *name = get_commit_rev_name(commit);
                struct commit_list *parents;
                int parent_number = 1;
@@ -241,13 +239,13 @@ static void name_rev(struct commit *start_commit,
                        }
                }
 
-               /* The first parent must come out first from the prio_queue */
+               /* The first parent must come out first from the stack */
                while (parents_to_queue.nr)
-                       prio_queue_put(&queue,
-                                      commit_stack_pop(&parents_to_queue));
+                       commit_stack_push(&stack,
+                                         commit_stack_pop(&parents_to_queue));
        }
 
-       clear_prio_queue(&queue);
+       commit_stack_clear(&stack);
        commit_stack_clear(&parents_to_queue);
 }
 
index 116dedcf83035db968103a73753000ed165fe87c..3cac0476a7bc2e06b16607969f004ee5a71e71b6 100644 (file)
@@ -57,19 +57,19 @@ static int clear_marks(const struct reference *ref, void *cb_data UNUSED)
 static void mark_common(struct negotiation_state *ns, struct commit *commit,
                int ancestors_only, int dont_parse)
 {
-       struct prio_queue queue = { NULL };
+       struct commit_stack stack = COMMIT_STACK_INIT;
 
        if (!commit || (commit->object.flags & COMMON))
                return;
 
-       prio_queue_put(&queue, commit);
+       commit_stack_push(&stack, commit);
        if (!ancestors_only) {
                commit->object.flags |= COMMON;
 
                if ((commit->object.flags & SEEN) && !(commit->object.flags & POPPED))
                        ns->non_common_revs--;
        }
-       while ((commit = prio_queue_get(&queue))) {
+       while ((commit = commit_stack_pop(&stack))) {
                struct object *o = (struct object *)commit;
 
                if (!(o->flags & SEEN))
@@ -94,12 +94,12 @@ static void mark_common(struct negotiation_state *ns, struct commit *commit,
                                if ((p->object.flags & SEEN) && !(p->object.flags & POPPED))
                                        ns->non_common_revs--;
 
-                               prio_queue_put(&queue, parents->item);
+                               commit_stack_push(&stack, parents->item);
                        }
                }
        }
 
-       clear_prio_queue(&queue);
+       commit_stack_clear(&stack);
 }
 
 /*
index 0a272130fb1b6d2007b24a01ac003a438cf43c2a..fe4126ca4d2aaaf106eda1d87076a741fc3cac65 100644 (file)
@@ -91,15 +91,15 @@ static int clear_marks(const struct reference *ref, void *cb_data UNUSED)
  */
 static void mark_common(struct data *data, struct commit *seen_commit)
 {
-       struct prio_queue queue = { NULL };
+       struct commit_stack stack = COMMIT_STACK_INIT;
        struct commit *c;
 
        if (seen_commit->object.flags & COMMON)
                return;
 
-       prio_queue_put(&queue, seen_commit);
+       commit_stack_push(&stack, seen_commit);
        seen_commit->object.flags |= COMMON;
-       while ((c = prio_queue_get(&queue))) {
+       while ((c = commit_stack_pop(&stack))) {
                struct commit_list *p;
 
                if (!(c->object.flags & POPPED))
@@ -113,11 +113,11 @@ static void mark_common(struct data *data, struct commit *seen_commit)
                                continue;
 
                        p->item->object.flags |= COMMON;
-                       prio_queue_put(&queue, p->item);
+                       commit_stack_push(&stack, p->item);
                }
        }
 
-       clear_prio_queue(&queue);
+       commit_stack_clear(&stack);
 }
 
 /*