1 /* Pthreads test program. 2 Copyright 1996-2015 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 #include <unistd.h> 26 27 /* Under 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 (__hpux__) 32 #define PTHREAD_CREATE_ARG2(arg) arg 33 #define PTHREAD_CREATE_NULL_ARG2 null_attr 34 static pthread_attr_t null_attr; 35 #else 36 #define PTHREAD_CREATE_ARG2(arg) &arg 37 #define PTHREAD_CREATE_NULL_ARG2 NULL 38 #endif 39 40 static int verbose = 0; 41 42 static void 43 common_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 70 static void * 71 thread1 (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 87 static void * 88 thread2 (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 105 void 106 foo (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 114 int 115 main(argc, argv) 116 int argc; 117 char **argv; 118 { 119 pthread_t tid1, tid2; 120 int j; 121 int t = 0; 122 void (*xxx) (); 123 pthread_attr_t attr; 124 125 if (verbose) printf ("pid = %d\n", getpid()); 126 127 foo (1, 2, 3); 128 129 if (pthread_attr_init (&attr)) 130 { 131 perror ("pthread_attr_init 1"); 132 exit (1); 133 } 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 %ld\n", (long) 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 %ld\n", (long) tid2); 157 158 sleep (1); 159 160 for (j = 1; j <= 10000000; j++) 161 { 162 if (verbose) printf("top %ld\n", (long) pthread_self ()); 163 common_routine (0); 164 sleep(1); 165 t += j; 166 } 167 168 exit(0); 169 } 170 171