diff options
author | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-06-18 23:27:30 +0000 |
---|---|---|
committer | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-06-18 23:27:30 +0000 |
commit | 69b85d1a5d7b9851ba9732c8eca11054251aa8a8 (patch) | |
tree | b395f240195806b1575fd64ef40c5a83eab8a180 | |
parent | dc9236d15283e0cef0227fb0025b6b5686b03aa7 (diff) | |
download | gcc-69b85d1a5d7b9851ba9732c8eca11054251aa8a8.tar.gz |
2004-06-18 Paolo Carlini <pcarlini@suse.de>
* 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/trunk@83372 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | libstdc++-v3/ChangeLog | 8 | ||||
-rw-r--r-- | 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 bd7da02e485..fe64565e4ee 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,13 @@ 2004-06-18 Paolo Carlini <pcarlini@suse.de> + * 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 <pcarlini@suse.de> + PR libstdc++/16020 * include/debug/safe_base.h (_Safe_sequence_base::_Safe_sequence_base(const _Safe_sequence_base&), 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<char*>(__block) + sizeof(_Block_record); + char* __c = reinterpret_cast<char*>(__block) + _S_options._M_align; return static_cast<_Tp*>(static_cast<void*>(__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<char*>(__p) - sizeof(_Block_record); + char* __c = reinterpret_cast<char*>(__p) - _S_options._M_align; _Block_record* __block = reinterpret_cast<_Block_record*>(__c); #ifdef __GTHREADS |