OSDN Git Service

2004-10-11 Benjamin Kosnik <bkoz@redhat.com>
authorbkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 11 Oct 2004 20:26:53 +0000 (20:26 +0000)
committerbkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 11 Oct 2004 20:26:53 +0000 (20:26 +0000)
PR libstdc++/16614 continued.
* include/ext/mt_allocator.h
(__per_type_pool_policy::_S_get_pool): Use saner defaults based on
specific type characteristics.
(__pool_base): Add constructor that takes a _Tune argument.
(__pool): Same.
* testsuite/ext/mt_allocator/tune-2.cc: Adjust default.
* testsuite/ext/mt_allocator/tune-4.cc: Same.
* testsuite/ext/mt_allocator/tune-3.cc: Same.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@88902 138bc75d-0d04-0410-961f-82ee72b054a4

libstdc++-v3/ChangeLog
libstdc++-v3/include/ext/mt_allocator.h
libstdc++-v3/testsuite/ext/mt_allocator/tune-2.cc
libstdc++-v3/testsuite/ext/mt_allocator/tune-3.cc
libstdc++-v3/testsuite/ext/mt_allocator/tune-4.cc

index f2c29aa..c90171e 100644 (file)
@@ -1,3 +1,15 @@
+2004-10-11  Benjamin Kosnik  <bkoz@redhat.com>
+
+       PR libstdc++/16614 continued.
+       * include/ext/mt_allocator.h
+       (__per_type_pool_policy::_S_get_pool): Use saner defaults based on
+       specific type characteristics.
+       (__pool_base): Add constructor that takes a _Tune argument.
+       (__pool): Same.
+       * testsuite/ext/mt_allocator/tune-2.cc: Adjust default.
+       * testsuite/ext/mt_allocator/tune-4.cc: Same.
+       * testsuite/ext/mt_allocator/tune-3.cc: Same.
+
 2004-10-11  Joachim Kuebart  <kuebart@mathematik.uni-ulm.de>
            Paolo Carlini  <pcarlini@suse.de>
 
index f377d40..5803f5a 100644 (file)
@@ -172,6 +172,9 @@ namespace __gnu_cxx
     explicit __pool_base() 
     : _M_options(_Tune()), _M_binmap(NULL), _M_init(false) { }
 
+    explicit __pool_base(const _Tune& __tune) 
+    : _M_options(__tune), _M_binmap(NULL), _M_init(false) { }
+
   protected:
     // Configuration options.
     _Tune                      _M_options;
@@ -307,6 +310,15 @@ namespace __gnu_cxx
        _M_once = __tmp;
       }
 
+      explicit __pool(const __pool_base::_Tune& __tune) 
+      : __pool_base(__tune), _M_bin(NULL), _M_bin_size(1), 
+      _M_thread_freelist(NULL) 
+      {
+       // On some platforms, __gthread_once_t is an aggregate.
+       __gthread_once_t __tmp = __GTHREAD_ONCE_INIT;
+       _M_once = __tmp;
+      }
+
       ~__pool();
 
     private:
@@ -372,6 +384,9 @@ namespace __gnu_cxx
       explicit __pool() 
       : _M_bin(NULL), _M_bin_size(1) { }
 
+      explicit __pool(const __pool_base::_Tune& __tune) 
+      : __pool_base(__tune), _M_bin(NULL), _M_bin_size(1) { }
+
       ~__pool();
 
     private:
@@ -491,7 +506,10 @@ namespace __gnu_cxx
       static __pool_type&
       _S_get_pool() 
       { 
-       static __pool_type _S_pool;
+       // Sane defaults for the __pool_type.
+       const static size_t __align = __alignof__(_Tp) >= sizeof(typename __pool_type::_Block_record) ? __alignof__(_Tp) : sizeof(typename __pool_type::_Block_record);
+       static __pool_base::_Tune _S_tune(__align, sizeof(_Tp) * 128, (sizeof(_Tp) * 2) >= __align ? sizeof(_Tp) * 2 : __align, __pool_type::_Tune::_S_chunk_size, __pool_type::_Tune::_S_max_threads, __pool_type::_Tune::_S_freelist_headroom, getenv("GLIBCXX_FORCE_NEW") ? true : false);
+       static __pool_type _S_pool(_S_tune);
        return _S_pool;
       }
 
@@ -531,7 +549,10 @@ namespace __gnu_cxx
       static __pool_type&
       _S_get_pool( ) 
       { 
-       static __pool_type _S_pool;
+       // Sane defaults for the __pool_type.
+       const static size_t __align = __alignof__(_Tp) >= sizeof(typename __pool_type::_Block_record) ? __alignof__(_Tp) : sizeof(typename __pool_type::_Block_record);
+       static __pool_base::_Tune _S_tune(__align, sizeof(_Tp) * 128, (sizeof(_Tp) * 2) >= __align ? sizeof(_Tp) * 2 : __align, __pool_type::_Tune::_S_chunk_size, __pool_type::_Tune::_S_max_threads, __pool_type::_Tune::_S_freelist_headroom, getenv("GLIBCXX_FORCE_NEW") ? true : false);
+       static __pool_type _S_pool(_S_tune);
        return _S_pool;
       }
 
