зеркало из https://github.com/microsoft/git.git
refactor signal handling for cleanup functions
The current code is very inconsistent about which signals are caught for doing cleanup of temporary files and lock files. Some callsites checked only SIGINT, while others checked a variety of death-dealing signals. This patch factors out those signals to a single function, and then calls it everywhere. For some sites, that means this is a simple clean up. For others, it is an improvement in that they will now properly clean themselves up after a larger variety of signals. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
4a16d07272
Коммит
57b235a4bc
|
@ -439,7 +439,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
|
|||
}
|
||||
junk_git_dir = git_dir;
|
||||
atexit(remove_junk);
|
||||
sigchain_push(SIGINT, remove_junk_on_signal);
|
||||
sigchain_push_common(remove_junk_on_signal);
|
||||
|
||||
setenv(CONFIG_ENVIRONMENT, xstrdup(mkpath("%s/config", git_dir)), 1);
|
||||
|
||||
|
|
|
@ -246,7 +246,7 @@ static int fetch_native_store(FILE *fp,
|
|||
char buffer[1024];
|
||||
int err = 0;
|
||||
|
||||
sigchain_push(SIGINT, remove_keep_on_signal);
|
||||
sigchain_push_common(remove_keep_on_signal);
|
||||
atexit(remove_keep);
|
||||
|
||||
while (fgets(buffer, sizeof(buffer), stdin)) {
|
||||
|
|
|
@ -673,7 +673,7 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
|
|||
ref_nr = j;
|
||||
}
|
||||
|
||||
sigchain_push(SIGINT, unlock_pack_on_signal);
|
||||
sigchain_push_common(unlock_pack_on_signal);
|
||||
atexit(unlock_pack);
|
||||
exit_code = do_fetch(transport,
|
||||
parse_fetch_refspec(ref_nr, refs), ref_nr);
|
||||
|
|
2
diff.c
2
diff.c
|
@ -1903,7 +1903,7 @@ static struct diff_tempfile *prepare_temp_file(const char *name,
|
|||
|
||||
if (!remove_tempfile_installed) {
|
||||
atexit(remove_tempfile);
|
||||
sigchain_push(SIGINT, remove_tempfile_on_signal);
|
||||
sigchain_push_common(remove_tempfile_on_signal);
|
||||
remove_tempfile_installed = 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -2262,10 +2262,7 @@ int main(int argc, char **argv)
|
|||
goto cleanup;
|
||||
}
|
||||
|
||||
sigchain_push(SIGINT, remove_locks_on_signal);
|
||||
sigchain_push(SIGHUP, remove_locks_on_signal);
|
||||
sigchain_push(SIGQUIT, remove_locks_on_signal);
|
||||
sigchain_push(SIGTERM, remove_locks_on_signal);
|
||||
sigchain_push_common(remove_locks_on_signal);
|
||||
|
||||
/* Check whether the remote has server info files */
|
||||
remote->can_update_info_refs = 0;
|
||||
|
|
|
@ -137,11 +137,7 @@ static int lock_file(struct lock_file *lk, const char *path, int flags)
|
|||
lk->fd = open(lk->filename, O_RDWR | O_CREAT | O_EXCL, 0666);
|
||||
if (0 <= lk->fd) {
|
||||
if (!lock_file_list) {
|
||||
sigchain_push(SIGINT, remove_lock_file_on_signal);
|
||||
sigchain_push(SIGHUP, remove_lock_file_on_signal);
|
||||
sigchain_push(SIGTERM, remove_lock_file_on_signal);
|
||||
sigchain_push(SIGQUIT, remove_lock_file_on_signal);
|
||||
sigchain_push(SIGPIPE, remove_lock_file_on_signal);
|
||||
sigchain_push_common(remove_lock_file_on_signal);
|
||||
atexit(remove_lock_file);
|
||||
}
|
||||
lk->owner = getpid();
|
||||
|
|
|
@ -41,3 +41,12 @@ int sigchain_pop(int sig)
|
|||
s->n--;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void sigchain_push_common(sigchain_fun f)
|
||||
{
|
||||
sigchain_push(SIGINT, f);
|
||||
sigchain_push(SIGHUP, f);
|
||||
sigchain_push(SIGTERM, f);
|
||||
sigchain_push(SIGQUIT, f);
|
||||
sigchain_push(SIGPIPE, f);
|
||||
}
|
||||
|
|
|
@ -6,4 +6,6 @@ typedef void (*sigchain_fun)(int);
|
|||
int sigchain_push(int sig, sigchain_fun f);
|
||||
int sigchain_pop(int sig);
|
||||
|
||||
void sigchain_push_common(sigchain_fun f);
|
||||
|
||||
#endif /* SIGCHAIN_H */
|
||||
|
|
Загрузка…
Ссылка в новой задаче