1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- .TH SETJMP 2
- .SH NAME
- setjmp, longjmp, notejmp \- non-local goto
- .SH SYNOPSIS
- .B #include <u.h>
- .br
- .B #include <libc.h>
- .PP
- .ta \w'\fLvoid 'u
- .B
- int setjmp(jmp_buf env)
- .PP
- .B
- void longjmp(jmp_buf env, int val)
- .PP
- .B
- void notejmp(void *uregs, jmp_buf env, int val)
- .SH DESCRIPTION
- These routines are useful for dealing with errors
- and interrupts encountered in
- a low-level subroutine of a program.
- .PP
- .I Setjmp
- saves its stack environment in
- .I env
- for later use by
- .IR longjmp .
- It returns value 0.
- .PP
- .I Longjmp
- restores the environment saved by the last call of
- .IR setjmp .
- It then causes execution to
- continue as if the call of
- .I setjmp
- had just returned with value
- .IR val .
- The invoker of
- .I setjmp
- must not itself have returned in the interim.
- All accessible data have values as of the time
- .I longjmp
- was called.
- .PP
- .I Notejmp
- is the same as
- .I longjmp
- except that it is to be called from within a note handler (see
- .IR notify (2)).
- The
- .I uregs
- argument should be the first argument passed to the note handler.
- .PP
- .I Setjmp
- and
- .I longjmp
- can also be used to switch stacks.
- Several macros are defined in
- .B /$objtype/include/u.h
- that can be used to build
- .B jmp_bufs
- by hand. The following code establishes a
- .B jmp_buf
- .i label
- that may be called by
- .I longjmp
- to begin execution in a function
- .BR f
- with 1024 bytes of stack:
- .IP
- .EX
- #include <u.h>
- #include <libc.h>
- jmp_buf label;
- #define NSTACK 1024
- char stack[NSTACK];
- void
- setlabel(void)
- {
- label[JMPBUFPC] = ((ulong)f+JMPBUFDPC);
- /* -2 leaves room for old pc and new pc in frame */
- label[JMPBUFSP] =
- (ulong)(&stack[NSTACK-2*sizeof(ulong*)]);
- }
- .EE
- .SH SOURCE
- .B /sys/src/libc/$objtype/setjmp.s
- .br
- .B /sys/src/libc/$objtype/notejmp.c
- .SH SEE ALSO
- .IR notify (2)
- .SH BUGS
- .PP
- .I Notejmp
- cannot recover from an address trap or bus error (page fault) on the 680x0
- architectures.
|