blob: 1210c1712f114a349dcdc52db3c4f23ee2106657 [file] [log] [blame]
rsccfa37a72004-04-10 18:53:55 +00001.TH SETJMP 3
2.SH NAME
3setjmp, longjmp, notejmp \- non-local goto
4.SH SYNOPSIS
5.B #include <u.h>
6.br
7.B #include <libc.h>
8.PP
9.ta \w'\fLvoid 'u
10.B
11int setjmp(jmp_buf env)
12.PP
13.B
14void longjmp(jmp_buf env, int val)
15.PP
16.B
17void notejmp(void *uregs, jmp_buf env, int val)
18.SH DESCRIPTION
19These routines are useful for dealing with errors
20and interrupts encountered in
21a low-level subroutine of a program.
22.PP
23.I Setjmp
24saves its stack environment in
25.I env
26for later use by
27.IR longjmp .
28It returns value 0.
29.PP
30.I Longjmp
31restores the environment saved by the last call of
32.IR setjmp .
33It then causes execution to
34continue as if the call of
35.I setjmp
36had just returned with value
37.IR val .
38The invoker of
39.I setjmp
40must not itself have returned in the interim.
41All accessible data have values as of the time
42.I longjmp
43was called.
44.PP
45.I Notejmp
46is the same as
47.I longjmp
48except that it is to be called from within a note handler (see
rscbf8a59f2004-04-11 03:42:27 +000049.IR notify (3)).
rsccfa37a72004-04-10 18:53:55 +000050The
51.I uregs
52argument should be the first argument passed to the note handler.
53.PP
54.I Setjmp
55and
56.I longjmp
57can also be used to switch stacks.
rsccfa37a72004-04-10 18:53:55 +000058.SH SOURCE
rscc3674de2005-01-11 17:37:33 +000059.B \*9/src/lib9/jmp.c
rsccfa37a72004-04-10 18:53:55 +000060.SH SEE ALSO
rscbf8a59f2004-04-11 03:42:27 +000061.IR notify (3)
rsccfa37a72004-04-10 18:53:55 +000062.SH BUGS
63.PP
64.I Notejmp
65cannot recover from an address trap or bus error (page fault) on the 680x0
66architectures.
rscc8b63422005-01-13 04:49:19 +000067.PP
68To avoid name conflicts with the underlying system,
69.IR setjmp ,
70.IR longjmp ,
71.IR notejmp ,
72and
73.I jmp_buf
74are preprocessor macros defined as
75.IR p9setjmp ,
76.IR p9longjmp ,
77.IR p9notejmp ,
78and
79.IR p9jmp_buf ;
80see
81.IR intro (3).
82.PP
83.I P9setjmp
84is implemented as a preprocessor macro that calls
85.I sigsetjmp
86(see
87Unix's \fIsetjmp\fR(3)).