Rename newtestsuite to testsuite
[dyninst.git] / testsuite / src / dyninst / test_callback_1_mutatee.c
1 #include "mutatee_util.h"
2
3 /* Externally accessed function prototypes.  These must have globally unique
4  * names.  I suggest following the pattern <testname>_<function>
5  */
6
7 /* Global variables accessed by the mutator.  These must have globally unique
8  * names.
9  */
10
11 /* Internally used function prototypes.  These should be declared with the
12  * keyword static so they don't interfere with other mutatees in the group.
13  */
14
15 /* Global variables used internally by the mutatee.  These should be declared
16  * with the keyword static so they don't interfere with other mutatees in the
17  * group.
18  */
19
20 static int mutateeIdle = 0;
21
22 /* Function definitions follow */
23
24 /********************************************************************/
25 /********************************************************************/
26 /***********  Subtest 2:  dynamic callsites */
27 /********************************************************************/
28 /********************************************************************/
29
30 #define NUM_DYN_CALLS 8 
31 typedef int (*intFuncArg) (int);
32 int call2_zero() {return 0;}
33
34 int call2_1(int arg) {return arg+1;}
35 int call2_2(int arg) {return arg+2;}
36 int call2_3(int arg) {return arg+3;}
37 int call2_4(int arg) {return arg+4;}
38
39 int call2_dispatch(intFuncArg callme, int arg) 
40 {
41   /*dprintf("%s[%d]:  inside call2_dispatch\n", __FILE__, __LINE__);*/
42   static int callsite_selector = 0;
43   int ret = -1;
44   intFuncArg tocall = (intFuncArg) callme;
45
46   ret = call2_zero(); /* lets have a non-dynamic call site here too */
47
48   if (!tocall) {
49     logerror("%s[%d]:  FIXME!\n", __FILE__, __LINE__);
50     return -1;
51   }
52
53   /*  3 dynamic call sites */
54   switch (callsite_selector) {
55   case 0: ret = (tocall)(arg); callsite_selector++; break;
56   case 1: ret = (tocall)(arg+1); callsite_selector++; break;
57   case 2: ret = (tocall)(arg+2); callsite_selector = 0; break;
58   }
59
60   if (ret) 
61     ret = call2_zero(); /* lets have a non-dynamic call site here too */
62
63   return ret;
64
65 }
66
67 void func2_1()
68 {
69   /*  want to trigger a lot of dynamic calls, and then stop the process. */
70   /*  to make sure we test possible race in event handling. */
71
72   int nextfunc = 1;
73   unsigned int i;
74   for (i = 0; i < NUM_DYN_CALLS; ++i) {
75     switch (nextfunc) {
76     case 1: call2_dispatch(call2_1, i); nextfunc++; break;
77     case 2: call2_dispatch(call2_2, i); nextfunc++; break;
78     case 3: call2_dispatch(call2_3, i); nextfunc++; break;
79     case 4: call2_dispatch(call2_4, i); nextfunc = 1; break;
80     }; 
81   }
82   
83   mutateeIdle = 1;
84   while (mutateeIdle);
85 }
86
87 int test_callback_1_mutatee() {
88   func2_1();
89   return 0; /* Is this return code checked? */
90 }