[multiple changes]

2004-05-18  Paolo Carlini  <pcarlini@suse.de>

	* include/ext/mt_allocator.h:(__mt_alloc::allocate): Minor
	tweaks.

2004-05-18  Dhruv Matani  <dhruvbird@gmx.net>

	* include/ext/mt_allocator.h:(__mt_alloc::allocate): Re-write
	allocation loop which removes blocks from the global free list
	from O(N) to O(1) when the required blocks are <= the number
	available.

From-SVN: r81992
This commit is contained in:
Paolo Carlini 2004-05-18 15:58:33 +00:00
parent 70315fcdde
commit 2ab20654a2
2 changed files with 35 additions and 15 deletions

View File

@ -1,3 +1,15 @@
2004-05-18 Paolo Carlini <pcarlini@suse.de>
* include/ext/mt_allocator.h:(__mt_alloc::allocate): Minor
tweaks.
2004-05-18 Dhruv Matani <dhruvbird@gmx.net>
* include/ext/mt_allocator.h:(__mt_alloc::allocate): Re-write
allocation loop which removes blocks from the global free list
from O(N) to O(1) when the required blocks are <= the number
available.
2004-05-18 Jonathan Wakely <redi@gcc.gnu.org>
* include/ext/enc_filebuf.h: Move concept-check macro to class scope.

View File

@ -342,23 +342,32 @@ namespace __gnu_cxx
__block->_M_next = reinterpret_cast<_Block_record*>(__c);
__block = __block->_M_next;
}
__block->_M_next = NULL;
}
else
{
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;
// Is the number of required blocks greater than or
// equal to the number that can be provided by the
// global free list?
__bin._M_first[__thread_id] = __bin._M_first[0];
if (__block_count >= __bin._M_free[0])
{
__bin._M_free[__thread_id] = __bin._M_free[0];
__bin._M_free[0] = 0;
__bin._M_first[0] = NULL;
}
else
{
__bin._M_free[__thread_id] = __block_count;
__bin._M_free[0] -= __block_count;
--__block_count;
__block = __bin._M_first[0];
while (__block_count-- > 0)
__block = __block->_M_next;
__bin._M_first[0] = __block->_M_next;
__block->_M_next = NULL;
}
__gthread_mutex_unlock(__bin._M_mutex);
__bin._M_first[__thread_id] = __first;
__bin._M_free[__thread_id] += __added;
}
}
else
@ -375,9 +384,8 @@ namespace __gnu_cxx
__block->_M_next = reinterpret_cast<_Block_record*>(__c);
__block = __block->_M_next;
}
__block->_M_next = NULL;
}
__block->_M_next = NULL;
}
__block = __bin._M_first[__thread_id];