xref: /openbsd-src/gnu/usr.bin/binutils/gdb/testsuite/gdb.threads/pthreads.c (revision 63addd46c1e40ca0f49488ddcdc4ab598023b0c1)
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