Update copyright to LGPL on all files
[dyninst.git] / testsuite / src / dyninst / test_callback_1_mutatee.c
1 /*
2  * Copyright (c) 1996-2009 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as "Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * By your use of Paradyn, you understand and agree that we (or any
12  * other person or entity with proprietary rights in Paradyn) are
13  * under no obligation to provide either maintenance services,
14  * update services, notices of latent defects, or correction of
15  * defects for Paradyn.
16  * 
17  * This library is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU Lesser General Public
19  * License as published by the Free Software Foundation; either
20  * version 2.1 of the License, or (at your option) any later version.
21  * 
22  * This library is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25  * Lesser General Public License for more details.
26  * 
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with this library; if not, write to the Free Software
29  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30  */
31 #include "mutatee_util.h"
32
33 /* Externally accessed function prototypes.  These must have globally unique
34  * names.  I suggest following the pattern <testname>_<function>
35  */
36
37 /* Global variables accessed by the mutator.  These must have globally unique
38  * names.
39  */
40
41 /* Internally used function prototypes.  These should be declared with the
42  * keyword static so they don't interfere with other mutatees in the group.
43  */
44
45 /* Global variables used internally by the mutatee.  These should be declared
46  * with the keyword static so they don't interfere with other mutatees in the
47  * group.
48  */
49
50 static int mutateeIdle = 0;
51
52 /* Function definitions follow */
53
54 /********************************************************************/
55 /********************************************************************/
56 /***********  Subtest 2:  dynamic callsites */
57 /********************************************************************/
58 /********************************************************************/
59
60 #define NUM_DYN_CALLS 8 
61 typedef int (*intFuncArg) (int);
62 int call2_zero() {return 0;}
63
64 int call2_1(int arg) {return arg+1;}
65 int call2_2(int arg) {return arg+2;}
66 int call2_3(int arg) {return arg+3;}
67 int call2_4(int arg) {return arg+4;}
68
69 int call2_dispatch(intFuncArg callme, int arg) 
70 {
71   /*dprintf("%s[%d]:  inside call2_dispatch\n", __FILE__, __LINE__);*/
72   static int callsite_selector = 0;
73   int ret = -1;
74   intFuncArg tocall = (intFuncArg) callme;
75
76   ret = call2_zero(); /* lets have a non-dynamic call site here too */
77
78   if (!tocall) {
79     logerror("%s[%d]:  FIXME!\n", __FILE__, __LINE__);
80     return -1;
81   }
82
83   /*  3 dynamic call sites */
84   switch (callsite_selector) {
85   case 0: ret = (tocall)(arg); callsite_selector++; break;
86   case 1: ret = (tocall)(arg+1); callsite_selector++; break;
87   case 2: ret = (tocall)(arg+2); callsite_selector = 0; break;
88   }
89
90   if (ret) 
91     ret = call2_zero(); /* lets have a non-dynamic call site here too */
92
93   return ret;
94
95 }
96
97 void func2_1()
98 {
99   /*  want to trigger a lot of dynamic calls, and then stop the process. */
100   /*  to make sure we test possible race in event handling. */
101
102   int nextfunc = 1;
103   unsigned int i;
104   for (i = 0; i < NUM_DYN_CALLS; ++i) {
105     switch (nextfunc) {
106     case 1: call2_dispatch(call2_1, i); nextfunc++; break;
107     case 2: call2_dispatch(call2_2, i); nextfunc++; break;
108     case 3: call2_dispatch(call2_3, i); nextfunc++; break;
109     case 4: call2_dispatch(call2_4, i); nextfunc = 1; break;
110     }; 
111   }
112   
113   mutateeIdle = 1;
114   while (mutateeIdle);
115 }
116
117 int test_callback_1_mutatee() {
118   func2_1();
119   return 0; /* Is this return code checked? */
120 }