diff options
author | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-05-16 17:01:40 +0000 |
---|---|---|
committer | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-05-16 17:01:40 +0000 |
commit | a4cc5e2c2e6675e900e7a272287b4a9c2c204734 (patch) | |
tree | c76fe30a15affefc1d7002c578e700a73621d44c /libstdc++-v3 | |
parent | 31b1f24d82db2176b3cdd4069e3eb8e99ad18b4b (diff) | |
download | ppe42-gcc-a4cc5e2c2e6675e900e7a272287b4a9c2c204734.tar.gz ppe42-gcc-a4cc5e2c2e6675e900e7a272287b4a9c2c204734.zip |
2004-05-16 Paolo Carlini <pcarlini@suse.de>
* 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).
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@81916 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/ChangeLog | 8 | ||||
-rw-r--r-- | 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 <pcarlini@suse.de> + + * 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 <pcarlini@suse.de> * 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<char*>(__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<char*>(__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); } |