xref: /openbsd-src/gnu/lib/libstdc++/libstdc++/testsuite/thread/pthread5.cc (revision ae44bc93cdc3e99800494195f6559488456acd2d)
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*
thread_function(void * arg)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
main(int argc,char * argv[])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
main(void)128 int main (void) {}
129 #endif
130