]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/testsuite/gdb.threads/pthreads.c
Update years in copyright notice for the GDB files.
[thirdparty/binutils-gdb.git] / gdb / testsuite / gdb.threads / pthreads.c
1 /* Pthreads test program.
2 Copyright 1996-2013 Free Software Foundation, Inc.
3
4 Written by Fred Fish of Cygnus Support
5 Contributed by Cygnus Support
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <pthread.h>
25
26 /* Under OSF 2.0 & 3.0 and HPUX 10, the second arg of pthread_create
27 is prototyped to be just a "pthread_attr_t", while under Solaris it
28 is a "pthread_attr_t *". Arg! */
29
30 #if defined (__osf__) || defined (__hpux__)
31 #define PTHREAD_CREATE_ARG2(arg) arg
32 #define PTHREAD_CREATE_NULL_ARG2 null_attr
33 static pthread_attr_t null_attr;
34 #else
35 #define PTHREAD_CREATE_ARG2(arg) &arg
36 #define PTHREAD_CREATE_NULL_ARG2 NULL
37 #endif
38
39 static int verbose = 0;
40
41 static void
42 common_routine (arg)
43 int arg;
44 {
45 static int from_thread1;
46 static int from_thread2;
47 static int from_main;
48 static int hits;
49 static int full_coverage;
50
51 if (verbose) printf("common_routine (%d)\n", arg);
52 hits++;
53 switch (arg)
54 {
55 case 0:
56 from_main++;
57 break;
58 case 1:
59 from_thread1++;
60 break;
61 case 2:
62 from_thread2++;
63 break;
64 }
65 if (from_main && from_thread1 && from_thread2)
66 full_coverage = 1;
67 }
68
69 static void *
70 thread1 (void *arg)
71 {
72 int i;
73 int z = 0;
74
75 if (verbose) printf ("thread1 (%0lx) ; pid = %d\n", (long) arg, getpid ());
76 for (i=1; i <= 10000000; i++)
77 {
78 if (verbose) printf("thread1 %ld\n", (long) pthread_self ());
79 z += i;
80 common_routine (1);
81 sleep(1);
82 }
83 return (void *) 0;
84 }
85
86 static void *
87 thread2 (void * arg)
88 {
89 int i;
90 int k = 0;
91
92 if (verbose) printf ("thread2 (%0lx) ; pid = %d\n", (long) arg, getpid ());
93 for (i=1; i <= 10000000; i++)
94 {
95 if (verbose) printf("thread2 %ld\n", (long) pthread_self ());
96 k += i;
97 common_routine (2);
98 sleep(1);
99 }
100 sleep(100);
101 return (void *) 0;
102 }
103
104 void
105 foo (a, b, c)
106 int a, b, c;
107 {
108 int d, e, f;
109
110 if (verbose) printf("a=%d\n", a);
111 }
112
113 main(argc, argv)
114 int argc;
115 char **argv;
116 {
117 pthread_t tid1, tid2;
118 int j;
119 int t = 0;
120 void (*xxx) ();
121 pthread_attr_t attr;
122
123 if (verbose) printf ("pid = %d\n", getpid());
124
125 foo (1, 2, 3);
126
127 #ifndef __osf__
128 if (pthread_attr_init (&attr))
129 {
130 perror ("pthread_attr_init 1");
131 exit (1);
132 }
133 #endif
134
135 #ifdef PTHREAD_SCOPE_SYSTEM
136 if (pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM))
137 {
138 perror ("pthread_attr_setscope 1");
139 exit (1);
140 }
141 #endif
142
143 if (pthread_create (&tid1, PTHREAD_CREATE_ARG2(attr), thread1, (void *) 0xfeedface))
144 {
145 perror ("pthread_create 1");
146 exit (1);
147 }
148 if (verbose) printf ("Made thread %ld\n", (long) tid1);
149 sleep (1);
150
151 if (pthread_create (&tid2, PTHREAD_CREATE_NULL_ARG2, thread2, (void *) 0xdeadbeef))
152 {
153 perror ("pthread_create 2");
154 exit (1);
155 }
156 if (verbose) printf("Made thread %ld\n", (long) tid2);
157
158 sleep (1);
159
160 for (j = 1; j <= 10000000; j++)
161 {
162 if (verbose) printf("top %ld\n", (long) pthread_self ());
163 common_routine (0);
164 sleep(1);
165 t += j;
166 }
167
168 exit(0);
169 }
170