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 33static pthread_attr_t null_attr; 34#else 35#define PTHREAD_CREATE_ARG2(arg) &arg 36#define PTHREAD_CREATE_NULL_ARG2 NULL 37#endif 38 39static int verbose = 0; 40 41static void 42common_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 69static void * 70thread1 (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 86static void * 87thread2 (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 104void 105foo (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 113main(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 171