]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/testsuite/gdb.threads/pthreads.c
2002-02-24 Michael Chastain <mec@shout.net>
[thirdparty/binutils-gdb.git] / gdb / testsuite / gdb.threads / pthreads.c
1 #include <stdio.h>
2
3 #include "config.h"
4
5 #ifndef HAVE_PTHREAD_H
6
7 /* Don't even try to compile. In fact, cause a syntax error that we can
8 look for as a compiler error message and know that we have no pthread
9 support. In that case we can just suppress the test completely. */
10
11 #error "no posix threads support"
12
13 #else
14
15 /* OK. We have the right header. If we try to compile this and fail, then
16 there is something wrong and the user should know about it so the testsuite
17 should issue an ERROR result.. */
18
19 #ifdef __linux__
20 #define _MIT_POSIX_THREADS 1 /* Linux (or at least RedHat 4.0) needs this */
21 #endif
22
23 #include <pthread.h>
24
25 /* Under OSF 2.0 & 3.0 and HPUX 10, the second arg of pthread_create
26 is prototyped to be just a "pthread_attr_t", while under Solaris it
27 is a "pthread_attr_t *". Arg! */
28
29 #if defined (__osf__) || defined (__hpux__)
30 #define PTHREAD_CREATE_ARG2(arg) arg
31 #define PTHREAD_CREATE_NULL_ARG2 null_attr
32 static pthread_attr_t null_attr;
33 #else
34 #define PTHREAD_CREATE_ARG2(arg) &arg
35 #define PTHREAD_CREATE_NULL_ARG2 NULL
36 #endif
37
38 static int verbose = 0;
39
40 static void
41 common_routine (arg)
42 int arg;
43 {
44 static int from_thread1;
45 static int from_thread2;
46 static int from_main;
47 static int hits;
48 static int full_coverage;
49
50 if (verbose) printf("common_routine (%d)\n", arg);
51 hits++;
52 switch (arg)
53 {
54 case 0:
55 from_main++;
56 break;
57 case 1:
58 from_thread1++;
59 break;
60 case 2:
61 from_thread2++;
62 break;
63 }
64 if (from_main && from_thread1 && from_thread2)
65 full_coverage = 1;
66 }
67
68 static void *
69 thread1 (void *arg)
70 {
71 int i;
72 int z = 0;
73
74 if (verbose) printf ("thread1 (%0x) ; pid = %d\n", arg, getpid ());
75 for (i=1; i <= 10000000; i++)
76 {
77 if (verbose) printf("thread1 %d\n", pthread_self ());
78 z += i;
79 common_routine (1);
80 sleep(1);
81 }
82 return (void *) 0;
83 }
84
85 static void *
86 thread2 (void * arg)
87 {
88 int i;
89 int k = 0;
90
91 if (verbose) printf ("thread2 (%0x) ; pid = %d\n", arg, getpid ());
92 for (i=1; i <= 10000000; i++)
93 {
94 if (verbose) printf("thread2 %d\n", pthread_self ());
95 k += i;
96 common_routine (2);
97 sleep(1);
98 }
99 sleep(100);
100 return (void *) 0;
101 }
102
103 void
104 foo (a, b, c)
105 int a, b, c;
106 {
107 int d, e, f;
108
109 if (verbose) printf("a=%d\n", a);
110 }
111
112 main(argc, argv)
113 int argc;
114 char **argv;
115 {
116 pthread_t tid1, tid2;
117 int j;
118 int t = 0;
119 void (*xxx) ();
120 pthread_attr_t attr;
121
122 if (verbose) printf ("pid = %d\n", getpid());
123
124 foo (1, 2, 3);
125
126 #ifndef __osf__
127 if (pthread_attr_init (&attr))
128 {
129 perror ("pthread_attr_init 1");
130 exit (1);
131 }
132 #endif
133
134 #ifdef PTHREAD_SCOPE_SYSTEM
135 if (pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM))
136 {
137 perror ("pthread_attr_setscope 1");
138 exit (1);
139 }
140 #endif
141
142 if (pthread_create (&tid1, PTHREAD_CREATE_ARG2(attr), thread1, (void *) 0xfeedface))
143 {
144 perror ("pthread_create 1");
145 exit (1);
146 }
147 if (verbose) printf ("Made thread %d\n", tid1);
148 sleep (1);
149
150 if (pthread_create (&tid2, PTHREAD_CREATE_NULL_ARG2, thread2, (void *) 0xdeadbeef))
151 {
152 perror ("pthread_create 2");
153 exit (1);
154 }
155 if (verbose) printf("Made thread %d\n", tid2);
156
157 sleep (1);
158
159 for (j = 1; j <= 10000000; j++)
160 {
161 if (verbose) printf("top %d\n", pthread_self ());
162 common_routine (0);
163 sleep(1);
164 t += j;
165 }
166
167 exit(0);
168 }
169
170 #endif /* ifndef HAVE_PTHREAD_H */