Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ (2) — Plan9 4th Edition

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

notify(2)

SETJMP(2)

NAME

setjmp, longjmp, notejmp − non-local goto

SYNOPSIS

­#include <u.h>
­#include <libc.h>

intsetjmp(jmp_buf env)

voidlongjmp(jmp_buf env, int val)

voidnotejmp(void ∗uregs, jmp_buf env, int val)

DESCRIPTION

These routines are useful for dealing with errors and interrupts encountered in a low-level subroutine of a program. 

­Setjmp saves its stack environment in ­env for later use by longjmp. It returns value 0.

­Longjmp restores the environment saved by the last call of setjmp. It then causes execution to continue as if the call of ­setjmp had just returned with value val. The invoker of ­setjmp must not itself have returned in the interim.  All accessible data have values as of the time ­longjmp was called. 

­Notejmp is the same as ­longjmp except that it is to be called from within a note handler (see notify(2)). The ­uregs argument should be the first argument passed to the note handler. 

­Setjmp and ­longjmp can also be used to switch stacks.  Defined in ­</$objtype/u.h> are several macros that can be used to build ­jmp_bufs by hand.  The following code establishes a ­jmp_buf that may be called by ­longjmp to begin execution in a function f with 1024 bytes of stack:

#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∗)]);
}

SOURCE

­/sys/src/libc/$objtype/setjmp.s
­/sys/src/libc/$objtype/notejmp.c

SEE ALSO

notify(2)

BUGS

­Notejmp cannot recover from an address trap or bus error (page fault) on the 680x0 architectures. 

Plan 9  —  December 11, 1999

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026