[PATCH] Remove redundant loop in unsynchronized_pool_resource code

Jonathan Wakely jwakely@redhat.com
Tue Nov 13 22:59:00 GMT 2018


	* 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.

Tested x86_64-linux, committed to trunk.


-------------- next part --------------
commit b731b6ff6b9560377356d782ae641876ca410e0d
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Tue Nov 13 14:43:14 2018 +0000

    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.

diff --git a/libstdc++-v3/src/c++17/memory_resource.cc b/libstdc++-v3/src/c++17/memory_resource.cc
index 691a2999de6..b553606f552 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


More information about the Libstdc++ mailing list