1/* Pthreads test program.
2   Copyright 1996, 2002, 2003, 2004, 2007, 2008, 2009, 2010, 2011
3   Free Software Foundation, Inc.
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
12   the Free Software Foundation; either version 3 of the License, or
13   (at your option) any later version.
14
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.
19
20   You should have received a copy of the GNU General Public License
21   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
22
23#include <stdio.h>
24#include <stdlib.h>
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
76  if (verbose) printf ("thread1 (%0lx) ; pid = %d\n", (long) arg, getpid ());
77  for (i=1; i <= 10000000; i++)
78    {
79      if (verbose) printf("thread1 %ld\n", (long) pthread_self ());
80      z += i;
81      common_routine (1);
82      sleep(1);
83    }
84  return (void *) 0;
85}
86
87static void *
88thread2 (void * arg)
89{
90  int i;
91  int k = 0;
92
93  if (verbose) printf ("thread2 (%0lx) ; pid = %d\n", (long) arg, getpid ());
94  for (i=1; i <= 10000000; i++)
95    {
96      if (verbose) printf("thread2 %ld\n", (long) pthread_self ());
97      k += i;
98      common_routine (2);
99      sleep(1);
100    }
101  sleep(100);
102  return (void *) 0;
103}
104
105void
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    }
149  if (verbose) printf ("Made thread %ld\n", (long) tid1);
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    }
157  if (verbose) printf("Made thread %ld\n", (long) tid2);
158
159  sleep (1);
160
161  for (j = 1; j <= 10000000; j++)
162    {
163      if (verbose) printf("top %ld\n", (long) pthread_self ());
164      common_routine (0);
165      sleep(1);
166      t += j;
167    }
168
169  exit(0);
170}
171
172