From 7846bd4fa0987cebdb26d5caafd95ec705c530f6 Mon Sep 17 00:00:00 2001 From: paolo Date: Fri, 18 Jun 2004 23:32:08 +0000 Subject: 2004-06-18 Paolo Carlini * include/ext/mt_allocator (__mt_alloc<>::_Tune): Add _M_align, the alignment requested. (__mt_alloc<>::_Tune::_Tune): Tweak consistently. (__mt_alloc<>::allocate): Use it instead of sizeof(_Block_record). (__mt_alloc<>::deallocate): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-3_4-branch@83373 138bc75d-0d04-0410-961f-82ee72b054a4 --- libstdc++-v3/ChangeLog | 8 ++++++++ libstdc++-v3/include/ext/mt_allocator.h | 29 +++++++++++++++++++---------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 1d77cd061de..297d3c40832 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,11 @@ +2004-06-18 Paolo Carlini + + * include/ext/mt_allocator (__mt_alloc<>::_Tune): Add _M_align, + the alignment requested. + (__mt_alloc<>::_Tune::_Tune): Tweak consistently. + (__mt_alloc<>::allocate): Use it instead of sizeof(_Block_record). + (__mt_alloc<>::deallocate): Likewise. + 2004-06-18 Paolo Carlini PR libstdc++/16020 diff --git a/libstdc++-v3/include/ext/mt_allocator.h b/libstdc++-v3/include/ext/mt_allocator.h index 9737700bda7..8812c2df44b 100644 --- a/libstdc++-v3/include/ext/mt_allocator.h +++ b/libstdc++-v3/include/ext/mt_allocator.h @@ -118,12 +118,18 @@ namespace __gnu_cxx // assigned and explained in detail below. struct _Tune { + // Alignment needed. + // NB: In any case must be >= sizeof(_Block_record), that + // is 4 on 32 bit machines and 8 on 64 bit machines. + size_t _M_align; + // Allocation requests (after round-up to power of 2) below // this value will be handled by the allocator. A raw new/ // call will be used for requests larger than this value. size_t _M_max_bytes; - // Size in bytes of the smallest bin (must be a power of 2). + // Size in bytes of the smallest bin. + // NB: Must be a power of 2 and >= _M_align. size_t _M_min_bin; // In order to avoid fragmenting and minimize the number of @@ -150,18 +156,19 @@ namespace __gnu_cxx explicit _Tune() - : _M_max_bytes(128), _M_min_bin(8), + : _M_align(8), _M_max_bytes(128), _M_min_bin(8), _M_chunk_size(4096 - 4 * sizeof(void*)), _M_max_threads(4096), _M_freelist_headroom(10), _M_force_new(getenv("GLIBCXX_FORCE_NEW") ? true : false) { } explicit - _Tune(size_t __maxb, size_t __minbin, size_t __chunk, - size_t __maxthreads, size_t __headroom, bool __force) - : _M_max_bytes(__maxb), _M_min_bin(__minbin), _M_chunk_size(__chunk), - _M_max_threads(__maxthreads), _M_freelist_headroom(__headroom), - _M_force_new(__force) + _Tune(size_t __align, size_t __maxb, size_t __minbin, + size_t __chunk, size_t __maxthreads, size_t __headroom, + bool __force) + : _M_align(__align), _M_max_bytes(__maxb), _M_min_bin(__minbin), + _M_chunk_size(__chunk), _M_max_threads(__maxthreads), + _M_freelist_headroom(__headroom), _M_force_new(__force) { } }; @@ -306,8 +313,10 @@ namespace __gnu_cxx _Block_record* __block = NULL; if (__bin._M_first[__thread_id] == NULL) { + // NB: For alignment reasons, we can't use the first _M_align + // bytes, even when sizeof(_Block_record) < _M_align. const size_t __bin_size = ((_S_options._M_min_bin << __which) - + sizeof(_Block_record)); + + _S_options._M_align); size_t __block_count = _S_options._M_chunk_size / __bin_size; // Are we using threads? @@ -399,7 +408,7 @@ namespace __gnu_cxx } #endif - char* __c = reinterpret_cast(__block) + sizeof(_Block_record); + char* __c = reinterpret_cast(__block) + _S_options._M_align; return static_cast<_Tp*>(static_cast(__c)); } @@ -421,7 +430,7 @@ namespace __gnu_cxx const size_t __which = _S_binmap[__bytes]; const _Bin_record& __bin = _S_bin[__which]; - char* __c = reinterpret_cast(__p) - sizeof(_Block_record); + char* __c = reinterpret_cast(__p) - _S_options._M_align; _Block_record* __block = reinterpret_cast<_Block_record*>(__c); #ifdef __GTHREADS -- cgit v1.2.1