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> 2004-04-01 Paolo Carlini <pcarlini@suse.de>
* include/ext/mt_allocator.h (__mt_alloc<>::_S_initialize): * include/ext/mt_allocator.h (__mt_alloc<>::_S_initialize):

View File

@ -434,25 +434,23 @@ namespace __gnu_cxx
#ifdef __GTHREADS #ifdef __GTHREADS
if (__gthread_active_p()) 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(); 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 long __remove = ((__bin._M_free[__thread_id]
// remove one or two records at a time, but this creates too * _S_options._M_freelist_headroom)
// much contention when locking and therefore we wait until - __bin._M_used[__thread_id]);
// the number of records is "high enough". if (__remove > static_cast<long>(100 * (_S_bin_size - __which)
int __cond1 = static_cast<int>(100 * (_S_bin_size - __which)); * _S_options._M_freelist_headroom)
int __cond2 = static_cast<int>(__bin._M_free[__thread_id] && __remove > static_cast<long>(__bin._M_free[__thread_id]))
/ _S_options._M_freelist_headroom);
if (__remove > __cond1 && __remove > __cond2)
{ {
__gthread_mutex_lock(__bin._M_mutex); __gthread_mutex_lock(__bin._M_mutex);
_Block_record* __tmp = __bin._M_first[__thread_id]; _Block_record* __tmp = __bin._M_first[__thread_id];
_Block_record* __first = __tmp; _Block_record* __first = __tmp;
const int __removed = __remove; __remove /= _S_options._M_freelist_headroom;
const long __removed = __remove;
while (__remove > 1) while (__remove > 1)
{ {
__tmp = __tmp->_M_next; __tmp = __tmp->_M_next;