From a495198f051c7163256bb3a3b6a8c29a07cfa059 Mon Sep 17 00:00:00 2001 From: MikeBeaton Date: Sat, 16 Oct 2021 17:37:45 +0100 Subject: [PATCH] OcFlexArrayLib: Add optional TRACE debugging --- Include/Acidanthera/Library/OcFlexArrayLib.h | 4 ++ Library/OcFlexArrayLib/FlexArray.c | 61 ++++++++++++++++---- 2 files changed, 54 insertions(+), 11 deletions(-) diff --git a/Include/Acidanthera/Library/OcFlexArrayLib.h b/Include/Acidanthera/Library/OcFlexArrayLib.h index 8a0f625e..0d275b8d 100644 --- a/Include/Acidanthera/Library/OcFlexArrayLib.h +++ b/Include/Acidanthera/Library/OcFlexArrayLib.h @@ -6,6 +6,10 @@ #ifndef OC_FLEX_ARRAY_LIB_H #define OC_FLEX_ARRAY_LIB_H +#if !defined(OC_TRACE_FLEX) +#define OC_TRACE_FLEX DEBUG_VERBOSE +#endif + #include #include #include diff --git a/Library/OcFlexArrayLib/FlexArray.c b/Library/OcFlexArrayLib/FlexArray.c index b32182b8..c63f448a 100644 --- a/Library/OcFlexArrayLib/FlexArray.c +++ b/Library/OcFlexArrayLib/FlexArray.c @@ -29,9 +29,30 @@ OcFlexArrayInit ( FlexArray->ItemSize = ItemSize; FlexArray->FreeItem = FreeItem; } + + DEBUG ((OC_TRACE_FLEX, "FLEX: Init %p %u\n", FlexArray, ItemSize)); + return FlexArray; } +STATIC +VOID * +InternalFlexArrayItemAt ( + IN CONST OC_FLEX_ARRAY *FlexArray, + IN CONST UINTN Index + ) +{ + VOID *Item; + + ASSERT (FlexArray != NULL); + ASSERT (Index < FlexArray->Count); + ASSERT (FlexArray->Items != NULL); + + Item = ((UINT8 *) FlexArray->Items) + Index * FlexArray->ItemSize; + + return Item; +} + STATIC VOID * InternalFlexArrayAddItem ( @@ -71,7 +92,7 @@ InternalFlexArrayAddItem ( } } - Item = OcFlexArrayItemAt (FlexArray, FlexArray->Count - 1); + Item = InternalFlexArrayItemAt (FlexArray, FlexArray->Count - 1); return Item; } @@ -91,6 +112,8 @@ OcFlexArrayAddItem ( ZeroMem (Item, FlexArray->ItemSize); } + DEBUG ((OC_TRACE_FLEX, "FLEX: Add %p %p\n", FlexArray, Item)); + return Item; } @@ -116,12 +139,14 @@ OcFlexArrayInsertItem ( return Item; } - Item = OcFlexArrayItemAt (FlexArray, InsertIndex); - Dest = OcFlexArrayItemAt (FlexArray, InsertIndex + 1); + Item = InternalFlexArrayItemAt (FlexArray, InsertIndex); + Dest = InternalFlexArrayItemAt (FlexArray, InsertIndex + 1); CopyMem (Dest, Item, (FlexArray->Count - InsertIndex) * FlexArray->ItemSize); ZeroMem (Item, FlexArray->ItemSize); + DEBUG ((OC_TRACE_FLEX, "FLEX: Insert %p %p\n", FlexArray, Item)); + return Item; } @@ -131,12 +156,20 @@ OcFlexArrayItemAt ( IN CONST UINTN Index ) { - if (Index >= FlexArray->Count || FlexArray->Items == NULL) { - ASSERT (FALSE); - return NULL; - } - - return ((UINT8 *) FlexArray->Items) + Index * FlexArray->ItemSize; + VOID *Item; + + // + // Repeat these checks here and in internal ItemAt for easier debugging if they fail. + // + ASSERT (FlexArray != NULL); + ASSERT (Index < FlexArray->Count); + ASSERT (FlexArray->Items != NULL); + + Item = InternalFlexArrayItemAt (FlexArray, Index); + + DEBUG ((OC_TRACE_FLEX, "FLEX: At %p %p\n", FlexArray, Item)); + + return Item; } VOID @@ -146,13 +179,15 @@ OcFlexArrayFree ( { UINTN Index; + DEBUG ((OC_TRACE_FLEX, "FLEX: Free %p\n", FlexArray)); + ASSERT (FlexArray != NULL); if (*FlexArray != NULL) { if ((*FlexArray)->Items != NULL) { if ((*FlexArray)->FreeItem != NULL) { for (Index = 0; Index < (*FlexArray)->Count; Index++) { - (*FlexArray)->FreeItem (OcFlexArrayItemAt (*FlexArray, Index)); + (*FlexArray)->FreeItem (InternalFlexArrayItemAt (*FlexArray, Index)); } } FreePool ((*FlexArray)->Items); @@ -168,12 +203,14 @@ OcFlexArrayDiscardItem ( IN CONST BOOLEAN FreeItem ) { + DEBUG ((OC_TRACE_FLEX, "FLEX: Discard %p %u\n", FlexArray, FreeItem)); + ASSERT (FlexArray != NULL); ASSERT (FlexArray->Items != NULL); ASSERT (FlexArray->Count > 0); if (FreeItem && FlexArray->FreeItem != NULL) { - FlexArray->FreeItem (OcFlexArrayItemAt (FlexArray, FlexArray->Count - 1)); + FlexArray->FreeItem (InternalFlexArrayItemAt (FlexArray, FlexArray->Count - 1)); } --FlexArray->Count; @@ -186,6 +223,8 @@ OcFlexArrayFreeContainer ( IN UINTN *Count ) { + DEBUG ((OC_TRACE_FLEX, "FLEX: FreeContainer %p\n", FlexArray)); + if (FlexArray == NULL || *FlexArray == NULL) { ASSERT (FALSE); *Items = NULL; -- GitLab