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:
Jeff King 2009-01-22 01:03:08 -05:00 committed by Junio C Hamano
parent 4a16d07272
commit 57b235a4bc
8 changed files with 17 additions and 13 deletions

View File

@ -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);

View File

@ -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)) {

View File

@ -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
View File

@ -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;
}

View File

@ -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;

View File

@ -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();

View File

@ -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);
}

View File

@ -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 */