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

[PATCH v7 06/10] convert: Separate generic structures and variables from the filter specific ones

From
Ben Peart <peartben@gmail.com>
Date
May 5, 2017, 15:27 UTC
Message-ID
<20170505152802.6724-7-benpeart@microsoft.com>
In-Reply-To
<20170505152802.6724-1-benpeart@microsoft.com>

To enable future reuse of the filter.<driver>.process infrastructure, split the cmd2process structure into two separate parts.

subprocess_entry will now contain the generic data required to manage the creation and tracking of the child process in a hashmap.

cmd2process is a filter protocol specific structure that is used to track the negotiated capabilities of the filter.

Signed-off-by: Ben Peart <benpeart@microsoft.com>
---
 convert.c | 35 ++++++++++++++++++++---------------
 1 file changed, 20 insertions(+), 15 deletions(-)
diff --git a/convert.c b/convert.c
index 4e1d018577..5876218347 100644
--- a/convert.c
+++ b/convert.c
@@ -496,26 +496,31 @@ static int apply_single_file_filter(const char *path, const char *src, size_t le
 #define CAP_CLEAN    (1u<<0)
 #define CAP_SMUDGE   (1u<<1)
 
-struct cmd2process {
+struct subprocess_entry {
 	struct hashmap_entry ent; /* must be the first member! */
-	unsigned int supported_capabilities;
 	const char *cmd;
 	struct child_process process;
 };
 
+struct cmd2process {
+	struct subprocess_entry subprocess; /* must be the first member! */
+	unsigned int supported_capabilities;
+};
+
 static int cmd_process_map_initialized;
 static struct hashmap cmd_process_map;
 
-static int cmd2process_cmp(const struct cmd2process *e1,
-			   const struct cmd2process *e2,
+static int cmd2process_cmp(const struct subprocess_entry *e1,
+			   const struct subprocess_entry *e2,
 			   const void *unused)
 {
 	return strcmp(e1->cmd, e2->cmd);
 }
 
-static struct cmd2process *find_multi_file_filter_entry(struct hashmap *hashmap, const char *cmd)
+static struct subprocess_entry *find_multi_file_filter_entry(struct hashmap *hashmap, const char *cmd)
 {
-	struct cmd2process key;
+	struct subprocess_entry key;
+
 	hashmap_entry_init(&key, strhash(cmd));
 	key.cmd = cmd;
 	return hashmap_get(hashmap, &key, NULL);
@@ -541,7 +546,7 @@ static void read_multi_file_filter_status(int fd, struct strbuf *status)
 	}
 }
 
-static void kill_multi_file_filter(struct hashmap *hashmap, struct cmd2process *entry)
+static void kill_multi_file_filter(struct hashmap *hashmap, struct subprocess_entry *entry)
 {
 	if (!entry)
 		return;
@@ -571,8 +576,8 @@ static int start_multi_file_filter_fn(struct cmd2process *entry)
 	struct string_list cap_list = STRING_LIST_INIT_NODUP;
 	char *cap_buf;
 	const char *cap_name;
-	struct child_process *process = &entry->process;
-	const char *cmd = entry->cmd;
+	struct child_process *process = &entry->subprocess.process;
+	const char *cmd = entry->subprocess.cmd;
 
 	sigchain_push(SIGPIPE, SIG_IGN);
 
@@ -632,9 +637,9 @@ static struct cmd2process *start_multi_file_filter(struct hashmap *hashmap, cons
 	const char *argv[] = { cmd, NULL };
 
 	entry = xmalloc(sizeof(*entry));
-	entry->cmd = cmd;
+	entry->subprocess.cmd = cmd;
 	entry->supported_capabilities = 0;
-	process = &entry->process;
+	process = &entry->subprocess.process;
 
 	child_process_init(process);
 	process->argv = argv;
@@ -654,7 +659,7 @@ static struct cmd2process *start_multi_file_filter(struct hashmap *hashmap, cons
 	err = start_multi_file_filter_fn(entry);
 	if (err) {
 		error("initialization for external filter '%s' failed", cmd);
-		kill_multi_file_filter(hashmap, entry);
+		kill_multi_file_filter(hashmap, &entry->subprocess);
 		return NULL;
 	}
 
@@ -678,7 +683,7 @@ static int apply_multi_file_filter(const char *path, const char *src, size_t len
 		hashmap_init(&cmd_process_map, (hashmap_cmp_fn) cmd2process_cmp, 0);
 		entry = NULL;
 	} else {
-		entry = find_multi_file_filter_entry(&cmd_process_map, cmd);
+		entry = (struct cmd2process *)find_multi_file_filter_entry(&cmd_process_map, cmd);
 	}
 
 	fflush(NULL);
@@ -688,7 +693,7 @@ static int apply_multi_file_filter(const char *path, const char *src, size_t len
 		if (!entry)
 			return 0;
 	}
-	process = &entry->process;
+	process = &entry->subprocess.process;
 
 	if (!(wanted_capability & entry->supported_capabilities))
 		return 0;
@@ -759,7 +764,7 @@ static int apply_multi_file_filter(const char *path, const char *src, size_t len
 			 * Force shutdown and restart if another blob requires filtering.
 			 */
 			error("external filter '%s' failed", cmd);
-			kill_multi_file_filter(&cmd_process_map, entry);
+			kill_multi_file_filter(&cmd_process_map, &entry->subprocess);
 		}
 	} else {
 		strbuf_swap(dst, &nbuf);
-- 
2.12.2.gvfs.2.20.g3624a68d62.dirty
Previous: Ben PeartNext: Junio C Hamano
Message 14 of 16 in “refactor the filter process code into a reusable module”
  1. 00/10 refactor the filter process code into a reusable moduleBen Peart, May 5, 2017
  2. 01/10 convert: remove erroneous tests for errno == EPIPEBen Peart, May 5, 2017
  3. 02/10 pkt-line: fix packet_read_line() to handle len < 0 errorsBen Peart, May 5, 2017
  4. 03/10 pkt-line: add packet_read_line_gently()Ben Peart, May 5, 2017
  5. 04/10 convert: move packet_write_line() into pkt-line as packet_writel()Ben Peart, May 5, 2017
  6. Jeff KingMay 13, 2017
  7. Junio C HamanoMay 15, 2017
  8. 05/10 convert: split start_multi_file_filter() into two separate functionsBen Peart, May 5, 2017
  9. 07/10 convert: Update generic functions to only use generic data structuresBen Peart, May 5, 2017
  10. 09/10 sub-process: move sub-process functions into separate filesBen Peart, May 5, 2017
  11. Jeff KingMay 13, 2017
  12. 10/10 convert: Update subprocess_read_status to not die on EOFBen Peart, May 5, 2017
  13. 08/10 convert: rename reusable sub-process functionsBen Peart, May 5, 2017
  14. 06/10 convert: Separate generic structures and variables from the filter specific onesBen Peart, May 5, 2017
  15. Junio C HamanoMay 8, 2017
  16. Jeff KingMay 13, 2017

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.