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