xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/testsuite/gdb.threads/pthreads.c (revision d909946ca08dceb44d7d0f22ec9488679695d976)
1 /* Pthreads test program.
2    Copyright 1996-2015 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 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 (__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   if (pthread_attr_init (&attr))
128     {
129       perror ("pthread_attr_init 1");
130       exit (1);
131     }
132 
133 #ifdef PTHREAD_SCOPE_SYSTEM
134   if (pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM))
135     {
136       perror ("pthread_attr_setscope 1");
137       exit (1);
138     }
139 #endif
140 
141   if (pthread_create (&tid1, PTHREAD_CREATE_ARG2(attr), thread1, (void *) 0xfeedface))
142     {
143       perror ("pthread_create 1");
144       exit (1);
145     }
146   if (verbose) printf ("Made thread %ld\n", (long) tid1);
147   sleep (1);
148 
149   if (pthread_create (&tid2, PTHREAD_CREATE_NULL_ARG2, thread2, (void *) 0xdeadbeef))
150     {
151       perror ("pthread_create 2");
152       exit (1);
153     }
154   if (verbose) printf("Made thread %ld\n", (long) tid2);
155 
156   sleep (1);
157 
158   for (j = 1; j <= 10000000; j++)
159     {
160       if (verbose) printf("top %ld\n", (long) pthread_self ());
161       common_routine (0);
162       sleep(1);
163       t += j;
164     }
165 
166   exit(0);
167 }
168 
169