master
 1/* Copyright (C) 1991-2025 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 Lesser General Public
 6   License as published by the Free Software Foundation; either
 7   version 2.1 of the 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   Lesser General Public License for more details.
13
14   You should have received a copy of the GNU Lesser General Public
15   License along with the GNU C Library; if not, see
16   <https://www.gnu.org/licenses/>.  */
17
18#ifndef	_EXIT_H
19#define _EXIT_H 1
20
21#include <stdbool.h>
22#include <stdint.h>
23#include <libc-lock.h>
24
25enum
26{
27  ef_free,	/* `ef_free' MUST be zero!  */
28  ef_us,
29  ef_on,
30  ef_at,
31  ef_cxa
32};
33
34struct exit_function
35  {
36    /* `flavour' should be of type of the `enum' above but since we need
37       this element in an atomic operation we have to use `long int'.  */
38    long int flavor;
39    union
40      {
41	void (*at) (void);
42	struct
43	  {
44	    void (*fn) (int status, void *arg);
45	    void *arg;
46	  } on;
47	struct
48	  {
49	    void (*fn) (void *arg, int status);
50	    void *arg;
51	    void *dso_handle;
52	  } cxa;
53      } func;
54  };
55struct exit_function_list
56  {
57    struct exit_function_list *next;
58    size_t idx;
59    struct exit_function fns[32];
60  };
61
62extern struct exit_function_list *__exit_funcs attribute_hidden;
63extern struct exit_function_list *__quick_exit_funcs attribute_hidden;
64extern uint64_t __new_exitfn_called attribute_hidden;
65
66/* True once all registered atexit/at_quick_exit/onexit handlers have been
67   called */
68extern bool __exit_funcs_done attribute_hidden;
69
70/* This lock protects __exit_funcs, __quick_exit_funcs, __exit_funcs_done
71   and __new_exitfn_called globals against simultaneous access from
72   atexit/on_exit/at_quick_exit in multiple threads, and also from
73   simultaneous access while another thread is in the middle of calling
74   exit handlers.  See BZ#14333.  Note: for lists, the entire list, and
75   each associated entry in the list, is protected for all access by this
76   lock.  */
77__libc_lock_define (extern, __exit_funcs_lock);
78
79
80extern struct exit_function *__new_exitfn (struct exit_function_list **listp)
81  attribute_hidden;
82
83extern void __run_exit_handlers (int status,
84				 struct exit_function_list **listp,
85				 bool run_list_atexit, bool run_dtors)
86  attribute_hidden __attribute__ ((__noreturn__));
87
88extern int __internal_atexit (void (*func) (void *), void *arg, void *d,
89			      struct exit_function_list **listp)
90  attribute_hidden;
91extern int __cxa_at_quick_exit (void (*func) (void *), void *d);
92
93
94#endif	/* exit.h  */