From 8d819f40bb03f1479322d5ef998d57540bc00077 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 8 Dec 2009 03:06:40 +0000 Subject: [PATCH] Fix regressions. svn path=/trunk/; revision=44466 --- reactos/lib/rtl/bitmap.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/reactos/lib/rtl/bitmap.c b/reactos/lib/rtl/bitmap.c index 1af0cbb89c7..27328367d21 100644 --- a/reactos/lib/rtl/bitmap.c +++ b/reactos/lib/rtl/bitmap.c @@ -417,7 +417,7 @@ RtlFindClearBits( IN ULONG NumberToFind, IN ULONG HintIndex) { - ULONG CurrentBit, CurrentLength; + ULONG CurrentBit, Margin, CurrentLength; /* Check for valid parameters */ if (!BitMapHeader || NumberToFind > BitMapHeader->SizeOfBitMap) @@ -431,12 +431,15 @@ RtlFindClearBits( return HintIndex; } + /* First margin is end of bitmap */ + Margin = BitMapHeader->SizeOfBitMap; + +retry: /* Start with hint index, length is 0 */ CurrentBit = HintIndex; - CurrentLength = 0; /* Loop until something is found or the end is reached */ - while (CurrentBit + NumberToFind < BitMapHeader->SizeOfBitMap) + while (CurrentBit + NumberToFind < Margin) { /* Search for the next clear run, by skipping a set run */ CurrentBit += RtlpGetLengthOfRunSet(BitMapHeader, @@ -458,6 +461,15 @@ RtlFindClearBits( CurrentBit += CurrentLength; } + /* Did we start at a hint? */ + if (HintIndex) + { + /* Retry at the start */ + Margin = min(HintIndex + NumberToFind, BitMapHeader->SizeOfBitMap); + HintIndex = 0; + goto retry; + } + /* Nothing found */ return MAXULONG; } @@ -571,10 +583,10 @@ RtlFindNextForwardRunClear( /* Assume a set run first, count it's length */ Length = RtlpGetLengthOfRunSet(BitMapHeader, FromIndex, MAXULONG); - *StartingRunIndex = FromIndex; + *StartingRunIndex = FromIndex + Length; /* Now return the length of the run */ - return RtlpGetLengthOfRunClear(BitMapHeader, FromIndex, MAXULONG); + return RtlpGetLengthOfRunClear(BitMapHeader, FromIndex + Length, MAXULONG); } ULONG @@ -647,7 +659,7 @@ RtlFindClearRuns( } /* Advance bits */ - FromIndex += NumberOfBits; + FromIndex = StartingIndex + NumberOfBits; } /* Check if we are finished */