Update.
[kopensolaris-gnu/glibc.git] / setjmp / setjmp.h
1 /* Copyright (C) 1991, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Library General Public License as
6    published by the Free Software Foundation; either version 2 of the
7    License, or (at your option) any later version.
8
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Library General Public License for more details.
13
14    You should have received a copy of the GNU Library General Public
15    License along with the GNU C Library; see the file COPYING.LIB.  If not,
16    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17    Boston, MA 02111-1307, USA.  */
18
19 /*
20  *      ISO C Standard: 4.6 NON-LOCAL JUMPS     <setjmp.h>
21  */
22
23 #ifndef _SETJMP_H
24 #define _SETJMP_H       1
25
26 #include <features.h>
27
28 __BEGIN_DECLS
29
30 #include <bits/setjmp.h>                /* Get `__jmp_buf'.  */
31 #include <bits/sigset.h>                /* Get `__sigset_t'.  */
32
33 /* Calling environment, plus possibly a saved signal mask.  */
34 typedef struct __jmp_buf_tag    /* C++ doesn't like tagless structs.  */
35   {
36     /* NOTE: The machine-dependent definitions of `__sigsetjmp'
37        assume that a `jmp_buf' begins with a `__jmp_buf'.
38        Do not move this member or add others before it.  */
39     __jmp_buf __jmpbuf;         /* Calling environment.  */
40     int __mask_was_saved;       /* Saved the signal mask?  */
41     __sigset_t __saved_mask;    /* Saved signal mask.  */
42   } jmp_buf[1];
43
44
45 /* Store the calling environment in ENV, also saving the
46    signal mask if SAVEMASK is nonzero.  Return 0.
47    This is the internal name for `sigsetjmp'.  */
48 extern int __sigsetjmp __P ((jmp_buf __env, int __savemask));
49
50 #ifndef __FAVOR_BSD
51 /* Set ENV to the current position and return 0, not saving the signal mask.
52    This is just like `sigsetjmp (ENV, 0)'.
53    The ISO C standard says `setjmp' is a macro.  */
54 # define setjmp(env)    __sigsetjmp ((env), 0)
55 #else
56 /* We are in 4.3 BSD-compatibility mode in which `setjmp'
57    saves the signal mask like `sigsetjmp (ENV, 1)'.  */
58 # define setjmp(env)    __sigsetjmp ((env), 1)
59 #endif /* Favor BSD.  */
60
61 #if defined __USE_BSD || defined __USE_XOPEN
62 /* Set ENV to the current position and return 0, not saving the signal mask.
63    This is the 4.3 BSD name for ISO `setjmp'.  */
64 # define _setjmp(env)   __sigsetjmp ((env), 0)
65 #endif
66
67
68 /* Jump to the environment saved in ENV, making the
69    `setjmp' call there return VAL, or 1 if VAL is 0.  */
70 extern void longjmp __P ((jmp_buf __env, int __val))
71      __attribute__ ((__noreturn__));
72 #if defined __USE_BSD || defined __USE_XOPEN
73 /* Same.  Usually `_longjmp' is used with `_setjmp', which does not save
74    the signal mask.  But it is how ENV was saved that determines whether
75    `longjmp' restores the mask; `_longjmp' is just an alias.  */
76 extern void _longjmp __P ((jmp_buf __env, int __val))
77      __attribute__ ((__noreturn__));
78 #endif
79
80 /* Internal machine-dependent function to restore context sans signal mask.  */
81 extern void __longjmp __P ((__jmp_buf __env, int __val))
82      __attribute__ ((__noreturn__));
83
84 /* Internal function to possibly save the current mask of blocked signals
85    in ENV, and always set the flag saying whether or not it was saved.
86    This is used by the machine-dependent definition of `__sigsetjmp'.
87    Always returns zero, for convenience.  */
88 extern int __sigjmp_save __P ((jmp_buf __env, int __savemask));
89
90
91 #ifdef  __USE_POSIX
92 /* Use the same type for `jmp_buf' and `sigjmp_buf'.
93    The `__mask_was_saved' flag determines whether
94    or not `longjmp' will restore the signal mask.  */
95 typedef jmp_buf sigjmp_buf;
96
97 /* Store the calling environment in ENV, also saving the
98    signal mask if SAVEMASK is nonzero.  Return 0.  */
99 # define sigsetjmp(env, savemask)       __sigsetjmp ((env), (savemask))
100
101 /* Jump to the environment saved in ENV, making the
102    sigsetjmp call there return VAL, or 1 if VAL is 0.
103    Restore the signal mask if that sigsetjmp call saved it.
104    This is just an alias `longjmp'.  */
105 extern void siglongjmp __P ((sigjmp_buf __env, int __val))
106      __attribute__ ((__noreturn__));
107 #endif /* Use POSIX.  */
108
109 __END_DECLS
110
111 #endif /* setjmp.h  */