git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Some more memory leak avoidance
@ 2006-06-18  1:47 Linus Torvalds
  0 siblings, 0 replies; only message in thread
From: Linus Torvalds @ 2006-06-18  1:47 UTC (permalink / raw)
  To: Junio C Hamano, Git Mailing List


This is really the dregs of my effort to not waste memory in git-rev-list, 
and makes barely one percent of a difference in the memory footprint, but 
hey, it's also a pretty small patch.

It discards the parent lists and the commit buffer after the commit has 
been shown by git-rev-list (and "git log" - which already did the commit 
buffer part), and frees the commit list entry that was used by the 
revision walker.

The big win would be to get rid of the "refs" pointer in the object 
structure (another 5%), because it's only used by fsck. That would require 
some pretty major surgery to fsck, though, so I'm timid and did the less 
interesting but much easier part instead.

This (percentually) makes a bigger difference to "git log" and friends, 
since those are walking _just_ commits, and thus the list entries tend to 
be a bigger percentage of the memory use. But the "list all objects" case 
does improve too.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
---

This one should be independent of the other memory use optimizations.

 builtin-log.c      |    2 ++
 builtin-rev-list.c |    8 ++++++++
 revision.c         |    6 ++++--
 3 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/builtin-log.c b/builtin-log.c
index 29a8851..f6da1c3 100644
--- a/builtin-log.c
+++ b/builtin-log.c
@@ -40,6 +40,8 @@ static int cmd_log_wc(int argc, const ch
 		log_tree_commit(rev, commit);
 		free(commit->buffer);
 		commit->buffer = NULL;
+		free_commit_list(commit->parents);
+		commit->parents = NULL;
 	}
 	return 0;
 }
diff --git a/builtin-rev-list.c b/builtin-rev-list.c
index 2b298c4..71353eb 100644
--- a/builtin-rev-list.c
+++ b/builtin-rev-list.c
@@ -89,6 +89,14 @@ static void show_commit(struct commit *c
 		printf("%s%c", pretty_header, hdr_termination);
 	}
 	fflush(stdout);
+	if (commit->parents) {
+		free_commit_list(commit->parents);
+		commit->parents = NULL;
+	}
+	if (commit->buffer) {
+		free(commit->buffer);
+		commit->buffer = NULL;
+	}
 }
 
 static struct object_list **process_blob(struct blob *blob,
diff --git a/revision.c b/revision.c
index f4b8826..475d604 100644
--- a/revision.c
+++ b/revision.c
@@ -944,9 +944,11 @@ struct commit *get_revision(struct rev_i
 	}
 
 	do {
-		struct commit *commit = revs->commits->item;
+		struct commit_list *entry = revs->commits;
+		struct commit *commit = entry->item;
 
-		revs->commits = revs->commits->next;
+		revs->commits = entry->next;
+		free(entry);
 
 		/*
 		 * If we haven't done the list limiting, we need to look at

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2006-06-18  1:48 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-06-18  1:47 Some more memory leak avoidance Linus Torvalds

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).