blob: b0b5d5eaaee5bb935d1ee0879450f957530bff48 [file] [log] [blame]
Junio C Hamano982eb112010-11-18 00:53:091<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
2 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
3<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
4<head>
5<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
6<meta name="generator" content="AsciiDoc 8.4.5" />
7<title>sigchain API</title>
8<style type="text/css">
9/* Debug borders */
10p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 {
11/*
12 border: 1px solid red;
13*/
14}
15
16body {
17 margin: 1em 5% 1em 5%;
18}
19
20a {
21 color: blue;
22 text-decoration: underline;
23}
24a:visited {
25 color: fuchsia;
26}
27
28em {
29 font-style: italic;
30 color: navy;
31}
32
33strong {
34 font-weight: bold;
35 color: #083194;
36}
37
38tt {
39 color: navy;
40}
41
42h1, h2, h3, h4, h5, h6 {
43 color: #527bbd;
44 font-family: sans-serif;
45 margin-top: 1.2em;
46 margin-bottom: 0.5em;
47 line-height: 1.3;
48}
49
50h1, h2, h3 {
51 border-bottom: 2px solid silver;
52}
53h2 {
54 padding-top: 0.5em;
55}
56h3 {
57 float: left;
58}
59h3 + * {
60 clear: left;
61}
62
63div.sectionbody {
64 font-family: serif;
65 margin-left: 0;
66}
67
68hr {
69 border: 1px solid silver;
70}
71
72p {
73 margin-top: 0.5em;
74 margin-bottom: 0.5em;
75}
76
77ul, ol, li > p {
78 margin-top: 0;
79}
80
81pre {
82 padding: 0;
83 margin: 0;
84}
85
86span#author {
87 color: #527bbd;
88 font-family: sans-serif;
89 font-weight: bold;
90 font-size: 1.1em;
91}
92span#email {
93}
94span#revnumber, span#revdate, span#revremark {
95 font-family: sans-serif;
96}
97
98div#footer {
99 font-family: sans-serif;
100 font-size: small;
101 border-top: 2px solid silver;
102 padding-top: 0.5em;
103 margin-top: 4.0em;
104}
105div#footer-text {
106 float: left;
107 padding-bottom: 0.5em;
108}
109div#footer-badges {
110 float: right;
111 padding-bottom: 0.5em;
112}
113
114div#preamble {
115 margin-top: 1.5em;
116 margin-bottom: 1.5em;
117}
118div.tableblock, div.imageblock, div.exampleblock, div.verseblock,
119div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
120div.admonitionblock {
121 margin-top: 1.5em;
122 margin-bottom: 1.5em;
123}
124div.admonitionblock {
125 margin-top: 2.5em;
126 margin-bottom: 2.5em;
127}
128
129div.content { /* Block element content. */
130 padding: 0;
131}
132
133/* Block element titles. */
134div.title, caption.title {
135 color: #527bbd;
136 font-family: sans-serif;
137 font-weight: bold;
138 text-align: left;
139 margin-top: 1.0em;
140 margin-bottom: 0.5em;
141}
142div.title + * {
143 margin-top: 0;
144}
145
146td div.title:first-child {
147 margin-top: 0.0em;
148}
149div.content div.title:first-child {
150 margin-top: 0.0em;
151}
152div.content + div.title {
153 margin-top: 0.0em;
154}
155
156div.sidebarblock > div.content {
157 background: #ffffee;
158 border: 1px solid silver;
159 padding: 0.5em;
160}
161
162div.listingblock > div.content {
163 border: 1px solid silver;
164 background: #f4f4f4;
165 padding: 0.5em;
166}
167
168div.quoteblock {
169 padding-left: 2.0em;
170 margin-right: 10%;
171}
172div.quoteblock > div.attribution {
173 padding-top: 0.5em;
174 text-align: right;
175}
176
177div.verseblock {
178 padding-left: 2.0em;
179 margin-right: 10%;
180}
181div.verseblock > div.content {
182 white-space: pre;
183}
184div.verseblock > div.attribution {
185 padding-top: 0.75em;
186 text-align: left;
187}
188/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
189div.verseblock + div.attribution {
190 text-align: left;
191}
192
193div.admonitionblock .icon {
194 vertical-align: top;
195 font-size: 1.1em;
196 font-weight: bold;
197 text-decoration: underline;
198 color: #527bbd;
199 padding-right: 0.5em;
200}
201div.admonitionblock td.content {
202 padding-left: 0.5em;
203 border-left: 2px solid silver;
204}
205
206div.exampleblock > div.content {
207 border-left: 2px solid silver;
208 padding: 0.5em;
209}
210
211div.imageblock div.content { padding-left: 0; }
212span.image img { border-style: none; }
213a.image:visited { color: white; }
214
215dl {
216 margin-top: 0.8em;
217 margin-bottom: 0.8em;
218}
219dt {
220 margin-top: 0.5em;
221 margin-bottom: 0;
222 font-style: normal;
223 color: navy;
224}
225dd > *:first-child {
226 margin-top: 0.1em;
227}
228
229ul, ol {
230 list-style-position: outside;
231}
232ol.arabic {
233 list-style-type: decimal;
234}
235ol.loweralpha {
236 list-style-type: lower-alpha;
237}
238ol.upperalpha {
239 list-style-type: upper-alpha;
240}
241ol.lowerroman {
242 list-style-type: lower-roman;
243}
244ol.upperroman {
245 list-style-type: upper-roman;
246}
247
248div.compact ul, div.compact ol,
249div.compact p, div.compact p,
250div.compact div, div.compact div {
251 margin-top: 0.1em;
252 margin-bottom: 0.1em;
253}
254
255div.tableblock > table {
256 border: 3px solid #527bbd;
257}
258thead {
259 font-family: sans-serif;
260 font-weight: bold;
261}
262tfoot {
263 font-weight: bold;
264}
265td > div.verse {
266 white-space: pre;
267}
268p.table {
269 margin-top: 0;
270}
271/* Because the table frame attribute is overriden by CSS in most browsers. */
272div.tableblock > table[frame="void"] {
273 border-style: none;
274}
275div.tableblock > table[frame="hsides"] {
276 border-left-style: none;
277 border-right-style: none;
278}
279div.tableblock > table[frame="vsides"] {
280 border-top-style: none;
281 border-bottom-style: none;
282}
283
284
285div.hdlist {
286 margin-top: 0.8em;
287 margin-bottom: 0.8em;
288}
289div.hdlist tr {
290 padding-bottom: 15px;
291}
292dt.hdlist1.strong, td.hdlist1.strong {
293 font-weight: bold;
294}
295td.hdlist1 {
296 vertical-align: top;
297 font-style: normal;
298 padding-right: 0.8em;
299 color: navy;
300}
301td.hdlist2 {
302 vertical-align: top;
303}
304div.hdlist.compact tr {
305 margin: 0;
306 padding-bottom: 0;
307}
308
309.comment {
310 background: yellow;
311}
312
313@media print {
314 div#footer-badges { display: none; }
315}
316
317div#toctitle {
318 color: #527bbd;
319 font-family: sans-serif;
320 font-size: 1.1em;
321 font-weight: bold;
322 margin-top: 1.0em;
323 margin-bottom: 0.1em;
324}
325
326div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
327 margin-top: 0;
328 margin-bottom: 0;
329}
330div.toclevel2 {
331 margin-left: 2em;
332 font-size: 0.9em;
333}
334div.toclevel3 {
335 margin-left: 4em;
336 font-size: 0.9em;
337}
338div.toclevel4 {
339 margin-left: 6em;
340 font-size: 0.9em;
341}
342/* Workarounds for IE6's broken and incomplete CSS2. */
343
344div.sidebar-content {
345 background: #ffffee;
346 border: 1px solid silver;
347 padding: 0.5em;
348}
349div.sidebar-title, div.image-title {
350 color: #527bbd;
351 font-family: sans-serif;
352 font-weight: bold;
353 margin-top: 0.0em;
354 margin-bottom: 0.5em;
355}
356
357div.listingblock div.content {
358 border: 1px solid silver;
359 background: #f4f4f4;
360 padding: 0.5em;
361}
362
363div.quoteblock-attribution {
364 padding-top: 0.5em;
365 text-align: right;
366}
367
368div.verseblock-content {
369 white-space: pre;
370}
371div.verseblock-attribution {
372 padding-top: 0.75em;
373 text-align: left;
374}
375
376div.exampleblock-content {
377 border-left: 2px solid silver;
378 padding-left: 0.5em;
379}
380
381/* IE6 sets dynamically generated links as visited. */
382div#toc a:visited { color: blue; }
383</style>
384</head>
385<body>
386<div id="header">
387<h1>sigchain API</h1>
388</div>
389<div id="preamble">
390<div class="sectionbody">
391<div class="paragraph"><p>Code often wants to set a signal handler to clean up temporary files or
392other work-in-progress when we die unexpectedly. For multiple pieces of
393code to do this without conflicting, each piece of code must remember
394the old value of the handler and restore it either when:</p></div>
395<div class="olist arabic"><ol class="arabic">
396<li>
397<p>
398The work-in-progress is finished, and the handler is no longer
399 necessary. The handler should revert to the original behavior
400 (either another handler, SIG_DFL, or SIG_IGN).
401</p>
402</li>
403<li>
404<p>
405The signal is received. We should then do our cleanup, then chain
406 to the next handler (or die if it is SIG_DFL).
407</p>
408</li>
409</ol></div>
410<div class="paragraph"><p>Sigchain is a tiny library for keeping a stack of handlers. Your handler
411and installation code should look something like:</p></div>
412<div class="listingblock">
413<div class="content">
414<pre><tt> void clean_foo_on_signal(int sig)
415 {
416 clean_foo();
417 sigchain_pop(sig);
418 raise(sig);
419 }
420
421 void other_func()
422 {
423 sigchain_push_common(clean_foo_on_signal);
424 mess_up_foo();
425 clean_foo();
426 }</tt></pre>
427</div></div>
Junio C Hamano7165bf72011-01-04 22:06:18428<div class="paragraph"><p>Handlers are given the typedef of sigchain_fun. This is the same type
Junio C Hamano982eb112010-11-18 00:53:09429that is given to signal() or sigaction(). It is perfectly reasonable to
430push SIG_DFL or SIG_IGN onto the stack.</p></div>
431<div class="paragraph"><p>You can sigchain_push and sigchain_pop individual signals. For
432convenience, sigchain_push_common will push the handler onto the stack
433for many common signals.</p></div>
434</div>
435</div>
436<div id="footer">
437<div id="footer-text">
Junio C Hamano7165bf72011-01-04 22:06:18438Last updated 2011-01-04 22:05:44 UTC
Junio C Hamano982eb112010-11-18 00:53:09439</div>
440</div>
441</body>
442</html>