summaryrefslogtreecommitdiff
path: root/run-command.h
diff options
context:
space:
mode:
authorJohannes Sixt <johannes.sixt@telecom.at>2007-10-19 21:48:00 +0200
committerShawn O. Pearce <spearce@spearce.org>2007-10-21 01:30:41 -0400
commit2d22c208304156892fd6674e0055a3212c1e2d2e (patch)
tree48102e69b4db1fbd0b1513df225e05fd06bb1612 /run-command.h
parentcc41fa8da9b9e9d23221d3be47a80409a89732d4 (diff)
downloadgit-2d22c208304156892fd6674e0055a3212c1e2d2e.tar.gz
Add infrastructure to run a function asynchronously.
This adds start_async() and finish_async(), which runs a function asynchronously. Communication with the caller happens only via pipes. For this reason, this implementation forks off a child process that runs the function. [sp: Style nit fixed by removing unnecessary block on if condition inside of start_async()] Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Diffstat (limited to 'run-command.h')
-rw-r--r--run-command.h22
1 files changed, 22 insertions, 0 deletions
diff --git a/run-command.h b/run-command.h
index 35b9fb61f1..94e1e9d516 100644
--- a/run-command.h
+++ b/run-command.h
@@ -43,4 +43,26 @@ int run_command_v_opt_cd(const char **argv, int opt, const char *dir);
*/
int run_command_v_opt_cd_env(const char **argv, int opt, const char *dir, const char *const *env);
+/*
+ * The purpose of the following functions is to feed a pipe by running
+ * a function asynchronously and providing output that the caller reads.
+ *
+ * It is expected that no synchronization and mutual exclusion between
+ * the caller and the feed function is necessary so that the function
+ * can run in a thread without interfering with the caller.
+ */
+struct async {
+ /*
+ * proc writes to fd and closes it;
+ * returns 0 on success, non-zero on failure
+ */
+ int (*proc)(int fd, void *data);
+ void *data;
+ int out; /* caller reads from here and closes it */
+ pid_t pid;
+};
+
+int start_async(struct async *async);
+int finish_async(struct async *async);
+
#endif