Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ setjmp(3) — Amiga System V Release 4 Version 2.01

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

cc(1)

signal(3)

sigsetmask(3)

sigvec(3)

nal(2)

setjmp(3C)



setjmp(3)              C LIBRARY FUNCTIONS              setjmp(3)



NAME
     setjmp, longjmp, setjmp, longjmp, sigsetjmp, siglongjmp  -
     non-local goto

SYNOPSIS
     cc [ flag... ] file ... -lucb
     #include <setjmp.h>
     int setjmp(env)
     jmpbuf env;
     longjmp(env, val)
     jmpbuf env;
     int val;
     int setjmp(env)
     jmpbuf env;
     longjmp(env, val)
     jmpbuf env;
     int val;
     int sigsetjmp(env, savemask)
     sigjmpbuf env;
     int savemask;
     siglongjmp(env, val)
     sigjmpbuf env;
     int val;

DESCRIPTION
     setjmp and longjmp are useful for dealing  with  errors  and
     interrupts  encountered  in a low-level subroutine of a pro-
     gram.  setjmp saves its stack environment in env  for  later
     use  by  longjmp.   A  normal  call  to setjmp returns zero.
     setjmp also saves the register environment.   If  a  longjmp
     call  will  be  made, the routine which called setjmp should
     not return until after the longjmp has returned control (see
     below).   longjmp restores the environment saved by the last
     call of setjmp, and then returns in such a way  that  execu-
     tion  continues  as  if the call of setjmp had just returned
     the value val to the function that invoked setjmp;  however,
     if val were zero, execution would continue as if the call of
     setjmp had returned one.  This  ensures  that  a  ``return''
     from setjmp caused by a call to longjmp can be distinguished
     from a regular return from  setjmp.   The  calling  function
     must  not  itself  have  returned  in the interim, otherwise
     longjmp will be returning control to a possibly non-existent
     environment.   All  memory-bound  data have values as of the
     time longjmp was called.  The CPU  and  floating-point  data
     registers  are  restored  to the values they had at the time
     that setjmp was called.  But, because the  register  storage
     class  is  only a hint to the C compiler, variables declared
     as register variables may not  necessarily  be  assigned  to
     machine registers, so their values are unpredictable after a
     longjmp.  This is especially a problem for programmers  try-
     ing  to  write  machine-independent  C routines.  setjmp and
     longjmp   save   and   restore   the   signal   mask    (see



             Last change: BSD Compatibility Package             1





setjmp(3)              C LIBRARY FUNCTIONS              setjmp(3)



     sigsetmask(2)),  while  setjmp and longjmp manipulate only
     the  C  stack  and  registers.   If  the  savemask  flag  to
     sigsetjmp  is non-zero, the signal mask is saved, and a sub-
     sequent siglongjmp using the same env will restore the  sig-
     nal  mask.  If the savemask flag is zero, the signal mask is
     not saved, and a subsequent siglongjmp using  the  same  env
     will  not  restore  the  signal  mask.   In  all other ways,
     setjmp and sigsetjmp function in the same way  that  setjmp
     does,  and  longjmp and siglongjmp function in the same way
     that longjmp does.  None of these functions save or  restore
     any floating-point status or control registers.

EXAMPLE
     The following code fragment indicates the flow of control of
     the setjmp and longjmp combination:
          function declaration
          ...
               jmpbuf   myenvironment;
               ...
               if (setjmp(myenvironment))  {
                 /* register variables have unpredictable values */
                    code after the return from longjmp
                    ...
               } else {
                 /* do not modify register vars in this leg of code */
                    this is the return from setjmp
                    ...
               }

SEE ALSO
     cc(1), signal(3),  sigsetmask(3),  sigvec(3).   cc(1),  sig-
     nal(2), setjmp(3C) in the Programmer's Reference Manual.

BUGS
     setjmp does not save the current notion of whether the  pro-
     cess is executing on the signal stack.  The result is that a
     longjmp to some place on the signal stack leaves the  signal
     stack  state  incorrect.   On some systems setjmp also saves
     the register environment.   Therefore,  all  data  that  are
     bound  to  registers  are restored to the values they had at
     the time that setjmp was called.  All memory-bound data have
     values  as of the time longjmp was called.  However, because
     the register storage class is only a hint to the C compiler,
     variables declared as register variables may not necessarily
     be assigned  to  machine  registers,  so  their  values  are
     unpredictable  after a longjmp.  When using compiler options
     that specify automatic register allocation (see cc(1V)), the
     compiler  will  not attempt to assign variables to registers
     in routines that call setjmp.  longjmp never  causes  setjmp
     to  return zero, so programmers should not depend on longjmp
     being able to cause setjmp to return zero.




             Last change: BSD Compatibility Package             2



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