source: vendor/glibc-tests/glibc/nptl/tst-atfork1.c

Last change on this file was 2036, checked in by bird, 20 years ago

Initial revision

  • Property cvs2svn:cvs-rev set to 1.1
  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 2.1 KB
Line 
1/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
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
16 License along with the GNU C Library; if not, write to the Free
17 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18 02111-1307 USA. */
19
20#include <errno.h>
21#include <pthread.h>
22#include <stdio.h>
23#include <stdlib.h>
24#include <unistd.h>
25#include <sys/wait.h>
26
27
28static int val;
29
30
31static void
32prepare1 (void)
33{
34 val *= 2;
35}
36
37static void
38prepare2 (void)
39{
40 ++val;
41}
42
43static void
44parent1 (void)
45{
46 val += 4;
47}
48
49static void
50parent2 (void)
51{
52 val *= 4;
53}
54
55static void
56child1 (void)
57{
58 val += 8;
59}
60
61static void
62child2 (void)
63{
64 val *= 8;
65}
66
67
68static int
69do_test (void)
70{
71 pid_t pid;
72 int status = 0;
73
74 if (pthread_atfork (prepare1, parent1, child1) != 0)
75 {
76 puts ("1st atfork failed");
77 exit (1);
78 }
79 if (pthread_atfork (prepare2, parent2, child2) != 0)
80 {
81 puts ("2nd atfork failed");
82 exit (1);
83 }
84
85 pid = fork ();
86 if (pid == -1)
87 {
88 puts ("fork failed");
89 exit (1);
90 }
91
92 if (pid != 0)
93 {
94 /* Parent. */
95 if (val != 24)
96 {
97 printf ("expected val=%d, got %d\n", 24, val);
98 exit (1);
99 }
100
101 if (TEMP_FAILURE_RETRY (waitpid (pid, &status, 0)) != pid)
102 {
103 puts ("waitpid failed");
104 exit (1);
105 }
106 }
107 else
108 {
109 /* Child. */
110 if (val != 80)
111 {
112 printf ("expected val=%d, got %d\n", 80, val);
113 exit (2);
114 }
115 }
116
117 return status;
118}
119
120#define TEST_FUNCTION do_test ()
121#include "../test-skeleton.c"
Note: See TracBrowser for help on using the repository browser.