Skip to content

Commit

Permalink
refactor signal handling for cleanup functions
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
peff authored and gitster committed Jan 22, 2009
1 parent 4a16d07 commit 57b235a
Show file tree
Hide file tree
Showing 8 changed files with 17 additions and 13 deletions.
2 changes: 1 addition & 1 deletion builtin-clone.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
2 changes: 1 addition & 1 deletion builtin-fetch--tool.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)) {
Expand Down
2 changes: 1 addition & 1 deletion builtin-fetch.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
5 changes: 1 addition & 4 deletions http-push.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
6 changes: 1 addition & 5 deletions lockfile.c
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
9 changes: 9 additions & 0 deletions sigchain.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
2 changes: 2 additions & 0 deletions sigchain.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */

0 comments on commit 57b235a

Please sign in to comment.