Rename newtestsuite to testsuite
[dyninst.git] / testsuite / src / dyninst / test4_2_mutatee.c
1 #include <stdlib.h>
2
3 #include "mutatee_util.h"
4
5 /* Externally accessed function prototypes.  These must have globally unique
6  * names.  I suggest following the pattern <testname>_<function>
7  */
8
9 void test4_2_func2();
10 void test4_2_func3();
11 void test4_2_func4();
12
13 /* Global variables accessed by the mutator.  These must have globally unique
14  * names.
15  */
16
17 unsigned int test4_2_global1 = 0xdeadbeef;
18
19 /* Internally used function prototypes.  These should be declared with the
20  * keyword static so they don't interfere with other mutatees in the group.
21  */
22
23 /* Global variables used internally by the mutatee.  These should be declared
24  * with the keyword static so they don't interfere with other mutatees in the
25  * group.
26  */
27
28 /* Function definitions follow */
29
30 /* should be called by parent */
31 void test4_2_func3() {
32     dprintf("pid %d in test4_2_func3\n", (int) getpid());
33     test4_2_global1 = 2000002;
34 }
35
36 /* should be called by child */
37 void test4_2_func4() {
38     dprintf("pid %d in test4_2_func4\n", (int) getpid());
39     test4_2_global1 = 2000003;
40 }
41
42 void test4_2_func2() {
43     /* if we get this value at exit, no function was called */
44     test4_2_global1 = 2000001;
45 }
46
47 int test4_2_mutatee() {
48 #ifndef os_windows_test
49     int pid;
50
51     pid = fork();
52     dprintf("fork result: %d\n", pid);
53
54     if (pid > 0) {
55       registerPID(pid); /* Register for cleanup */
56     }
57
58     if (pid >= 0) {
59        /* both parent and child exit here */
60        test4_2_func2();
61        dprintf("at exit of %d, test4_2_global1 = %d\n", (int) getpid(),
62                test4_2_global1);
63        
64 #if defined(rs6000_ibm_aix4_1_test)
65        if( pid == 0){
66           /* On AIX the child dies when the parent exits, so wait */
67           /* apparently the parent needs to wake up occasionally to keep Dyninst happy */
68           dprintf("%d SLEEPING\n",getpid());
69           sleep(5);
70           dprintf("%d SLEEP MORE\n",getpid());
71           sleep(1);
72           dprintf("%d SLEEP MORE\n",getpid());
73           sleep(5);
74           dprintf("%d DONE SLEEPING\n",getpid());
75        }
76 #endif
77         
78        dprintf("Mutatee %d exiting...\n", getpid());
79        exit(getpid());
80     } else if (pid < 0) {
81        /* error case */
82        exit(pid);
83     }
84 #endif
85     return 0; /* No error, technically.  Shouldn't get here */
86 }