@@ -600,15 +621,15 @@ namespace __gnu_cxx
     class __mt_alloc : public __mt_alloc_base<_Tp>, _Poolp
     {
     public:
-      typedef size_t                    size_type;
-      typedef ptrdiff_t                 difference_type;
-      typedef _Tp*                      pointer;
-      typedef const _Tp*                const_pointer;
-      typedef _Tp&                      reference;
-      typedef const _Tp&                const_reference;
-      typedef _Tp                       value_type;
-      typedef _Poolp                   __policy_type;
-      typedef typename _Poolp::__pool_type       __pool_type;
+      typedef size_t                           size_type;
+      typedef ptrdiff_t                        difference_type;
+      typedef _Tp*                             pointer;
+      typedef const _Tp*                       const_pointer;
+      typedef _Tp&                             reference;
+      typedef const _Tp&                       const_reference;
+      typedef _Tp                              value_type;
+      typedef _Poolp                           __policy_type;
+      typedef typename _Poolp::__pool_type     __pool_type;
 
       template<typename _Tp1, typename _Poolp1 = _Poolp>
         struct rebind
@@ -657,8 +678,8 @@ namespace __gnu_cxx
     {
       this->_S_initialize_once();
 
-      // Requests larger than _M_max_bytes are handled by new/delete
-      // directly.
+      // Requests larger than _M_max_bytes are handled by operator
+      // new/delete directly.
       __pool_type& __pool = this->_S_get_pool();
       const size_t __bytes = __n * sizeof(_Tp);
       if (__pool._M_check_threshold(__bytes))
index 60e9b38..1dcf084 100644 (file)
@@ -37,13 +37,12 @@ void test02()
   typedef __gnu_cxx::__mt_alloc<value_type, policy_type> allocator_type;
   typedef __gnu_cxx::__pool_base::_Tune tune_type;
 
-  tune_type t_default;
   tune_type t_opt(16, 5120, 32, 5120, 20, 10, false);
   tune_type t_single(16, 5120, 32, 5120, 1, 10, false);
 
   allocator_type a;
-  tune_type t1 = a._M_get_options();  
-  VERIFY( t1._M_align == t_default._M_align );
+  tune_type t_default = a._M_get_options();
+  tune_type t1 = t_default; 
   a._M_set_options(t_opt);
   tune_type t2 = a._M_get_options();
   VERIFY( t1._M_align != t2._M_align );
index e1d2105..c7049fc 100644 (file)
@@ -45,13 +45,13 @@ void test03()
   typedef _Cp policy_type;
   typedef __gnu_cxx::__mt_alloc<value_type, policy_type> allocator_type;
 
-  tune_type t_default;
   tune_type t_opt(16, 5120, 32, 5120, 20, 10, false);
   tune_type t_single(16, 5120, 32, 5120, 1, 10, false);
 
   // First instances assured.
   allocator_type a;
-  tune_type t1 = a._M_get_options();
+  tune_type t_default = a._M_get_options();
+  tune_type t1 = t_default;
   tune_type t2;
   if (test_policy<policy_type>::per_type())
     {
index da85295..90c0c4a 100644 (file)
@@ -38,6 +38,7 @@ struct pod2
 {
   int i;
   int j;
+  int k;
 };
 
 // Tune characteristics, two of different instantiations
@@ -51,16 +52,15 @@ void test04()
   typedef _Cp policy_type;
 
   typedef __gnu_cxx::__mt_alloc<value_type, policy_type> allocator_type;
-  tune_type t_default;
   tune_type t_opt(16, 5120, 32, 5120, 20, 10, false);
   tune_type t_single(16, 5120, 32, 5120, 1, 10, false);
 
   allocator_type a;
-  tune_type t1 = a._M_get_options();
+  tune_type t_default = a._M_get_options();
+  tune_type t1 = t_default;
   tune_type t2;
   if (test_policy<policy_type>::per_type())
     {
-      VERIFY( t1._M_align == t_default._M_align );
       a._M_set_options(t_opt);
       t2 = a._M_get_options();  
       VERIFY( t1._M_align != t2._M_align );
@@ -82,7 +82,6 @@ void test04()
   // Both policy_type and rebind_type::policy_type have same characteristics.
   if (test_policy<policy_type>::per_type())
     {
-      VERIFY( t3._M_align == t_default._M_align );
       a2._M_set_options(t_opt);
       t4 = a2._M_get_options();
       VERIFY( t3._M_align != t4._M_align );