1// 2003-05-03 Loren J. Rittle <rittle@labs.mot.com> <ljrittle@acm.org> 2// 3// Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. 4// 5// This file is part of the GNU ISO C++ Library. This library is free 6// software; you can redistribute it and/or modify it under the 7// terms of the GNU General Public License as published by the 8// Free Software Foundation; either version 2, or (at your option) 9// any later version. 10// 11// This library is distributed in the hope that it will be useful, 12// but WITHOUT ANY WARRANTY; without even the implied warranty of 13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14// GNU General Public License for more details. 15// 16// You should have received a copy of the GNU General Public License along 17// with this library; see the file COPYING. If not, write to the Free 18// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 19// USA. 20 21// { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* alpha*-*-osf* } } 22// { dg-options "-pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* alpha*-*-osf* } } 23// { dg-options "-pthreads" { target *-*-solaris* } } 24 25#include <ext/rope> 26#include <cstring> 27#include <testsuite_hooks.h> 28 29// Do not include <pthread.h> explicitly; if threads are properly 30// configured for the port, then it is picked up free from STL headers. 31 32const int max_thread_count = 4; 33const int max_loop_count = 10000; 34 35typedef __gnu_cxx::rope<char, std::allocator<char> > rope_type; 36rope_type foo2; 37rope_type foo4; 38 39void* thread_main(void *) 40{ 41 // To see a problem with gcc 3.3 and before, set a break point here. 42 // Single step through c_str implementation, call sched_yield after 43 // capture of NULL __old_c_string in any thread. Single step 44 // through another thread past that same point. Now, one thread 45 // will receive a bad pointer return. Adding dummy sched_yield 46 // should never change program semantics under POSIX threads. 47 const char* data4 = foo4.c_str(); 48 49 // Please note that the memory leak in the rope implementation with 50 // this test case, existed before and after fixing this bug... 51 bool test __attribute__((unused)) = true; 52 VERIFY( !std::strcmp (data4, "barbazbonglehellohellohello") ); 53 return 0; 54} 55 56int 57main() 58{ 59 bool test __attribute__((unused)) = true; 60 61 pthread_t tid[max_thread_count]; 62 63#if defined(__sun) && defined(__svr4__) && _XOPEN_VERSION >= 500 64 pthread_setconcurrency (max_thread_count); 65#endif 66 67 rope_type foo; 68 foo += "bar"; 69 foo += "baz"; 70 foo += "bongle"; 71 const char* data = foo.c_str(); 72 VERIFY( !std::strcmp (data, "barbazbongle") ); 73 74 const char* data2; 75 { 76 foo2 += "bar2"; 77 foo2 += "baz2"; 78 foo2 += "bongle2"; 79 data2 = foo2.c_str(); 80 VERIFY( !std::strcmp (data2, "bar2baz2bongle2") ); 81 } 82 83 rope_type foo3 ("hello"); 84 const char* data3 = foo3.c_str(); 85 VERIFY( !std::strcmp (data3, "hello") ); 86 87 for (int j = 0; j < max_loop_count; j++) 88 { 89 foo4 = foo; 90 foo4 += foo3; 91 foo4 += foo3; 92 foo4 += foo3; 93 94 for (int i = 0; i < max_thread_count; i++) 95 pthread_create (&tid[i], NULL, thread_main, 0); 96 97 for (int i = 0; i < max_thread_count; i++) 98 pthread_join (tid[i], NULL); 99 } 100 101 VERIFY( !std::strcmp (data, "barbazbongle") ); 102 VERIFY( !std::strcmp (data2, "bar2baz2bongle2") ); 103 104 return 0; 105} 106