[haiku-commits] r40223 - haiku/trunk/src/add-ons/kernel/file_systems/ext2

  • From: korli@xxxxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Wed, 12 Jan 2011 19:42:30 +0100 (CET)

Author: korli
Date: 2011-01-12 19:42:30 +0100 (Wed, 12 Jan 2011)
New Revision: 40223
Changeset: http://dev.haiku-os.org/changeset/40223

Modified:
   haiku/trunk/src/add-ons/kernel/file_systems/ext2/BitmapBlock.cpp
   haiku/trunk/src/add-ons/kernel/file_systems/ext2/BitmapBlock.h
Log:
Factorized _Update() and _Check() out of Mark(), Unmark(), CheckMarked() and 
CheckUnmarked().
Inline some methods.


Modified: haiku/trunk/src/add-ons/kernel/file_systems/ext2/BitmapBlock.cpp
===================================================================
--- haiku/trunk/src/add-ons/kernel/file_systems/ext2/BitmapBlock.cpp    
2011-01-12 18:24:43 UTC (rev 40222)
+++ haiku/trunk/src/add-ons/kernel/file_systems/ext2/BitmapBlock.cpp    
2011-01-12 18:42:30 UTC (rev 40223)
@@ -37,7 +37,7 @@
 }
 
 
-/*virtual*/ bool
+bool
 BitmapBlock::SetTo(off_t block)
 {
        fData = NULL;
@@ -47,7 +47,7 @@
 }
 
 
-/*virtual*/ bool
+bool
 BitmapBlock::SetToWritable(Transaction& transaction, off_t block, bool empty)
 {
        fReadOnlyData = NULL;
@@ -57,8 +57,8 @@
 }
 
 
