From 08f7c2eb78c512fc41d363db476d9912a082ec5e Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Sun, 16 May 2004 17:01:40 +0000 Subject: [PATCH] mt_allocator.h (__mt_alloc<>::deallocate): Consistently update __bin._M_free[0]. 2004-05-16 Paolo Carlini * include/ext/mt_allocator.h (__mt_alloc<>::deallocate): Consistently update __bin._M_free[0]. (__mt_alloc<>::allocate): When __bin._M_first[0] != NULL use __bin._M_free[0] to simplify the while loop (i.e., the number of iterations becomes known at the outset). From-SVN: r81916 --- libstdc++-v3/ChangeLog | 8 ++++ libstdc++-v3/include/ext/mt_allocator.h | 55 +++++++++++++------------ 2 files changed, 37 insertions(+), 26 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index bb7f593732f..2458a14754e 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,11 @@ +2004-05-16 Paolo Carlini + + * include/ext/mt_allocator.h (__mt_alloc<>::deallocate): + Consistently update __bin._M_free[0]. + (__mt_alloc<>::allocate): When __bin._M_first[0] != NULL use + __bin._M_free[0] to simplify the while loop (i.e., the number + of iterations becomes known at the outset). + 2004-05-15 Paolo Carlini * include/std/std_bitset.h: Trivial formatting fixes. diff --git a/libstdc++-v3/include/ext/mt_allocator.h b/libstdc++-v3/include/ext/mt_allocator.h index 0b17aa2d209..1fc0ccbca0e 100644 --- a/libstdc++-v3/include/ext/mt_allocator.h +++ b/libstdc++-v3/include/ext/mt_allocator.h @@ -148,19 +148,21 @@ namespace __gnu_cxx // Set to true forces all allocations to use new(). bool _M_force_new; - explicit _Tune() + explicit + _Tune() : _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) - { } + _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) + 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) - { } + { } }; private: @@ -330,34 +332,33 @@ namespace __gnu_cxx void* __v = ::operator new(_S_options._M_chunk_size); __bin._M_first[__thread_id] = static_cast<_Block_record*>(__v); - __bin._M_free[__thread_id] = __block_count; + __bin._M_free[__thread_id] = __block_count; --__block_count; __block = __bin._M_first[__thread_id]; - while (__block_count > 0) + while (__block_count-- > 0) { char* __c = reinterpret_cast(__block) + __bin_size; __block->_M_next = reinterpret_cast<_Block_record*>(__c); __block = __block->_M_next; - --__block_count; } - __block->_M_next = NULL; } else { - while (__bin._M_first[0] != NULL && __block_count > 0) - { - _Block_record* __tmp = __bin._M_first[0]->_M_next; - __block = __bin._M_first[0]; - - __block->_M_next = __bin._M_first[__thread_id]; - __bin._M_first[__thread_id] = __block; - - ++__bin._M_free[__thread_id]; - __bin._M_first[0] = __tmp; - --__block_count; - } + if (__block_count > __bin._M_free[0]) + __block_count = __bin._M_free[0]; + const size_t __added = __block_count; + _Block_record* __first = __bin._M_first[0]; + __block = __first; + --__block_count; + while (__block_count-- > 0) + __block = __block->_M_next; + __bin._M_first[0] = __block->_M_next; + __bin._M_free[0] -= __added; __gthread_mutex_unlock(__bin._M_mutex); + + __bin._M_first[__thread_id] = __first; + __bin._M_free[__thread_id] += __added; } } else @@ -368,15 +369,15 @@ namespace __gnu_cxx --__block_count; __block = __bin._M_first[0]; - while (__block_count > 0) + while (__block_count-- > 0) { char* __c = reinterpret_cast(__block) + __bin_size; __block->_M_next = reinterpret_cast<_Block_record*>(__c); __block = __block->_M_next; - --__block_count; } - __block->_M_next = NULL; } + + __block->_M_next = NULL; } __block = __bin._M_first[__thread_id]; @@ -434,7 +435,8 @@ namespace __gnu_cxx _Block_record* __first = __tmp; __remove /= _S_options._M_freelist_headroom; const long __removed = __remove; - while (__remove-- > 1) + --__remove; + while (__remove-- > 0) __tmp = __tmp->_M_next; __bin._M_first[__thread_id] = __tmp->_M_next; __bin._M_free[__thread_id] -= __removed; @@ -442,6 +444,7 @@ namespace __gnu_cxx __gthread_mutex_lock(__bin._M_mutex); __tmp->_M_next = __bin._M_first[0]; __bin._M_first[0] = __first; + __bin._M_free[0] += __removed; __gthread_mutex_unlock(__bin._M_mutex); }