Update copyright to LGPL on all files
[dyninst.git] / dyninstAPI / tests / src / test13.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 <sys/types.h>
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <string.h>
35 #include <pthread.h>
36 #include <unistd.h>
37
38 #ifdef __cplusplus
39 int mutateeCplusplus = 1;
40 #else
41 int mutateeCplusplus = 0;
42 #endif
43
44 #ifndef COMPILER
45 #define COMPILER ""
46 #endif
47 const char *Builder_id=COMPILER; /* defined on compile line */
48
49 #define NTHRD 4
50 volatile int done;
51 volatile int proc_current_state;
52
53 void *init_func(void *arg)
54 {
55    while (!done);
56    return arg;
57 }
58
59 int attached_fd;
60 void parse_args(int argc, char *argv[])
61 {
62    int i;
63    for (i=0; i<argc; i++)
64    {
65       if (strstr(argv[i], "-attach"))
66       {
67          if (++i == argc) break;
68          attached_fd = atoi(argv[i]);
69       }
70    }
71 }
72
73 int isAttached = 0;
74 /* Check to see if the mutator has attached to us. */
75 int checkIfAttached()
76 {
77     return isAttached;
78 }
79
80 int main(int argc, char *argv[])
81 {
82    unsigned i;
83    char c = 'T';
84    pthread_t threads[NTHRD];
85    pthread_attr_t attr;
86
87    void *ret_val;
88
89    if(argc == 1) {
90       printf("Mutatee %s [%s]:\"%s\"\n", argv[0], 
91              mutateeCplusplus ? "C++" : "C", Builder_id);
92       return 0;
93    }
94
95    pthread_attr_init(&attr);
96    pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
97
98    parse_args(argc, argv);
99
100    for (i=0; i<NTHRD; i++)
101    {
102       pthread_create(&threads[i], &attr, init_func, (void *) i);
103    }
104    
105    if (attached_fd) {
106       if (write(attached_fd, &c, sizeof(char)) != sizeof(char)) {
107          fprintf(stderr, "*ERROR*: Writing to pipe\n");
108          exit(-1);
109       }
110       close(attached_fd);
111       printf("Waiting for mutator to attach...\n");
112       while (!checkIfAttached()) ;
113       printf("Mutator attached.  Mutatee continuing.\n");
114    }
115
116    fprintf(stderr, "[%s:%d]: stage 1 - all threads created\n", __FILE__, __LINE__);
117
118    while (proc_current_state == 0) sched_yield();
119
120    fprintf(stderr, "[%s:%d]: stage 2 - allowing threads to exit\n", __FILE__, __LINE__);
121    done = 1;
122
123    for (i=0; i<NTHRD; i++)
124    {
125       pthread_join(threads[i], &ret_val);
126    }
127    fprintf(stderr, "[%s:%d]: stage 3 - all threads joined\n", __FILE__, __LINE__);
128    return 0;
129 }