2005-09-01 Benjamin Kosnik <bkoz@redhat.com>
[official-gcc.git] / libstdc++-v3 / testsuite / ext / mt_allocator / deallocate_local_thread-7.cc
blob55ff20aa78ffc26fc4ee7dfcb22ab10445696899
1 // { dg-require-cxa-atexit "" }
3 // Copyright (C) 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.
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.
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.
21 // 20.4.1.1 allocator members
23 #include <string>
24 #include <stdexcept>
25 #include <ext/mt_allocator.h>
27 static size_t count;
29 struct count_check
31 count_check() { }
32 ~count_check()
34 // NB: Using a pool that attempts to clean up resource use.
35 if (count != 0)
37 printf("allocation/deallocation count is %zu \n", count);
38 throw std::runtime_error("allocation/deallocation count isn't zero");
43 static count_check check;
45 void* operator new(size_t size) throw(std::bad_alloc)
47 printf("operator new is called \n");
48 void* p = malloc(size);
49 if (p == NULL)
50 throw std::bad_alloc();
51 count++;
52 return p;
55 void operator delete(void* p) throw()
57 printf("operator delete is called \n");
58 if (p == NULL)
59 return;
60 count--;
63 template<bool _Thread>
64 struct cleanup_pool : public __gnu_cxx::__pool<true>
66 cleanup_pool() : __gnu_cxx::__pool<true>() { }
68 cleanup_pool(const __gnu_cxx::__pool_base::_Tune& t)
69 : __gnu_cxx::__pool<true>(t) { }
71 ~cleanup_pool() throw() { this->_M_destroy(); }
74 typedef char value_type;
75 typedef std::char_traits<value_type> traits_type;
76 using __gnu_cxx::__pool;
77 using __gnu_cxx::__per_type_pool_policy;
78 typedef __per_type_pool_policy<value_type, cleanup_pool, true> policy_type;
79 typedef __gnu_cxx::__mt_alloc<value_type, policy_type> allocator_type;
80 typedef std::basic_string<value_type, traits_type, allocator_type> string_type;
82 int main()
84 string_type s;
85 s += "bayou bend";
86 return 0;