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

[PATCH v7 04/16] Add argv_array_detach and argv_array_free_detached

From
Florian Achleitner <florian.achleitner.2.6.31@gmail.com>
Date
Aug 28, 2012, 08:49 UTC
Message-ID
<1346143790-23491-5-git-send-email-florian.achleitner.2.6.31@gmail.com>
In-Reply-To
<1346143790-23491-4-git-send-email-florian.achleitner.2.6.31@gmail.com>

Allow detaching of ownership of the argv_array's contents and add a function to free those detached argv_arrays later.

This makes it possible to use argv_array efficiently with the exiting struct child_process which only contains a member char **argv.

Add to documentation.
Signed-off-by: Florian Achleitner <florian.achleitner.2.6.31@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 Documentation/technical/api-argv-array.txt |    8 ++++++++
 argv-array.c                               |   20 ++++++++++++++++++++
 argv-array.h                               |    2 ++
 3 files changed, 30 insertions(+)
diff --git a/Documentation/technical/api-argv-array.txt b/Documentation/technical/api-argv-array.txt
index 1b7d8f1..6b97d6d 100644
--- a/Documentation/technical/api-argv-array.txt
+++ b/Documentation/technical/api-argv-array.txt
@@ -49,3 +49,11 @@ Functions
 `argv_array_clear`::
 	Free all memory associated with the array and return it to the
 	initial, empty state.
+
+`argv_array_detach`::
+	Detach the argv array from the `struct argv_array`, transfering
+	ownership of the allocated array and strings.
+
+`argv_array_free_detached`::
+	Free the memory allocated by a `struct argv_array` that was later
+	detached and is now no longer needed.
diff --git a/argv-array.c b/argv-array.c
index 0b5f889..aab50d6 100644
--- a/argv-array.c
+++ b/argv-array.c
@@ -59,3 +59,23 @@ void argv_array_clear(struct argv_array *array)
 	}
 	argv_array_init(array);
 }
+
+const char **argv_array_detach(struct argv_array *array, int *argc)
+{
+	const char **argv =
+		array->argv == empty_argv || array->argc == 0 ? NULL : array->argv;
+	if (argc)
+		*argc = array->argc;
+	argv_array_init(array);
+	return argv;
+}
+
+void argv_array_free_detached(const char **argv)
+{
+	if (argv) {
+		int i;
+		for (i = 0; argv[i]; i++)
+			free((char **)argv[i]);
+		free(argv);
+	}
+}
diff --git a/argv-array.h b/argv-array.h
index b93a69c..b3ef351 100644
--- a/argv-array.h
+++ b/argv-array.h
@@ -17,5 +17,7 @@ __attribute__((format (printf,2,3)))
 void argv_array_pushf(struct argv_array *, const char *fmt, ...);
 void argv_array_pushl(struct argv_array *, ...);
 void argv_array_clear(struct argv_array *);
+const char **argv_array_detach(struct argv_array *array, int *argc);
+void argv_array_free_detached(const char **argv);
 
 #endif /* ARGV_ARRAY_H */
-- 
1.7.9.5
Previous: Florian AchleitnerNext: Florian Achleitner
Message 5 of 26 in “GSOC remote-svn”
  1. 00/16 GSOC remote-svnFlorian Achleitner, Aug 28, 2012
  2. 01/16 Implement a remote helper for svn in CFlorian Achleitner, Aug 28, 2012
  3. 02/16 Add git-remote-testsvn to MakefileFlorian Achleitner, Aug 28, 2012
  4. 03/16 Add svndump_init_fd to allow reading dumps from arbitrary FDsFlorian Achleitner, Aug 28, 2012
  5. 04/16 Add argv_array_detach and argv_array_free_detachedFlorian Achleitner, Aug 28, 2012
  6. 05/16 Connect fast-import to the remote-helper via pipe, adding 'bidi-import' capabilityFlorian Achleitner, Aug 28, 2012
  7. 06/16 Add documentation for the 'bidi-import' capability of remote-helpersFlorian Achleitner, Aug 28, 2012
  8. 07/16 When debug==1, start fast-import with "--stats" instead of "--quiet"Florian Achleitner, Aug 28, 2012
  9. 08/16 remote-svn, vcs-svn: Enable fetching to private refsFlorian Achleitner, Aug 28, 2012
  10. 09/16 Allow reading svn dumps from files via file:// urlsFlorian Achleitner, Aug 28, 2012
  11. 10/16 vcs-svn: add fast_export_note to create notesFlorian Achleitner, Aug 28, 2012
  12. 11/16 Create a note for every imported commit containing svn metadataFlorian Achleitner, Aug 28, 2012
  13. 12/16 remote-svn: Activate import/export-marks for fast-importFlorian Achleitner, Aug 28, 2012
  14. 13/16 remote-svn: add incremental importFlorian Achleitner, Aug 28, 2012
  15. 14/16 Add a svnrdump-simulator replaying a dump file for testingFlorian Achleitner, Aug 28, 2012
  16. 15/16 remote-svn: add marks-file regenerationFlorian Achleitner, Aug 28, 2012
  17. 16/16 Add a test script for remote-svnFlorian Achleitner, Aug 28, 2012
  18. Junio C HamanoAug 28, 2012
  19. Junio C HamanoAug 28, 2012
  20. Junio C HamanoAug 28, 2012
  21. Junio C HamanoAug 28, 2012
  22. Junio C HamanoAug 28, 2012
  23. Junio C HamanoAug 28, 2012
  24. Junio C HamanoAug 28, 2012
  25. Junio C HamanoAug 28, 2012
  26. Florian AchleitnerAug 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.