]> git.ipfire.org Git - thirdparty/bash.git/blobdiff - unwind_prot.h
updates for nofork command substitution; changes for z/OS machines; fix for race...
[thirdparty/bash.git] / unwind_prot.h
index a321f0eea8520c5f2095b4c840ad140e05202060..3236f2949db202069a6af44a11c82ec36c6c3749 100644 (file)
@@ -1,67 +1,60 @@
 /* unwind_prot.h - Macros and functions for hacking unwind protection. */
 
-/* Copyright (C) 1993 Free Software Foundation, Inc.
+/* Copyright (C) 1993-2023 Free Software Foundation, Inc.
 
    This file is part of GNU Bash, the Bourne Again SHell.
 
-   Bash is free software; you can redistribute it and/or modify it under
-   the terms of the GNU General Public License as published by the Free
-   Software Foundation; either version 2, or (at your option) any later
-   version.
+   Bash is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
 
-   Bash is distributed in the hope that it will be useful, but WITHOUT ANY
-   WARRANTY; without even the implied warranty of MERCHANTABILITY or
-   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-   for more details.
+   Bash is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
-   You should have received a copy of the GNU General Public License along
-   with Bash; see the file COPYING.  If not, write to the Free Software
-   Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+   You should have received a copy of the GNU General Public License
+   along with Bash.  If not, see <http://www.gnu.org/licenses/>.
+*/
 
 #if !defined (_UNWIND_PROT_H)
 #define _UNWIND_PROT_H
 
-/* Run a function without interrupts. */
-extern void begin_unwind_frame ();
-extern void discard_unwind_frame ();
-extern void run_unwind_frame ();
-extern void add_unwind_protect ();
-extern void remove_unwind_protect ();
-extern void run_unwind_protects ();
-extern void unwind_protect_var ();
+/* Generic function type void (*) (void *) for all unwind cleanups. A
+   cleanup function does not return a value and takes a single generic
+   pointer argument. This type works fine for arbitrary pointers; if a
+   cleanup function needs to take an int argument, it's passed through
+   a cast to intptr_t, an integer type that's safe to convert to and
+   from a pointer. */
+typedef void sh_uwfunc_t (void *);
+
+extern void uwp_init (void);
 
-/* Try to force correct alignment on machines where pointers and ints
-   differ in size. */
-typedef union {
-  char *s;
-  int i;
-} UWP;
+/* Run a function without interrupts. */
+extern void begin_unwind_frame (char *);
+extern void discard_unwind_frame (char *);
+extern void run_unwind_frame (char *);
+extern void add_unwind_protect (sh_uwfunc_t *, void *);
+extern void remove_unwind_protect (void);
+extern void run_unwind_protects (void);
+extern void clear_unwind_protect_list (int);
+extern int have_unwind_protects (void);
+extern int unwind_protect_tag_on_stack (const char *);
 
 /* Define for people who like their code to look a certain way. */
 #define end_unwind_frame()
 
-/* How to protect an integer. */
-#define unwind_protect_int(X) \
-       do \
-         { \
-           UWP u; \
-           u.i = (X); \
-           unwind_protect_var (&(X), u.s, sizeof (int)); \
-         } \
-       while (0)
-
-#define unwind_protect_short(X) \
-  unwind_protect_var ((int *)&(X), (char *)&(X), sizeof (short))
-
-/* How to protect a pointer to a string. */
-#define unwind_protect_string(X) \
-  unwind_protect_var ((int *)&(X), (X), sizeof (char *))
+/* How to protect a variable.  */
+#define unwind_protect_var(X) unwind_protect_mem ((char *)&(X), sizeof (X))
 
-/* How to protect any old pointer. */
-#define unwind_protect_pointer(X) unwind_protect_string (X)
+extern void unwind_protect_mem (char *, int);
 
-/* How to protect the contents of a jmp_buf. */
-#define unwind_protect_jmp_buf(X) \
-  unwind_protect_var ((int *)(X), (char *)(X), sizeof (procenv_t))
+/* Backwards compatibility */
+#define unwind_protect_int     unwind_protect_var
+#define unwind_protect_short   unwind_protect_var
+#define unwind_protect_string  unwind_protect_var
+#define unwind_protect_pointer unwind_protect_var
+#define unwind_protect_jmp_buf unwind_protect_var
 
 #endif /* _UNWIND_PROT_H */