From 1190bcd85d54c0cc19abbf1f6a7636c1e975814b Mon Sep 17 00:00:00 2001 From: Brad Spencer Date: Thu, 1 Jul 2004 02:21:51 +0000 Subject: [PATCH] mt_allocator.h: Handle allocations at static initialization that happen before _S_options is... 2004-06-30 Brad Spencer * 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 | 6 ++++++ libstdc++-v3/include/ext/mt_allocator.h | 21 +++++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 2b2e0fa1033..4f19d105255 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,9 @@ +2004-06-30 Brad Spencer + + * 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 * config/linker-map.gnu: Revert new exports. diff --git a/libstdc++-v3/include/ext/mt_allocator.h b/libstdc++-v3/include/ext/mt_allocator.h index 8812c2df44b..f0ee2ebd26d 100644 --- a/libstdc++-v3/include/ext/mt_allocator.h +++ b/libstdc++-v3/include/ext/mt_allocator.h @@ -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. -- 2.30.2