]> git.ipfire.org Git - thirdparty/glibc.git/blame - nptl/tst-atfork1.c
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / nptl / tst-atfork1.c
CommitLineData
04277e02 1/* Copyright (C) 2002-2019 Free Software Foundation, Inc.
76a50749
UD
2 This file is part of the GNU C Library.
3 Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
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
59ba27a6
PE
16 License along with the GNU C Library; if not, see
17 <http://www.gnu.org/licenses/>. */
76a50749 18
dfdd294a 19#include <errno.h>
76a50749
UD
20#include <pthread.h>
21#include <stdio.h>
22#include <stdlib.h>
23#include <unistd.h>
dfdd294a 24#include <sys/wait.h>
76a50749
UD
25
26
27static int val;
28
29
30static void
31prepare1 (void)
32{
33 val *= 2;
34}
35
36static void
37prepare2 (void)
38{
39 ++val;
40}
41
42static void
43parent1 (void)
44{
45 val += 4;
46}
47
48static void
49parent2 (void)
50{
51 val *= 4;
52}
53
54static void
55child1 (void)
56{
57 val += 8;
58}
59
60static void
61child2 (void)
62{
63 val *= 8;
64}
65
66
67static int
68do_test (void)
69{
70 pid_t pid;
dfdd294a 71 int status = 0;
76a50749
UD
72
73 if (pthread_atfork (prepare1, parent1, child1) != 0)
74 {
75 puts ("1st atfork failed");
76 exit (1);
77 }
78 if (pthread_atfork (prepare2, parent2, child2) != 0)
79 {
80 puts ("2nd atfork failed");
81 exit (1);
82 }
83
84 pid = fork ();
85 if (pid == -1)
86 {
87 puts ("fork failed");
88 exit (1);
89 }
90
91 if (pid != 0)
92 {
93 /* Parent. */
94 if (val != 24)
95 {
96 printf ("expected val=%d, got %d\n", 24, val);
97 exit (1);
98 }
dfdd294a
UD
99
100 if (TEMP_FAILURE_RETRY (waitpid (pid, &status, 0)) != pid)
101 {
102 puts ("waitpid failed");
103 exit (1);
104 }
76a50749
UD
105 }
106 else
107 {
108 /* Child. */
109 if (val != 80)
110 {
111 printf ("expected val=%d, got %d\n", 80, val);
dfdd294a 112 exit (2);
76a50749
UD
113 }
114 }
115
dfdd294a 116 return status;
76a50749
UD
117}
118
119#define TEST_FUNCTION do_test ()
120#include "../test-skeleton.c"