(root)/
glibc-2.38/
stdlib/
test-atexit-recursive.c
       1  /* Support file for atexit/exit, etc. race tests (BZ #27749).
       2     Copyright (C) 2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  /* Check that atexit handler registered from another handler still called. */
      20  
      21  #include <stdio.h>
      22  #include <stdlib.h>
      23  #include <support/check.h>
      24  #include <support/xunistd.h>
      25  #include <sys/wait.h>
      26  #include <unistd.h>
      27  
      28  static void
      29  atexit_cb (void)
      30  {
      31  }
      32  
      33  static void
      34  atexit_last (void)
      35  {
      36    _exit (1);
      37  }
      38  
      39  static void
      40  atexit_recursive (void)
      41  {
      42    atexit (&atexit_cb);
      43    atexit (&atexit_last);
      44  }
      45  
      46  _Noreturn static void
      47  test_and_exit (int count)
      48  {
      49    for (int i = 0; i < count; ++i)
      50      atexit (&atexit_cb);
      51    atexit (&atexit_recursive);
      52    exit (0);
      53  }
      54  
      55  static int
      56  do_test (void)
      57  {
      58    for (int i = 0; i < 100; ++i)
      59      if (xfork () == 0)
      60        test_and_exit (i);
      61  
      62    for (int i = 0; i < 100; ++i)
      63      {
      64        int status;
      65        xwaitpid (0, &status, 0);
      66        if (!WIFEXITED (status))
      67  	FAIL_EXIT1 ("Failed iterations %d", i);
      68        TEST_COMPARE (WEXITSTATUS (status), 1);
      69      }
      70  
      71    return 0;
      72  }
      73  
      74  #define TEST_FUNCTION do_test
      75  #include <support/test-driver.c>