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