mt_allocator.h: Handle allocations at static initialization that happen before _S_opt...
authorBrad Spencer <spencer@infointeractive.com>
Thu, 1 Jul 2004 02:21:51 +0000 (02:21 +0000)
committerBenjamin Kosnik <bkoz@gcc.gnu.org>
Thu, 1 Jul 2004 02:21:51 +0000 (02:21 +0000)
2004-06-30  Brad Spencer  <spencer@infointeractive.com>

* include/ext/mt_allocator.h: Handle allocations at static
initialization that happen before _S_options is (automatically)
constructed; set _S_init even if _M_force_new is true.

From-SVN: r83949

libstdc++-v3/ChangeLog
libstdc++-v3/include/ext/mt_allocator.h

index 2b2e0fa103399397f3b6b6c8f8fcf8628ae21899..4f19d105255d8a00e895e3a9172cdaa665a5efd4 100644 (file)
@@ -1,3 +1,9 @@
+2004-06-30  Brad Spencer  <spencer@infointeractive.com>
+
+       * include/ext/mt_allocator.h: Handle allocations at static
+       initialization that happen before _S_options is (automatically)
+       constructed; set _S_init even if _M_force_new is true.
+       
 2004-06-30  Benjamin Kosnik  <bkoz@redhat.com>
 
        * config/linker-map.gnu: Revert new exports.
index 8812c2df44b26f856a5bcc7dbbf8c15c2d836fc9..f0ee2ebd26db053de63f9731e316e689f34752cf 100644 (file)
@@ -488,8 +488,25 @@ namespace __gnu_cxx
     __mt_alloc<_Tp>::
     _S_initialize()
     {
-      if (_S_options._M_force_new)
-       return;
+      // This method is called on the first allocation (when _S_init is still
+      // false) to create the bins.
+      
+      // Ensure that the static initialization of _S_options has
+      // happened.  This depends on (a) _M_align == 0 being an invalid
+      // value that is only present at startup, and (b) the real
+      // static initialization that happens later not actually
+      // changing anything.
+      if (_S_options._M_align == 0) 
+        new (&_S_options) _Tune;
+  
+      // _M_force_new must not change after the first allocate(),
+      // which in turn calls this method, so if it's false, it's false
+      // forever and we don't need to return here ever again.
+      if (_S_options._M_force_new) 
+       {
+         _S_init = true;
+         return;
+       }
 
       // Calculate the number of bins required based on _M_max_bytes.
       // _S_bin_size is statically-initialized to one.