Update copyright to LGPL on all files
[dyninst.git] / testsuite / src / dyninst / test_thread_6_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
36 #include "mutatee_util.h"
37
38 #if !defined(os_windows_test)
39 #include <unistd.h>
40 #else
41 #include <windows.h>
42 #endif
43
44 #define NTHRD 4
45
46 volatile int done;
47 volatile int proc_current_state;
48 volatile int threads_running[NTHRD];
49
50 void *init_func(void *arg)
51 {
52    threads_running[(int) (long) arg] = 1;
53    while (!done);
54    return arg;
55 }
56
57 /* int main(int argc, char *argv[]) */
58 int test_thread_6_mutatee() {
59    unsigned i;
60    thread_t threads[NTHRD];
61    int startedall = 0;
62
63 #ifndef os_windows_test
64    char c = 'T';
65 #endif
66
67    /* initThreads() has an empty function body? */
68    initThreads();
69
70    for (i=0; i<NTHRD; i++)  {
71        threads[i] = spawnNewThread((void *) init_func, (void *) i);
72    }
73
74    while (!startedall) {
75       for (i=0; i<NTHRD; i++) {
76          startedall = 1;
77          if (!threads_running[i]) {
78             startedall = 0;
79             P_sleep(1);
80             break;
81          }
82       }
83    }
84
85    /* Hmm..  So in attach mode we create all the threads before waiting for
86     * the mutator to attach, but in create mode we (by necessity) create all
87     * the threads after the mutator has attached (and let us run..)
88     * And this test runs in both create and attach modes...
89     * I'm going to strip out this attach mode handling and see if it works
90     * alright when I let the mutatee driver handle it.
91     */
92    /* FIXME Remove this cruft */
93 #if 0
94 #ifndef os_windows_test
95    if (attached_fd) {
96       if (write(attached_fd, &c, sizeof(char)) != sizeof(char)) {
97          output->log(STDERR, "*ERROR*: Writing to pipe\n");
98          exit(-1);
99       }
100       close(attached_fd);
101       while (!checkIfAttached()) {
102          usleep(1);
103       }
104    }
105 #else
106    if (attached_fd)
107       while (!checkIfAttached());
108 #endif
109 #endif
110
111    logstatus("[%s:%d]: stage 1 - all threads created\n", __FILE__, __LINE__);
112    while (proc_current_state == 0) {
113      /* Do nothing */
114    }
115    logstatus("[%s:%d]: stage 2 - allowing threads to exit\n", __FILE__, __LINE__);
116    done = 1;
117    for (i=0; i<NTHRD; i++)
118    {
119       joinThread(threads[i]);
120    }
121    logstatus("[%s:%d]: stage 3 - all threads joined\n", __FILE__, __LINE__);
122    /* Is the return value of this mutatee checked?  Doesn't look like it */
123    return 0;
124 }