aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/include/ext/mt_allocator.h
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@suse.de>2004-06-18 23:27:30 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2004-06-18 23:27:30 +0000
commite2aa7005e792abe50ec7084b4850db0bf8c982ab (patch)
treeb395f240195806b1575fd64ef40c5a83eab8a180 /libstdc++-v3/include/ext/mt_allocator.h
parentdc04f75547c55a6022125ef3684f18ae432af236 (diff)
downloadgcc-e2aa7005e792abe50ec7084b4850db0bf8c982ab.zip
gcc-e2aa7005e792abe50ec7084b4850db0bf8c982ab.tar.gz
gcc-e2aa7005e792abe50ec7084b4850db0bf8c982ab.tar.bz2
mt_allocator (__mt_alloc<>::_Tune): Add _M_align, the alignment requested.
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. From-SVN: r83372
Diffstat (limited to 'libstdc++-v3/include/ext/mt_allocator.h')
-rw-r--r--libstdc++-v3/include/ext/mt_allocator.h29
1 files changed, 19 insertions, 10 deletions
diff --git a/libstdc++-v3/include/ext/mt_allocator.h b/libstdc++-v3/include/ext/mt_allocator.h
index 9737700..8812c2d 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