git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] clear_commit_marks(): avoid deep recursion

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Oct 10, 2007, 22:14 UTC
Message-ID
<Pine.LNX.4.64.0710102313530.4174@racer.site>

Before this patch, clear_commit_marks() recursed for each parent. This could be potentially very expensive in terms of stack space. Probably the only reason that this did not lead to problems is the fact that we typically call clear_commit_marks() after marking a relatively small set of commits.

Use (sort of) a tail recursion instead: first recurse on the parents other than the first one, and then continue the loop with the first parent.

Noticed by Shawn Pearce.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 commit.c |   23 ++++++++++++++---------
 1 files changed, 14 insertions(+), 9 deletions(-)
diff --git a/commit.c b/commit.c
index 20fb220..ac24266 100644
--- a/commit.c
+++ b/commit.c
@@ -441,17 +441,22 @@ struct commit *pop_most_recent_commit(struct commit_list **list,
 
 void clear_commit_marks(struct commit *commit, unsigned int mark)
 {
-	struct commit_list *parents;
+	while (commit) {
+		struct commit_list *parents;
 
-	commit->object.flags &= ~mark;
-	parents = commit->parents;
-	while (parents) {
-		struct commit *parent = parents->item;
+		if (!(mark & commit->object.flags))
+			return;
 
-		/* Have we already cleared this? */
-		if (mark & parent->object.flags)
-			clear_commit_marks(parent, mark);
-		parents = parents->next;
+		commit->object.flags &= ~mark;
+
+		parents = commit->parents;
+		if (!parents)
+			return;
+
+		while ((parents = parents->next))
+			clear_commit_marks(parents->item, mark);
+
+		commit = commit->parents->item;
 	}
 }
 
-- 
1.5.3.4.1169.g5fb8d
Message 1 of 1 in “clear_commit_marks(): avoid deep recursion”
  1. clear_commit_marks(): avoid deep recursionJohannes Schindelin, Oct 10, 2007

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.