Re: [PATCH v10 04/14] run-command: add clean_on_exit_handler
> On 16 Oct 2016, at 01:03, Johannes Schindelin> wrote: > > Hi Lars, > > On Sat, 15 Oct 2016, Lars Schneider wrote: > >> >>> On 11 Oct 2016, at 05:12, Johannes Schindelin >>> wrote: >>> >>> On Windows, pid_t translates to long long int, resulting in this build >>> error: >>> >> >> Thanks for hint! I'll change it! >> >> However, I am building on Win 8.1 with your latest SDK and I cannot >> reproduce the error. Any idea why that might be the case? > > Are you building with DEVELOPER=1? Argh! Of course ... I forgot to add this flag to my config.mak on Windows. Thanks, Lars
Re: [PATCH v10 04/14] run-command: add clean_on_exit_handler
Hi Lars, On Sat, 15 Oct 2016, Lars Schneider wrote: > > > On 11 Oct 2016, at 05:12, Johannes Schindelin> > wrote: > > > > Hi Lars, > > > > On Sat, 8 Oct 2016, larsxschnei...@gmail.com wrote: > > > >> @@ -31,6 +32,15 @@ static void cleanup_children(int sig, int in_signal) > >>while (children_to_clean) { > >>struct child_to_clean *p = children_to_clean; > >>children_to_clean = p->next; > >> + > >> + if (p->process && !in_signal) { > >> + struct child_process *process = p->process; > >> + if (process->clean_on_exit_handler) { > >> + trace_printf("trace: run_command: running exit > >> handler for pid %d", p->pid); > > > > On Windows, pid_t translates to long long int, resulting in this build > > error: > > > > -- snip -- > > In file included from cache.h:10:0, > > from run-command.c:1: > > run-command.c: In function 'cleanup_children': > > run-command.c:39:18: error: format '%d' expects argument of type 'int', but > > argument 5 has type 'pid_t {aka long long int}' [-Werror=format=] > > trace_printf("trace: run_command: running exit handler for pid %d", > > p->pid); > > ^ > > trace.h:81:53: note: in definition of macro 'trace_printf' > > trace_printf_key_fl(TRACE_CONTEXT, __LINE__, NULL, __VA_ARGS__) > > ^~~ > > cc1.exe: all warnings being treated as errors > > make: *** [Makefile:1987: run-command.o] Error 1 > > -- snap -- > > > > Maybe use PRIuMAX as we do elsewhere (see output of `git grep > > printf.*pid`): > > > > trace_printf("trace: run_command: running exit handler for pid %" > > PRIuMAX, (uintmax_t)p->pid); > > Thanks for hint! I'll change it! > > However, I am building on Win 8.1 with your latest SDK and I cannot > reproduce the error. Any idea why that might be the case? Are you building with DEVELOPER=1? Ciao, Dscho
Re: [PATCH v10 04/14] run-command: add clean_on_exit_handler
> On 11 Oct 2016, at 05:12, Johannes Schindelin> wrote: > > Hi Lars, > > On Sat, 8 Oct 2016, larsxschnei...@gmail.com wrote: > >> @@ -31,6 +32,15 @@ static void cleanup_children(int sig, int in_signal) >> while (children_to_clean) { >> struct child_to_clean *p = children_to_clean; >> children_to_clean = p->next; >> + >> +if (p->process && !in_signal) { >> +struct child_process *process = p->process; >> +if (process->clean_on_exit_handler) { >> +trace_printf("trace: run_command: running exit >> handler for pid %d", p->pid); > > On Windows, pid_t translates to long long int, resulting in this build > error: > > -- snip -- > In file included from cache.h:10:0, > from run-command.c:1: > run-command.c: In function 'cleanup_children': > run-command.c:39:18: error: format '%d' expects argument of type 'int', but > argument 5 has type 'pid_t {aka long long int}' [-Werror=format=] > trace_printf("trace: run_command: running exit handler for pid %d", > p->pid); > ^ > trace.h:81:53: note: in definition of macro 'trace_printf' > trace_printf_key_fl(TRACE_CONTEXT, __LINE__, NULL, __VA_ARGS__) > ^~~ > cc1.exe: all warnings being treated as errors > make: *** [Makefile:1987: run-command.o] Error 1 > -- snap -- > > Maybe use PRIuMAX as we do elsewhere (see output of `git grep > printf.*pid`): > > trace_printf("trace: run_command: running exit handler for pid %" >PRIuMAX, (uintmax_t)p->pid); Thanks for hint! I'll change it! However, I am building on Win 8.1 with your latest SDK and I cannot reproduce the error. Any idea why that might be the case? Thanks, Lars
Re: [PATCH v10 04/14] run-command: add clean_on_exit_handler
Hi Lars, On Sat, 8 Oct 2016, larsxschnei...@gmail.com wrote: > @@ -31,6 +32,15 @@ static void cleanup_children(int sig, int in_signal) > while (children_to_clean) { > struct child_to_clean *p = children_to_clean; > children_to_clean = p->next; > + > + if (p->process && !in_signal) { > + struct child_process *process = p->process; > + if (process->clean_on_exit_handler) { > + trace_printf("trace: run_command: running exit > handler for pid %d", p->pid); On Windows, pid_t translates to long long int, resulting in this build error: -- snip -- In file included from cache.h:10:0, from run-command.c:1: run-command.c: In function 'cleanup_children': run-command.c:39:18: error: format '%d' expects argument of type 'int', but argument 5 has type 'pid_t {aka long long int}' [-Werror=format=] trace_printf("trace: run_command: running exit handler for pid %d", p->pid); ^ trace.h:81:53: note: in definition of macro 'trace_printf' trace_printf_key_fl(TRACE_CONTEXT, __LINE__, NULL, __VA_ARGS__) ^~~ cc1.exe: all warnings being treated as errors make: *** [Makefile:1987: run-command.o] Error 1 -- snap -- Maybe use PRIuMAX as we do elsewhere (see output of `git grep printf.*pid`): trace_printf("trace: run_command: running exit handler for pid %" PRIuMAX, (uintmax_t)p->pid); Ciao, Dscho
[PATCH v10 04/14] run-command: add clean_on_exit_handler
From: Lars SchneiderSome processes might want to perform cleanup tasks before Git kills them due to the 'clean_on_exit' flag. Let's give them an interface for doing this. The feature is used in a subsequent patch. Please note, that the cleanup callback is not executed if Git dies of a signal. The reason is that only "async-signal-safe" functions would be allowed to be call in that case. Since we cannot control what functions the callback will use, we will not support the case. See 507d7804 for more details. Helped-by: Johannes Sixt Signed-off-by: Lars Schneider --- run-command.c | 19 +++ run-command.h | 2 ++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/run-command.c b/run-command.c index 3269362..e5fd6ff 100644 --- a/run-command.c +++ b/run-command.c @@ -21,6 +21,7 @@ void child_process_clear(struct child_process *child) struct child_to_clean { pid_t pid; + struct child_process *process; struct child_to_clean *next; }; static struct child_to_clean *children_to_clean; @@ -31,6 +32,15 @@ static void cleanup_children(int sig, int in_signal) while (children_to_clean) { struct child_to_clean *p = children_to_clean; children_to_clean = p->next; + + if (p->process && !in_signal) { + struct child_process *process = p->process; + if (process->clean_on_exit_handler) { + trace_printf("trace: run_command: running exit handler for pid %d", p->pid); + process->clean_on_exit_handler(process); + } + } + kill(p->pid, sig); if (!in_signal) free(p); @@ -49,10 +59,11 @@ static void cleanup_children_on_exit(void) cleanup_children(SIGTERM, 0); } -static void mark_child_for_cleanup(pid_t pid) +static void mark_child_for_cleanup(pid_t pid, struct child_process *process) { struct child_to_clean *p = xmalloc(sizeof(*p)); p->pid = pid; + p->process = process; p->next = children_to_clean; children_to_clean = p; @@ -422,7 +433,7 @@ int start_command(struct child_process *cmd) if (cmd->pid < 0) error_errno("cannot fork() for %s", cmd->argv[0]); else if (cmd->clean_on_exit) - mark_child_for_cleanup(cmd->pid); + mark_child_for_cleanup(cmd->pid, cmd); /* * Wait for child's execvp. If the execvp succeeds (or if fork() @@ -483,7 +494,7 @@ int start_command(struct child_process *cmd) if (cmd->pid < 0 && (!cmd->silent_exec_failure || errno != ENOENT)) error_errno("cannot spawn %s", cmd->argv[0]); if (cmd->clean_on_exit && cmd->pid >= 0) - mark_child_for_cleanup(cmd->pid); + mark_child_for_cleanup(cmd->pid, cmd); argv_array_clear(); cmd->argv = sargv; @@ -765,7 +776,7 @@ int start_async(struct async *async) exit(!!async->proc(proc_in, proc_out, async->data)); } - mark_child_for_cleanup(async->pid); + mark_child_for_cleanup(async->pid, NULL); if (need_in) close(fdin[0]); diff --git a/run-command.h b/run-command.h index cf29a31..dd1c78c 100644 --- a/run-command.h +++ b/run-command.h @@ -43,6 +43,8 @@ struct child_process { unsigned stdout_to_stderr:1; unsigned use_shell:1; unsigned clean_on_exit:1; + void (*clean_on_exit_handler)(struct child_process *process); + void *clean_on_exit_handler_cbdata; }; #define CHILD_PROCESS_INIT { NULL, ARGV_ARRAY_INIT, ARGV_ARRAY_INIT } -- 2.10.0