OSDN Git Service

Switch the license of all .c files to GPLv3.
[pf3gnuchains/pf3gnuchains3x.git] / gdb / testsuite / gdb.threads / pthreads.c
1 /* Pthreads test program.
2    Copyright 1996, 2002, 2003, 2004, 2007 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 (%0x) ; pid = %d\n", arg, getpid ());
76   for (i=1; i <= 10000000; i++)
77     {
78       if (verbose) printf("thread1 %d\n", 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 (%0x) ; pid = %d\n", arg, getpid ());
93   for (i=1; i <= 10000000; i++)
94     {
95       if (verbose) printf("thread2 %d\n", 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 %d\n", 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 %d\n", tid2);
157
158   sleep (1);
159
160   for (j = 1; j <= 10000000; j++)
161     {
162       if (verbose) printf("top %d\n", pthread_self ());
163       common_routine (0);
164       sleep(1);
165       t += j;
166     }
167   
168   exit(0);
169 }
170