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