1 // 2002-01-23 Loren J. Rittle <rittle@labs.mot.com> <ljrittle@acm.org> 2 // Adpated from libstdc++/5464 submitted by jjessel@amadeus.net 3 // Jean-Francois JESSEL (Amadeus SAS Development) 4 // 5 // Copyright (C) 2002, 2003 Free Software Foundation, Inc. 6 // 7 // This file is part of the GNU ISO C++ Library. This library is free 8 // software; you can redistribute it and/or modify it under the 9 // terms of the GNU General Public License as published by the 10 // Free Software Foundation; either version 2, or (at your option) 11 // any later version. 12 // 13 // This library is distributed in the hope that it will be useful, 14 // but WITHOUT ANY WARRANTY; without even the implied warranty of 15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 // GNU General Public License for more details. 17 // 18 // You should have received a copy of the GNU General Public License along 19 // with this library; see the file COPYING. If not, write to the Free 20 // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, 21 // USA. 22 23 // { dg-do run { target *-*-openbsd* *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* } } 24 // { dg-options "-pthread" { target *-*-openbsd* *-*-freebsd* *-*-netbsd* *-*-linux* } } 25 // { dg-options "-pthreads" { target *-*-solaris* } } 26 27 #include <vector> 28 #include <list> 29 #include <string> 30 31 // Do not include <pthread.h> explicitly; if threads are properly 32 // configured for the port, then it is picked up free from STL headers. 33 34 #if __GTHREADS 35 #ifdef _GLIBCPP_HAVE_UNISTD_H 36 #include <unistd.h> // To test for _POSIX_THREAD_PRIORITY_SCHEDULING 37 #endif 38 39 using namespace std; 40 41 #define NTHREADS 8 42 #define LOOPS 20 43 44 struct tt_t 45 { 46 char buf[100]; 47 int i; 48 }; 49 50 void* 51 thread_function (void* arg) 52 { 53 int myid = *(int*) arg; 54 for (int i = 0; i < LOOPS; i++) 55 { 56 vector<tt_t> myvect1; 57 58 for (int j = 0; j < 2000; j++) 59 { 60 vector<tt_t> myvect2; 61 tt_t v; 62 v.i = j; 63 myvect1.push_back (v); 64 myvect2.push_back (v); 65 list<std::string *> mylist; 66 std::string string_array[4]; 67 string_array[0] = "toto"; 68 string_array[1] = "titi"; 69 string_array[2] = "tata"; 70 string_array[3] = "tutu"; 71 for (int k = 0; k < 4; k++) 72 { 73 if (mylist.size ()) 74 { 75 list<std::string *>::iterator aIt; 76 for (aIt = mylist.begin (); aIt != mylist.end (); ++aIt) 77 { 78 if ((*aIt) == &(string_array[k])) 79 abort (); 80 } 81 } 82 mylist.push_back (&(string_array[k])); 83 } 84 } 85 } 86 87 return arg; 88 } 89 90 int 91 main (int argc, char *argv[]) 92 { 93 int worker; 94 pthread_t threads[NTHREADS]; 95 int ids[NTHREADS]; 96 void* status; 97 98 #if defined(__sun) && defined(__svr4__) 99 pthread_setconcurrency (NTHREADS); 100 #endif 101 102 pthread_attr_t tattr; 103 int ret = pthread_attr_init (&tattr); 104 #ifdef _POSIX_THREAD_PRIORITY_SCHEDULING 105 ret = pthread_attr_setscope(&tattr, PTHREAD_SCOPE_SYSTEM); 106 #endif 107 108 for (worker = 0; worker < NTHREADS; worker++) 109 { 110 ids[worker] = worker; 111 if (pthread_create(&threads[worker], &tattr, 112 thread_function, &ids[worker])) 113 abort (); 114 } 115 116 for (worker = 0; worker < NTHREADS; worker++) 117 { 118 if (pthread_join(threads[worker], static_cast<void **>(&status))) 119 abort (); 120 121 if (*((int *)status) != worker) 122 abort (); 123 } 124 125 return (0); 126 } 127 #else 128 int main (void) {} 129 #endif 130