Remove redundant loop in unsynchronized_pool_resource code

* src/c++17/memory_resource.cc (bitset::find_first_unset()): Remove
	unused function.
	(bitset::get_first_unset()): Remove loop, if there's are unset bits
	then _M_next_word refers to the first one and there's no need to loop.
	(_Pool::_Pool(size_t, size_t), _Pool::block_size()): Remove dead code.

From-SVN: r266090
This commit is contained in:
Jonathan Wakely 2018-11-13 22:58:00 +00:00 committed by Jonathan Wakely
parent f2e005857e
commit b6b1827107
2 changed files with 16 additions and 26 deletions

View File

@ -1,5 +1,11 @@
2018-11-13 Jonathan Wakely <jwakely@redhat.com>
* src/c++17/memory_resource.cc (bitset::find_first_unset()): Remove
unused function.
(bitset::get_first_unset()): Remove loop, if there's are unset bits
then _M_next_word refers to the first one and there's no need to loop.
(_Pool::_Pool(size_t, size_t), _Pool::block_size()): Remove dead code.
* src/c++17/memory_resource.cc (munge_options): Round up value of
largest_required_pool_block to multiple of smallest pool size. Round
excessively large values down to largest pool size.

View File

@ -280,7 +280,7 @@ namespace pmr
// Number of blocks
size_t size() const noexcept { return _M_size; }
// Number of unset bits
// Number of free blocks (unset bits)
size_t free() const noexcept
{
size_t n = 0;
@ -289,7 +289,7 @@ namespace pmr
return n;
}
// True if all bits are set
// True if there are no free blocks (all bits are set)
bool full() const noexcept
{
if (_M_next_word >= nwords())
@ -303,7 +303,7 @@ namespace pmr
return false;
}
// True if size() != 0 and no bits are set.
// True if size() != 0 and all blocks are free (no bits are set).
bool empty() const noexcept
{
if (nwords() == 0)
@ -333,29 +333,19 @@ namespace pmr
return _M_words[wd] & bit;
}
size_type find_first_unset() const noexcept
{
for (size_type i = _M_next_word; i < nwords(); ++i)
{
const size_type n = std::__countr_one(_M_words[i]);
if (n < bits_per_word)
return (i * bits_per_word) + n;
}
return size_type(-1);
}
size_type get_first_unset() noexcept
{
for (size_type i = _M_next_word; i < nwords(); ++i)
if (_M_next_word < nwords())
{
const size_type n = std::__countr_one(_M_words[i]);
const size_type n = std::__countr_one(_M_words[_M_next_word]);
if (n < bits_per_word)
{
const word bit = word(1) << n;
_M_words[i] |= bit;
if (i == _M_next_word)
_M_words[_M_next_word] |= bit;
const size_t res = (_M_next_word * bits_per_word) + n;
if (n == (bits_per_word - 1))
update_next_word();
return (i * bits_per_word) + n;
return res;
}
}
return size_type(-1);
@ -605,9 +595,7 @@ namespace pmr
: _M_chunks(),
_M_block_sz(__block_size),
_M_blocks_per_chunk(__blocks_per_chunk)
{
__glibcxx_assert(block_size() == __block_size);
}
{ }
// Must call release(r) before destruction!
~_Pool() { __glibcxx_assert(_M_chunks.empty()); }
@ -617,11 +605,7 @@ namespace pmr
// Size of blocks in this pool
size_t block_size() const noexcept
#if POW2_BLKSZ
{ return _S_min_block << _M_blksize_mul; }
#else
{ return _M_block_sz; }
#endif
// Allocate a block if the pool is not full, otherwise return null.
void* try_allocate() noexcept