1#ifndef SUBPROCESS_H 2#define SUBPROCESS_H 3 4#include"git-compat-util.h" 5#include"hashmap.h" 6#include"run-command.h" 7 8/* 9 * The sub-process API makes it possible to run background sub-processes 10 * for the entire lifetime of a Git invocation. If Git needs to communicate 11 * with an external process multiple times, then this can reduces the process 12 * invocation overhead. Git and the sub-process communicate through stdin and 13 * stdout. 14 * 15 * The sub-processes are kept in a hashmap by command name and looked up 16 * via the subprocess_find_entry function. If an existing instance can not 17 * be found then a new process should be created and started. When the 18 * parent git command terminates, all sub-processes are also terminated. 19 * 20 * This API is based on the run-command API. 21 */ 22 23/* data structures */ 24 25/* Members should not be accessed directly. */ 26struct subprocess_entry { 27struct hashmap_entry ent;/* must be the first member! */ 28const char*cmd; 29struct child_process process; 30}; 31 32/* subprocess functions */ 33 34/* Function to test two subprocess hashmap entries for equality. */ 35externintcmd2process_cmp(const void*unused_cmp_data, 36const struct subprocess_entry *e1, 37const struct subprocess_entry *e2, 38const void*unused_keydata); 39 40/* 41 * User-supplied function to initialize the sub-process. This is 42 * typically used to negotiate the interface version and capabilities. 43 */ 44typedefint(*subprocess_start_fn)(struct subprocess_entry *entry); 45 46/* Start a subprocess and add it to the subprocess hashmap. */ 47intsubprocess_start(struct hashmap *hashmap,struct subprocess_entry *entry,const char*cmd, 48 subprocess_start_fn startfn); 49 50/* Kill a subprocess and remove it from the subprocess hashmap. */ 51voidsubprocess_stop(struct hashmap *hashmap,struct subprocess_entry *entry); 52 53/* Find a subprocess in the subprocess hashmap. */ 54struct subprocess_entry *subprocess_find_entry(struct hashmap *hashmap,const char*cmd); 55 56/* subprocess helper functions */ 57 58/* Get the underlying `struct child_process` from a subprocess. */ 59staticinlinestruct child_process *subprocess_get_child_process( 60struct subprocess_entry *entry) 61{ 62return&entry->process; 63} 64 65/* 66 * Helper function that will read packets looking for "status=<foo>" 67 * key/value pairs and return the value from the last "status" packet 68 */ 69 70intsubprocess_read_status(int fd,struct strbuf *status); 71 72#endif