aboutsummaryrefslogtreecommitdiff
path: root/Documentation/technical
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2010-11-17 13:57:58 -0800
committerJunio C Hamano <gitster@pobox.com>2010-11-17 13:57:58 -0800
commit5a7a0fae8f964b5ad179018d6a50f25ef7550f97 (patch)
tree126f1390f83cbddc7b67b70f25348b282944a772 /Documentation/technical
parentd6b634fafdb5570d9c25d5176d3d32fe0b22530d (diff)
parent1c7d402b3e1e9d7e50abfbfb18c88bc79be468ea (diff)
downloadgit-5a7a0fae8f964b5ad179018d6a50f25ef7550f97.tar.gz
git-5a7a0fae8f964b5ad179018d6a50f25ef7550f97.tar.xz
Merge branch 'maint'
* maint: clean: remove redundant variable baselen Documentation/git-pull: clarify configuration Document that rev-list --graph triggers parent rewriting. clean: avoid quoting twice document sigchain api Keep together options controlling the behaviour of diffcore-rename. t3402: test "rebase -s<strategy> -X<opt>"
Diffstat (limited to 'Documentation/technical')
-rw-r--r--Documentation/technical/api-sigchain.txt41
1 files changed, 41 insertions, 0 deletions
diff --git a/Documentation/technical/api-sigchain.txt b/Documentation/technical/api-sigchain.txt
new file mode 100644
index 000000000..535cdff16
--- /dev/null
+++ b/Documentation/technical/api-sigchain.txt
@@ -0,0 +1,41 @@
+sigchain API
+============
+
+Code often wants to set a signal handler to clean up temporary files or
+other work-in-progress when we die unexpectedly. For multiple pieces of
+code to do this without conflicting, each piece of code must remember
+the old value of the handler and restore it either when:
+
+ 1. The work-in-progress is finished, and the handler is no longer
+ necessary. The handler should revert to the original behavior
+ (either another handler, SIG_DFL, or SIG_IGN).
+
+ 2. The signal is received. We should then do our cleanup, then chain
+ to the next handler (or die if it is SIG_DFL).
+
+Sigchain is a tiny library for keeping a stack of handlers. Your handler
+and installation code should look something like:
+
+------------------------------------------
+ void clean_foo_on_signal(int sig)
+ {
+ clean_foo();
+ sigchain_pop(sig);
+ raise(sig);
+ }
+
+ void other_func()
+ {
+ sigchain_push_common(clean_foo_on_signal);
+ mess_up_foo();
+ clean_foo();
+ }
+------------------------------------------
+
+Handlers are given the typdef of sigchain_fun. This is the same type
+that is given to signal() or sigaction(). It is perfectly reasonable to
+push SIG_DFL or SIG_IGN onto the stack.
+
+You can sigchain_push and sigchain_pop individual signals. For
+convenience, sigchain_push_common will push the handler onto the stack
+for many common signals.