(root)/
glibc-2.38/
stdlib/
exit.h
       1  /* Copyright (C) 1991-2023 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  
      25  enum
      26  {
      27    ef_free,	/* `ef_free' MUST be zero!  */
      28    ef_us,
      29    ef_on,
      30    ef_at,
      31    ef_cxa
      32  };
      33  
      34  struct 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    };
      55  struct exit_function_list
      56    {
      57      struct exit_function_list *next;
      58      size_t idx;
      59      struct exit_function fns[32];
      60    };
      61  
      62  extern struct exit_function_list *__exit_funcs attribute_hidden;
      63  extern struct exit_function_list *__quick_exit_funcs attribute_hidden;
      64  extern uint64_t __new_exitfn_called attribute_hidden;
      65  
      66  /* True once all registered atexit/at_quick_exit/onexit handlers have been
      67     called */
      68  extern 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  
      80  extern struct exit_function *__new_exitfn (struct exit_function_list **listp)
      81    attribute_hidden;
      82  
      83  extern 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  
      88  extern int __internal_atexit (void (*func) (void *), void *arg, void *d,
      89  			      struct exit_function_list **listp)
      90    attribute_hidden;
      91  extern int __cxa_at_quick_exit (void (*func) (void *), void *d);
      92  
      93  
      94  #endif	/* exit.h  */