(root)/
glibc-2.38/
sysdeps/
pthread/
tst-atfork1.c
       1  /* Copyright (C) 2002-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  #include <errno.h>
      19  #include <pthread.h>
      20  #include <stdio.h>
      21  #include <stdlib.h>
      22  #include <unistd.h>
      23  #include <sys/wait.h>
      24  
      25  
      26  static int val;
      27  
      28  
      29  static void
      30  prepare1 (void)
      31  {
      32    val *= 2;
      33  }
      34  
      35  static void
      36  prepare2 (void)
      37  {
      38    ++val;
      39  }
      40  
      41  static void
      42  parent1 (void)
      43  {
      44    val += 4;
      45  }
      46  
      47  static void
      48  parent2 (void)
      49  {
      50    val *= 4;
      51  }
      52  
      53  static void
      54  child1 (void)
      55  {
      56    val += 8;
      57  }
      58  
      59  static void
      60  child2 (void)
      61  {
      62    val *= 8;
      63  }
      64  
      65  
      66  static int
      67  do_test (void)
      68  {
      69    pid_t pid;
      70    int status = 0;
      71  
      72    if (pthread_atfork (prepare1, parent1, child1) != 0)
      73      {
      74        puts ("1st atfork failed");
      75        exit (1);
      76      }
      77    if (pthread_atfork (prepare2, parent2, child2) != 0)
      78      {
      79        puts ("2nd atfork failed");
      80        exit (1);
      81      }
      82  
      83    pid = fork ();
      84    if (pid == -1)
      85      {
      86        puts ("fork failed");
      87        exit (1);
      88      }
      89  
      90    if (pid != 0)
      91      {
      92        /* Parent.  */
      93        if (val != 24)
      94  	{
      95  	  printf ("expected val=%d, got %d\n", 24, val);
      96  	  exit (1);
      97  	}
      98  
      99        if (TEMP_FAILURE_RETRY (waitpid (pid, &status, 0)) != pid)
     100  	{
     101  	  puts ("waitpid failed");
     102  	  exit (1);
     103  	}
     104      }
     105    else
     106      {
     107        /* Child.  */
     108        if (val != 80)
     109  	{
     110  	  printf ("expected val=%d, got %d\n", 80, val);
     111  	  exit (2);
     112  	}
     113      }
     114  
     115    return status;
     116  }
     117  
     118  #define TEST_FUNCTION do_test ()
     119  #include "../test-skeleton.c"