mt_allocator.h (__mt_alloc<>::deallocate): Rearrange arithmetic to avoid computing two divisions at each deallocation.

2004-04-02  Paolo Carlini  <pcarlini@suse.de>

	* include/ext/mt_allocator.h (__mt_alloc<>::deallocate):
	Rearrange arithmetic to avoid computing two divisions at
	each deallocation.

From-SVN: r80356
This commit is contained in:
Paolo Carlini 2004-04-02 19:51:21 +00:00 committed by Paolo Carlini
parent 89c43c0a0b
commit ab40b100d3
2 changed files with 17 additions and 13 deletions

View File

@ -1,3 +1,9 @@
2004-04-02 Paolo Carlini <pcarlini@suse.de>
* include/ext/mt_allocator.h (__mt_alloc<>::deallocate):
Rearrange arithmetic to avoid computing two divisions at
each deallocation.
2004-04-01 Paolo Carlini <pcarlini@suse.de>
* include/ext/mt_allocator.h (__mt_alloc<>::_S_initialize):

View File

@ -434,25 +434,23 @@ namespace __gnu_cxx
#ifdef __GTHREADS
if (__gthread_active_p())
{
// Calculate the number of records to remove from our freelist.
// Calculate the number of records to remove from our freelist:
// in order to avoid too much contention we wait until the
// number of records is "high enough".
const size_t __thread_id = _S_get_thread_id();
int __remove = (__bin._M_free[__thread_id]
- (__bin._M_used[__thread_id]
/ _S_options._M_freelist_headroom));
// The calculation above will almost always tell us to
// remove one or two records at a time, but this creates too
// much contention when locking and therefore we wait until
// the number of records is "high enough".
int __cond1 = static_cast<int>(100 * (_S_bin_size - __which));
int __cond2 = static_cast<int>(__bin._M_free[__thread_id]
/ _S_options._M_freelist_headroom);
if (__remove > __cond1 && __remove > __cond2)
long __remove = ((__bin._M_free[__thread_id]
* _S_options._M_freelist_headroom)
- __bin._M_used[__thread_id]);
if (__remove > static_cast<long>(100 * (_S_bin_size - __which)
* _S_options._M_freelist_headroom)
&& __remove > static_cast<long>(__bin._M_free[__thread_id]))
{
__gthread_mutex_lock(__bin._M_mutex);
_Block_record* __tmp = __bin._M_first[__thread_id];
_Block_record* __first = __tmp;
const int __removed = __remove;
__remove /= _S_options._M_freelist_headroom;
const long __removed = __remove;
while (__remove > 1)
{
__tmp = __tmp->_M_next;