- Fix RtlFindClearBits to correctly treat the hint.

svn path=/trunk/; revision=11059
This commit is contained in:
Filip Navara 2004-09-25 22:59:17 +00:00
parent 200da8e7da
commit 93f1330753

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* $Id: bitmap.c,v 1.4 2004/09/25 20:49:57 navaraf Exp $ /* $Id: bitmap.c,v 1.5 2004/09/25 22:59:17 navaraf Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -220,6 +220,9 @@ RtlFindClearBits(PRTL_BITMAP BitMapHeader,
ULONG Count; ULONG Count;
PULONG Ptr; PULONG Ptr;
ULONG Mask; ULONG Mask;
ULONG Loop;
ULONG End;
ULONG OriginalHint = HintIndex;
Size = BitMapHeader->SizeOfBitMap; Size = BitMapHeader->SizeOfBitMap;
if (NumberToFind > Size || NumberToFind == 0) if (NumberToFind > Size || NumberToFind == 0)
@ -228,14 +231,22 @@ RtlFindClearBits(PRTL_BITMAP BitMapHeader,
if (HintIndex >= Size) if (HintIndex >= Size)
HintIndex = 0; HintIndex = 0;
/* Initialize the values to the hint location. */
Index = HintIndex; Index = HintIndex;
Ptr = (PULONG)BitMapHeader->Buffer + (Index / 32); Ptr = BitMapHeader->Buffer + (Index / 32);
Mask = 1 << (Index & 0x1F); Mask = 1 << (Index & 0x1F);
End = Size;
while (HintIndex < Size) /* The outer loop does the magic of first searching from the
* hint to the bitmap end and then going again from beginning
* of the bitmap to the hint location.
*/
for (Loop = 0; Loop < 2; Loop++)
{
while (HintIndex < End)
{ {
/* Count clear bits */ /* Count clear bits */
for (Count = 0; Index < Size && ~*Ptr & Mask; Index++) for (Count = 0; Index < End && ~*Ptr & Mask; Index++)
{ {
if (++Count >= NumberToFind) if (++Count >= NumberToFind)
return HintIndex; return HintIndex;
@ -250,7 +261,7 @@ RtlFindClearBits(PRTL_BITMAP BitMapHeader,
} }
/* Skip set bits */ /* Skip set bits */
for (; Index < Size && *Ptr & Mask; Index++) for (; Index < End && *Ptr & Mask; Index++)
{ {
Mask <<= 1; Mask <<= 1;
@ -263,6 +274,18 @@ RtlFindClearBits(PRTL_BITMAP BitMapHeader,
HintIndex = Index; HintIndex = Index;
} }
/* Optimalization */
if (OriginalHint == 0)
break;
/* Initialize the values for the beginning -> hint loop. */
HintIndex = Index = 0;
End = OriginalHint + NumberToFind - 1;
End = End > Size ? Size : End;
Ptr = BitMapHeader->Buffer;
Mask = 1;
}
return (ULONG)-1; return (ULONG)-1;
} }