pthread7-rope.cc 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // 2003-05-03 Loren J. Rittle <rittle@labs.mot.com> <ljrittle@acm.org>
  2. //
  3. // Copyright (C) 2003-2022 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 3, 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 COPYING3. If not see
  18. // <http://www.gnu.org/licenses/>.
  19. // { dg-do run }
  20. // { dg-options "-pthread" }
  21. // { dg-require-effective-target pthread }
  22. // { dg-timeout-factor 2 }
  23. #include <ext/rope>
  24. #include <cstring>
  25. #include <pthread.h>
  26. #include <testsuite_hooks.h>
  27. const int max_thread_count = 4;
  28. const int max_loop_count = 10000;
  29. typedef __gnu_cxx::rope<char, std::allocator<char> > rope_type;
  30. rope_type foo2;
  31. rope_type foo4;
  32. void* thread_main(void *)
  33. {
  34. // To see a problem with gcc 3.3 and before, set a break point here.
  35. // Single step through c_str implementation, call sched_yield after
  36. // capture of NULL __old_c_string in any thread. Single step
  37. // through another thread past that same point. Now, one thread
  38. // will receive a bad pointer return. Adding dummy sched_yield
  39. // should never change program semantics under POSIX threads.
  40. const char* data4 = foo4.c_str();
  41. // Please note that the memory leak in the rope implementation with
  42. // this test case, existed before and after fixing this bug...
  43. VERIFY( !std::strcmp (data4, "barbazbonglehellohellohello") );
  44. return 0;
  45. }
  46. int
  47. main()
  48. {
  49. pthread_t tid[max_thread_count];
  50. #if defined(__sun) && defined(__svr4__) && _XOPEN_VERSION >= 500
  51. pthread_setconcurrency (max_thread_count);
  52. #endif
  53. rope_type foo;
  54. foo += "bar";
  55. foo += "baz";
  56. foo += "bongle";
  57. const char* data = foo.c_str();
  58. VERIFY( !std::strcmp (data, "barbazbongle") );
  59. const char* data2;
  60. {
  61. foo2 += "bar2";
  62. foo2 += "baz2";
  63. foo2 += "bongle2";
  64. data2 = foo2.c_str();
  65. VERIFY( !std::strcmp (data2, "bar2baz2bongle2") );
  66. }
  67. rope_type foo3 ("hello");
  68. const char* data3 = foo3.c_str();
  69. VERIFY( !std::strcmp (data3, "hello") );
  70. for (int j = 0; j < max_loop_count; j++)
  71. {
  72. foo4 = foo;
  73. foo4 += foo3;
  74. foo4 += foo3;
  75. foo4 += foo3;
  76. for (int i = 0; i < max_thread_count; i++)
  77. pthread_create (&tid[i], 0, thread_main, 0);
  78. for (int i = 0; i < max_thread_count; i++)
  79. pthread_join (tid[i], 0);
  80. }
  81. VERIFY( !std::strcmp (data, "barbazbongle") );
  82. VERIFY( !std::strcmp (data2, "bar2baz2bongle2") );
  83. return 0;
  84. }