OpenCores
URL https://opencores.org/ocsvn/scarts/scarts/trunk

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-gcc/] [gcc-4.1.1/] [libstdc++-v3/] [testsuite/] [thread/] [pthread7-rope.cc] - Blame information for rev 19

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 19 jlechner
// 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
 
32
const int max_thread_count = 4;
33
const int max_loop_count = 10000;
34
 
35
typedef __gnu_cxx::rope<char, std::allocator<char> > rope_type;
36
rope_type foo2;
37
rope_type foo4;
38
 
39
void* 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
 
56
int
57
main()
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
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.