VOID *Buffer;\r
UINTN Index;\r
UINTN FSize;\r
- UINTN Offset;\r
+ UINTN Offset, MaxOffset;\r
UINTN NoPages;\r
UINTN Granularity;\r
\r
//\r
if (IsListEmpty (&Pool->FreeList[Index])) {\r
\r
+ Offset = LIST_TO_SIZE (Index);\r
+ MaxOffset = Granularity;\r
+\r
+ //\r
+ // Check the bins holding larger blocks, and carve one up if needed\r
+ //\r
+ while (++Index < SIZE_TO_LIST (Granularity)) {\r
+ if (!IsListEmpty (&Pool->FreeList[Index])) {\r
+ Free = CR (Pool->FreeList[Index].ForwardLink, POOL_FREE, Link, POOL_FREE_SIGNATURE);\r
+ RemoveEntryList (&Free->Link);\r
+ NewPage = (VOID *) Free;\r
+ MaxOffset = LIST_TO_SIZE (Index);\r
+ goto Carve;\r
+ }\r
+ }\r
+\r
//\r
// Get another page\r
//\r
//\r
// Serve the allocation request from the head of the allocated block\r
//\r
+Carve:\r
Head = (POOL_HEAD *) NewPage;\r
- Offset = LIST_TO_SIZE (Index);\r
\r
//\r
// Carve up remaining space into free pool blocks\r
//\r
- Index = SIZE_TO_LIST (Granularity) - 1;\r
- while (Offset < Granularity) {\r
+ Index--;\r
+ while (Offset < MaxOffset) {\r
ASSERT (Index < MAX_POOL_LIST);\r
FSize = LIST_TO_SIZE(Index);\r
\r
- while (Offset + FSize <= Granularity) {\r
+ while (Offset + FSize <= MaxOffset) {\r
Free = (POOL_FREE *) &NewPage[Offset];\r
Free->Signature = POOL_FREE_SIGNATURE;\r
Free->Index = (UINT32)Index;\r
InsertHeadList (&Pool->FreeList[Index], &Free->Link);\r
Offset += FSize;\r
}\r
-\r
Index -= 1;\r
}\r
\r
- ASSERT (Offset == Granularity);\r
+ ASSERT (Offset == MaxOffset);\r
goto Done;\r
}\r
\r