-/*virtual*/ bool
-BitmapBlock::CheckUnmarked(uint32 start, uint32 length)
+bool
+BitmapBlock::_Check(uint32 start, uint32 length, bool marked)
 {
        const uint32* data = fData == NULL ? fReadOnlyData : fData;
        if (data == NULL)
@@ -74,32 +74,28 @@
        uint32 remainingBits = (length + startBit) & 0x1F;
 
        uint32 iterations;
-       
+       
        if (length < 32) {
                if (startBit + length < 32) {
                        uint32 bits = B_LENDIAN_TO_HOST_INT32(data[startIndex]);
 
                        uint32 mask = (1 << (startBit + length)) - 1;
                        mask &= ~((1 << startBit) - 1);
-                       
-                       return (bits & mask) == 0;
+                      
+                       return (bits & mask) == (marked ? mask : 0);
                } else
                        iterations = 0;
        } else
                iterations = (length - 32 + startBit) >> 5;
 
        uint32 index = startIndex;
-       uint32 mask = 0;
-
-       TRACE("BitmapBlock::CheckUnmarked(): startBit: %lu iterations %lu 
remainingbits %lu\n",
-               startBit, iterations, remainingBits);
-
+       
        if (startBit != 0) {
-               mask = ~((1 << startBit) - 1);
+               uint32 mask = ~((1 << startBit) - 1);
                uint32 bits = B_LENDIAN_TO_HOST_INT32(data[index]);
 
-               if ((bits & mask) != 0) {
-                       TRACE("BitmapBlock::CheckUnmarked(): start %lx mask 
%lx\n", bits, mask);
+               if ((bits & mask) != (marked ? mask : 0)) {
+                       TRACE("BitmapBlock::_Check(): start %lx mask %lx\n", 
bits, mask);
                        return false;
                }
 
@@ -108,19 +104,19 @@
                iterations++;
 
        for (; iterations > 0; --iterations) {
-               if (data[index++] != 0) {
-                       TRACE("BitmapBlock::CheckUnmarked(): iterations %lu 
bits: %lX\n", iterations,
+               if (data[index++] != (marked ? 0xFFFFFFFF : 0)) {
+                       TRACE("BitmapBlock::_Check(): iterations %lu bits: 
%lX\n", iterations,
                                data[index - 1]);
                        return false;
                }
        }
 
        if (remainingBits != 0) {
-               mask = (1 << remainingBits) - 1;
+               uint32 mask = (1 << remainingBits) - 1;
 
                uint32 bits = B_LENDIAN_TO_HOST_INT32(data[index]);
-               if ((bits & mask) != 0) {
-                       TRACE("BitmapBlock::CheckUnmarked(): remainingBits %ld 
remaining %lX mask %lX\n",
+               if ((bits & mask) != (marked ? mask : 0)) {
+                       TRACE("BitmapBlock::_Check(): remainingBits %ld 
remaining %lX mask %lX\n",
                                remainingBits, bits, mask);
                        return false;
                }
@@ -130,78 +126,12 @@
 }
 
 
-/*virtual*/ bool
-BitmapBlock::CheckMarked(uint32 start, uint32 length)
+bool
+BitmapBlock::_Update(uint32 start, uint32 length, bool mark, bool force)
 {
-       const uint32* data = fData == NULL ? fReadOnlyData : fData;
-       if (data == NULL)
-               return false;
+       TRACE("BitmapBlock::_Update(%lu, %lu, %c, %c)\n", start, length,
+               unmark ? 't' : 'f', force ? 't' : 'f');
 
-       if (start + length > fNumBits)
-               return false;
-       if (length == 0)
-               return true;
-
-       uint32 startIndex = start >> 5;
-       uint32 startBit = start & 0x1F;
-       uint32 remainingBits = (length + startBit) & 0x1F;
-
-       uint32 iterations;
-       
-       if (length < 32) {
-               if (startBit + length < 32) {
-                       uint32 bits = B_LENDIAN_TO_HOST_INT32(data[startIndex]);
-
-                       uint32 mask = (1 << (startBit + length)) - 1;
-                       mask &= ~((1 << startBit) - 1);
-                       
-                       return (bits & mask) != 0;
-               } else
-                       iterations = 0;
-       } else
-               iterations = (length - 32 + startBit) >> 5;
-
-       uint32 index = startIndex;
-       uint32 mask = 0;
-
-       if (startBit != 0) {
-               mask = ~((1 << startBit) - 1);
-               uint32 bits = B_LENDIAN_TO_HOST_INT32(data[index]);
-
-               if ((bits & mask) != mask) {
-                       TRACE("BitmapBlock::CheckMarked(): failed\n");
-                       return false;
-               }
-
-               index += 1;
-       } else
-               iterations++;
-
-       mask = 0xFFFFFFFF;
-       for (; iterations > 0; --iterations) {
-               if (data[index++] != mask) {
-                       TRACE("BitmapBlock::CheckMarked(): failed at index 
%ld\n", index);
-                       return false;
-               }
-       }
-
-       if (remainingBits != 0) {
-               mask = (1 << remainingBits) - 1;
-               uint32 bits = B_HOST_TO_LENDIAN_INT32(data[index]);
-
-               if ((bits & mask) != mask) {
-                       TRACE("BitmapBlock::CheckMarked(): failed remaining\n");
-                       return false;
-               }
-       }
-
-       return true;
-}
-
-
-/*virtual*/ bool
-BitmapBlock::Mark(uint32 start, uint32 length, bool force)
-{
        if (fData == NULL || start + length > fNumBits)
                return false;
 
@@ -209,179 +139,92 @@
        uint32 startBit = start & 0x1F;
        uint32 remainingBits = (length + startBit) & 0x1F;
 
-       uint32 iterations;
-       
-       if (length < 32) {
-               if (startBit + length < 32) {
-                       uint32 bits = 
B_LENDIAN_TO_HOST_INT32(fData[startIndex]);
-
-                       uint32 mask = (1 << (startBit + length)) - 1;
-                       mask &= ~((1 << startBit) - 1);
-                       
-                       if ((bits & mask) != 0) {
-                               ERROR("BitmapBlock::Mark() Marking failed bits 
%lx "
-                                       "startBit %ld\n", bits, startBit);
-                               return false;
-                       }
-                       
-                       bits |= mask;
-                       
-                       fData[startIndex] = B_HOST_TO_LENDIAN_INT32(bits);
-                       
-                       return true;
-               } else
-                       iterations = 0;
-       } else
-               iterations = (length - 32 + startBit) >> 5;
-
-       uint32 index = startIndex;
-       uint32 mask = 0;
-       
-       TRACE("BitmapBlock::Mark(): start: %lu, length: %lu, startIndex: %lu, "
-               "startBit: %lu, iterations: %lu, remainingBits: %lu\n", start, 
length,
-               startIndex, startBit, iterations, remainingBits);
-
-       if (startBit != 0) {
-               mask = ~((1 << startBit) - 1);
-               uint32 bits = B_LENDIAN_TO_HOST_INT32(fData[index]);
-               
-               TRACE("BitmapBlock::Mark(): index %lu mask: %lX, bits: %lX\n", 
index,
-                       mask, bits);
-
-               if (!force && (bits & mask) != 0) {
-                       ERROR("BitmapBlock::Mark() Marking failed bits %lx "
-                                       "startBit %ld\n", bits, startBit);
-                       return false;
-               }
-
-               bits |= mask;
-               fData[index] = B_HOST_TO_LENDIAN_INT32(bits);
-
-               index += 1;
-       } else
-               iterations++;
-
-       mask = 0xFFFFFFFF;
-       for (; iterations > 0; --iterations) {
-               if (!force && fData[index] != 0) {
-                       ERROR("BitmapBlock::Mark() Marking failed "
-                               "index %ld, iterations %ld\n", index, 
iterations);
-                       return false;
-               }
-               fData[index++] |= mask;
-       }
-
-       if (remainingBits != 0) {
-               mask = (1 << remainingBits) - 1;
-               uint32 bits = B_LENDIAN_TO_HOST_INT32(fData[index]);
-               TRACE("BitmapBlock::Mark(): marking index %lu remaining %lu 
bits: %lX,"
-                       " mask: %lX\n", index, remainingBits, bits, mask);
-
-               if (!force && (bits & mask) != 0) {
-                       ERROR("BitmapBlock::Mark() Marking failed remaining\n");
-                       return false;
-               }
-
-               bits |= mask;
-               fData[index] = B_HOST_TO_LENDIAN_INT32(bits);
-       }
-
-       return true;
-}
-
-
-/*virtual*/ bool
-BitmapBlock::Unmark(uint32 start, uint32 length, bool force)
-{
-       TRACE("BitmapBlock::Unmark(%lu, %lu, %c)\n", start, length,
-               force ? 't' : 'f');
-
-       if (fData == NULL || start + length > fNumBits)
-               return false;
-
-       uint32 startIndex = start >> 5;
-       uint32 startBit = start & 0x1F;
-       uint32 remainingBits = (length + startBit) & 0x1F;
-
-       TRACE("BitmapBlock::Unmark(): start index: %lu, start bit: %lu, 
remaining "
+       TRACE("BitmapBlock::_Update(): start index: %lu, start bit: %lu, 
remaining "
                "bits: %lu)\n", startIndex, startBit, remainingBits);
        uint32 iterations;
-       
+       
        if (length < 32) {
                if (startBit + length < 32) {
                        uint32 bits = 
B_LENDIAN_TO_HOST_INT32(fData[startIndex]);
-                       TRACE("BitmapBlock::Unmark(): bits: %lx\n", bits);
+                       TRACE("BitmapBlock::_Update(): bits: %lx\n", bits);
 
                        uint32 mask = (1 << (startBit + length)) - 1;
                        mask &= ~((1 << startBit) - 1);
-                       
-                       TRACE("BitmapBlock::Unmark(): mask: %lx\n", mask);
+                      
+                       TRACE("BitmapBlock::_Update(): mask: %lx\n", mask);
 
-                       if ((bits & mask) != mask) {
-                               ERROR("BitmapBlock::Unmark() Marking failed 
bits %lx "
+                       if ((bits & mask) != (mark ? 0 : mask)) {
+                               ERROR("BitmapBlock::_Update() Marking failed 
bits %lx "
                                        "startBit %ld\n", bits, startBit);
                                return false;
                        }
-                       
-                       bits &= ~mask;
-                       
-                       TRACE("BitmapBlock::Unmark(): updated bits: %lx\n", 
bits);
+                      
+                       if (mark)
+                           bits |= mask;
+                       else
+                           bits &= ~mask;
+                      
+                       TRACE("BitmapBlock::_Update(): updated bits: %lx\n", 
bits);
                        fData[startIndex] = B_HOST_TO_LENDIAN_INT32(bits);
-                       
+                      
                        return true;
                } else
                        iterations = 0;
        } else
                iterations = (length - 32 + startBit) >> 5;
 
-       TRACE("BitmapBlock::Unmark(): iterations: %lu\n", iterations);
+       TRACE("BitmapBlock::_Update(): iterations: %lu\n", iterations);
        uint32 index = startIndex;
-       uint32 mask = 0;
-
+       
        if (startBit != 0) {
-               mask = ~((1 << startBit) - 1);
+               uint32 mask = ~((1 << startBit) - 1);
                uint32 bits = B_LENDIAN_TO_HOST_INT32(fData[index]);
 
-               TRACE("BitmapBlock::Unmark(): mask: %lx, bits: %lx\n", mask, 
bits);
+               TRACE("BitmapBlock::_Update(): mask: %lx, bits: %lx\n", mask, 
bits);
 
-               if (!force && (bits & mask) != mask)
+               if (!force && (bits & mask) != (mark ? 0 : mask))
                        return false;
 
-               bits &= ~mask;
+               if (mark)
+                       bits |= mask;
+               else
+                       bits &= ~mask;
                fData[index] = B_HOST_TO_LENDIAN_INT32(bits);
 
-               TRACE("BitmapBlock::Unmark(): updated bits: %lx\n", bits);
+               TRACE("BitmapBlock::_Update(): updated bits: %lx\n", bits);
                index += 1;
        } else
                iterations++;
 
-       mask = 0xFFFFFFFF;
        for (; iterations > 0; --iterations) {
-               if (!force && fData[index] != mask) {
-                       ERROR("BitmapBlock::Unmark() Marking failed "
+               if (!force && fData[index] != (mark ? 0 : 0xFFFFFFFF)) {
+                       ERROR("BitmapBlock::_Update() Marking failed "
                                "index %ld, iterations %ld\n", index, 
iterations);
                        return false;
                }
-               fData[index++] = 0;
+               fData[index++] = (mark ? 0xFFFFFFFF : 0);
        }
 
-       TRACE("BitmapBlock::Unmark(): Finished iterations\n");
+       TRACE("BitmapBlock::_Update(): Finished iterations\n");
 
        if (remainingBits != 0) {
-               mask = (1 << remainingBits) - 1;
+               uint32 mask = (1 << remainingBits) - 1;
                uint32 bits = B_LENDIAN_TO_HOST_INT32(fData[index]);
 
-               TRACE("BitmapBlock::Unmark(): mask: %lx, bits: %lx\n", mask, 
bits);
+               TRACE("BitmapBlock::_Update(): mask: %lx, bits: %lx\n", mask, 
bits);
 
-               if (!force && (bits & mask) != mask) {
-                       ERROR("BitmapBlock::Unmark() Marking failed 
remaining\n");
+               if (!force && (bits & mask) != (mark ? 0 : mask)) {
+                       ERROR("BitmapBlock::_Update() Marking failed 
remaining\n");
                        return false;
                }
 
-               bits &= ~mask;
+               if (mark)
+                       bits |= mask;
+               else
+                       bits &= ~mask;
                fData[index] = B_HOST_TO_LENDIAN_INT32(bits);
 
-               TRACE("BitmapBlock::Unmark(): updated bits: %lx\n", bits);
+               TRACE("BitmapBlock::_Update(): updated bits: %lx\n", bits);
        }
 
        return true;
@@ -389,20 +232,6 @@
 
 
 void
-BitmapBlock::FindNextMarked(uint32& pos)
-{
-       _FindNext(pos, true);
-}
-
-
-void
-BitmapBlock::FindNextUnmarked(uint32& pos)
-{
-       _FindNext(pos, false);
-}
-
-
-void
 BitmapBlock::_FindNext(uint32& pos, bool marked)
 {
        TRACE("BitmapBlock::_FindNext(): pos: %lu\n", pos);

Modified: haiku/trunk/src/add-ons/kernel/file_systems/ext2/BitmapBlock.h
===================================================================
--- haiku/trunk/src/add-ons/kernel/file_systems/ext2/BitmapBlock.h      
2011-01-12 18:24:43 UTC (rev 40222)
+++ haiku/trunk/src/add-ons/kernel/file_systems/ext2/BitmapBlock.h      
2011-01-12 18:42:30 UTC (rev 40223)
@@ -40,7 +40,10 @@
                        uint32                  NumBits() const { return 
fNumBits; }
 
 private:
+                       bool                    _Check(uint32 start, uint32 
length, bool marked);
                        void                    _FindNext(uint32& pos, bool 
marked);
+                       bool                    _Update(uint32 start, uint32 
length, bool mark,
+                                                               bool force);
 
                        uint32*                 fData;
                        const uint32*   fReadOnlyData;
@@ -49,4 +52,47 @@
                        uint32                  fMaxIndex;
 };
 
+
+inline bool
+BitmapBlock::CheckUnmarked(uint32 start, uint32 length)
+{
+       return _Check(start, length, false);
+}
+
+
+inline bool
+BitmapBlock::CheckMarked(uint32 start, uint32 length)
+{
+       return _Check(start, length, true);
+}
+
+
+inline bool
+BitmapBlock::Mark(uint32 start, uint32 length, bool force)
+{
+       return _Update(start, length, true, force);
+}
+
+
+inline bool
+BitmapBlock::Unmark(uint32 start, uint32 length, bool force)
+{
+       return _Update(start, length, false, force);
+}
+
+
+inline void
+BitmapBlock::FindNextMarked(uint32& pos)
+{
+       _FindNext(pos, true);
+}
+
+
+inline void
+BitmapBlock::FindNextUnmarked(uint32& pos)
+{
+       _FindNext(pos, false);
+}
+
+
 #endif // BITMAPBLOCK_H


Other related posts:

  • » [haiku-commits] r40223 - haiku/trunk/src/add-ons/kernel/file_systems/ext2 - korli