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

[PATCH v3 13/19] dir.c: provide clear_directory() for reclaiming dir_struct memory

From
Adam Spiers <git@adamspiers.org>
Date
Dec 27, 2012, 02:32 UTC
Message-ID
<1356575558-2674-14-git-send-email-git@adamspiers.org>
In-Reply-To
<1356575558-2674-1-git-send-email-git@adamspiers.org>

By the end of a directory traversal, a dir_struct instance will typically contains pointers to various data structures on the heap. clear_directory() provides a convenient way to reclaim that memory.

Signed-off-by: Adam Spiers <git@adamspiers.org>
---
 Documentation/technical/api-directory-listing.txt |  2 ++
 dir.c                                             | 30 +++++++++++++++++++++++
 dir.h                                             |  1 +
 3 files changed, 33 insertions(+)
diff --git a/Documentation/technical/api-directory-listing.txt b/Documentation/technical/api-directory-listing.txt
index fa9c8ae..fbceb62 100644
--- a/Documentation/technical/api-directory-listing.txt
+++ b/Documentation/technical/api-directory-listing.txt
@@ -81,4 +81,6 @@ marked. If you to exclude files, make sure you have loaded index first.
 
 * Use `dir.entries[]`.
 
+* Call `free_directory()` when none of the contained elements are no longer in use.
+
 (JC)
diff --git a/dir.c b/dir.c
index aefe2bb..0d1b7e9 100644
--- a/dir.c
+++ b/dir.c
@@ -1555,3 +1555,33 @@ void free_pathspec(struct pathspec *pathspec)
 	free(pathspec->items);
 	pathspec->items = NULL;
 }
+
+/*
+ * Frees memory within dir which was allocated for exclude lists and
+ * the exclude_stack.  Does not free dir itself.
+ */
+void clear_directory(struct dir_struct *dir)
+{
+	int i, j;
+	struct exclude_list_group *group;
+	struct exclude_list *el;
+	struct exclude_stack *stk;
+
+	for (i = EXC_CMDL; i <= EXC_FILE; i++) {
+		group = &dir->exclude_list_groups[i];
+		for (j = 0; j < group->nr; j++) {
+			el = &group->ary[j];
+			if (i == EXC_DIRS)
+				free((char *)el->src);
+			clear_exclude_list(el);
+		}
+		free(group->ary);
+	}
+
+	stk = dir->exclude_stack;
+	while (stk) {
+		struct exclude_stack *prev = stk->prev;
+		free(stk);
+		stk = prev;
+	}
+}
diff --git a/dir.h b/dir.h
index f91770a..286de4e 100644
--- a/dir.h
+++ b/dir.h
@@ -169,6 +169,7 @@ extern void parse_exclude_pattern(const char **string, int *patternlen, int *fla
 extern void add_exclude(const char *string, const char *base,
 			int baselen, struct exclude_list *el, int srcpos);
 extern void clear_exclude_list(struct exclude_list *el);
+extern void clear_directory(struct dir_struct *dir);
 extern int file_exists(const char *);
 
 extern int is_inside_dir(const char *dir);
-- 
1.7.11.2.249.g31c7954
Previous: Adam SpiersNext: Adam Spiers
Message 29 of 55 in “new git check-ignore sub-command”
  1. 00/19 new git check-ignore sub-commandAdam Spiers, Dec 27, 2012
  2. 01/19 api-directory-listing.txt: update to match codeAdam Spiers, Dec 27, 2012
  3. 02/19 Improve documentation and comments regarding directory traversal APIAdam Spiers, Dec 27, 2012
  4. Junio C HamanoJan 1, 2013
  5. Adam SpiersJan 2, 2013
  6. Adam SpiersJan 6, 2013
  7. 03/19 dir.c: rename cryptic 'which' variable to more consistent nameAdam Spiers, Dec 27, 2012
  8. 04/19 dir.c: rename path_excluded() to is_path_excluded()Adam Spiers, Dec 27, 2012
  9. 05/19 dir.c: rename excluded_from_list() to is_excluded_from_list()Adam Spiers, Dec 27, 2012
  10. 06/19 dir.c: rename excluded() to is_excluded()Adam Spiers, Dec 27, 2012
  11. 07/19 dir.c: refactor is_excluded_from_list()Adam Spiers, Dec 27, 2012
  12. 08/19 dir.c: refactor is_excluded()Adam Spiers, Dec 27, 2012
  13. 09/19 dir.c: refactor is_path_excluded()Adam Spiers, Dec 27, 2012
  14. 10/19 dir.c: rename free_excludes() to clear_exclude_list()Adam Spiers, Dec 27, 2012
  15. 11/19 dir.c: use a single struct exclude_list per source of excludesAdam Spiers, Dec 27, 2012
  16. Junio C HamanoJan 4, 2013
  17. Junio C HamanoJan 5, 2013
  18. Adam SpiersJan 6, 2013
  19. api-allocation-growing.txt: encourage better variable namingAdam Spiers, Jan 6, 2013
  20. Junio C HamanoJan 6, 2013
  21. Adam SpiersJan 6, 2013
  22. Junio C HamanoJan 6, 2013
  23. Adam SpiersJan 6, 2013
  24. Junio C HamanoJan 6, 2013
  25. Adam SpiersJan 6, 2013
  26. Adam SpiersJan 6, 2013
  27. Junio C HamanoJan 6, 2013
  28. 12/19 dir.c: keep track of where patterns came fromAdam Spiers, Dec 27, 2012
  29. 13/19 dir.c: provide clear_directory() for reclaiming dir_struct memoryAdam Spiers, Dec 27, 2012
  30. 14/19 add.c: refactor treat_gitlinks()Adam Spiers, Dec 27, 2012
  31. 15/19 add.c: remove unused argument from validate_pathspec()Adam Spiers, Dec 27, 2012
  32. 16/19 pathspec.c: move reusable code from builtin/add.cAdam Spiers, Dec 27, 2012
  33. Junio C HamanoDec 28, 2012
  34. Adam SpiersDec 28, 2012
  35. Adam SpiersDec 29, 2012
  36. Junio C HamanoDec 28, 2012
  37. Adam SpiersDec 28, 2012
  38. 17/19 pathspec.c: extract new validate_path() for reuseAdam Spiers, Dec 27, 2012
  39. Junio C HamanoDec 28, 2012
  40. Adam SpiersDec 28, 2012
  41. 18/19 setup.c: document get_pathspec()Adam Spiers, Dec 27, 2012
  42. Junio C HamanoDec 28, 2012
  43. Adam SpiersDec 28, 2012
  44. Adam SpiersDec 29, 2012
  45. Junio C HamanoDec 29, 2012
  46. 19/19 Add git-check-ignore sub-commandAdam Spiers, Dec 27, 2012
  47. Junio C HamanoDec 28, 2012
  48. Adam SpiersDec 29, 2012
  49. Adam SpiersDec 29, 2012
  50. Michael LealDec 27, 2012
  51. Junio C HamanoDec 28, 2012
  52. Adam SpiersDec 28, 2012
  53. Antoine PelisseDec 28, 2012
  54. Junio C HamanoDec 28, 2012
  55. Junio C HamanoDec 28, 2012

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.