diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2018-11-13 22:58:00 +0000 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2018-11-13 22:58:00 +0000 |
commit | b6b18271072de794c8995aad95e835c76cafd5ae (patch) | |
tree | 05956beb2b776aba14557e318a30e561eb2967df | |
parent | f2e005857e52ded5338e1179c0bb0fe3375cea71 (diff) | |
download | gcc-b6b18271072de794c8995aad95e835c76cafd5ae.zip gcc-b6b18271072de794c8995aad95e835c76cafd5ae.tar.gz gcc-b6b18271072de794c8995aad95e835c76cafd5ae.tar.bz2 |
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
-rw-r--r-- | libstdc++-v3/ChangeLog | 6 | ||||
-rw-r--r-- | libstdc++-v3/src/c++17/memory_resource.cc | 36 |
2 files changed, 16 insertions, 26 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 97fbea7..af68533 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -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. diff --git a/libstdc++-v3/src/c++17/memory_resource.cc b/libstdc++-v3/src/c++17/memory_resource.cc index 691a299..b553606 100644 --- a/libstdc++-v3/src/c++17/memory_resource.cc +++ b/libstdc++-v3/src/c++17/memory_resource.cc @@ -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 |