]> git.proxmox.com Git - mirror_edk2.git/commitdiff
1) Add in fix to handle the case when a form is not related to a buffer storage.
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 20 Aug 2008 14:17:24 +0000 (14:17 +0000)
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 20 Aug 2008 14:17:24 +0000 (14:17 +0000)
2) Allocate Hii Handle from a bitfield array so Framework Hii Handle can be recycled.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5700 6f19259b-4bc3-4df7-8a09-765794883524

EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/ConfigAccess.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/FrameworkHiiToUefiHiiThunk.inf
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.h
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiHandle.c [new file with mode: 0644]
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiHandle.h [new file with mode: 0644]
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Package.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.h

index c537a47b1ce9c5c43277a6f9bfcb701191d91b17..d6165b3dec34d4c452108ee421f6148f44d5bbcd 100644 (file)
@@ -633,12 +633,14 @@ CreateIfrDataArray (
   LIST_ENTRY                        *Link;\r
   EFI_STATUS                        Status;\r
 \r
+  Link = GetFirstNode (&ConfigAccess->BufferStorageListHead);\r
+  if (IsNull (&ConfigAccess->BufferStorageListHead, Link)) {\r
+    return NULL;\r
+  }\r
+  \r
   IfrDataArray = AllocateZeroPool (0x100);\r
   ASSERT (IfrDataArray != NULL);\r
 \r
-  Link = GetFirstNode (&ConfigAccess->BufferStorageListHead);\r
-  ASSERT (!IsNull (&ConfigAccess->BufferStorageListHead, Link));\r
-  \r
   BufferStorageEntry = BUFFER_STORAGE_ENTRY_FROM_LINK(Link);\r
   BrowserDataSize = BufferStorageEntry->Size;\r
 \r
@@ -702,11 +704,13 @@ DestroyIfrDataArray (
   IN  BOOLEAN                      NvMapAllocated\r
   )\r
 {\r
-  if (NvMapAllocated) {\r
-    FreePool (Array->NvRamMap);\r
-  }\r
+  if (Array != NULL) {\r
+    if (NvMapAllocated) {\r
+      FreePool (Array->NvRamMap);\r
+    }\r
 \r
-  FreePool (Array);\r
+    FreePool (Array);\r
+  }\r
 }\r
 \r
 \r
@@ -950,6 +954,7 @@ ThunkCallback (
     *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
   }\r
 \r
+\r
   DestroyIfrDataArray (Data, NvMapAllocated);\r
   \r
   return Status;\r
index ea83bdf66e5c2bc3b4edd0ea3233b6abe6c30be5..68b3bead20dbcd149c2da36353497659f1a0146a 100644 (file)
@@ -37,6 +37,8 @@
 #\r
 \r
 [Sources.common]\r
+  HiiHandle.c\r
+  HiiHandle.h\r
   ConfigAccess.c\r
   ConfigAccess.h\r
   OpcodeCreation.c\r
index c9428a23281489255f6afbf81ea28d6cc55faf69..3fc839ae89ea6bccf67e8c3900230b1cbfebf5ea 100644 (file)
@@ -14,6 +14,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 **/\r
 \r
 #include "HiiDatabase.h"\r
+#include "HiiHandle.h"\r
 \r
 HII_THUNK_PRIVATE_DATA *mHiiThunkPrivateData;\r
 \r
@@ -43,20 +44,6 @@ HII_THUNK_PRIVATE_DATA mHiiThunkPrivateDataTempate = {
     HiiGetKeyboardLayout\r
   },\r
 \r
-  //\r
-  //StaticHiiHandle\r
-  //The FRAMEWORK_EFI_HII_HANDLE starts from 1 \r
-  // and increase upwords untill reach the value of StaticPureUefiHiiHandle. \r
-  // The code will assert to prevent overflow.\r
-  (FRAMEWORK_EFI_HII_HANDLE) 1,\r
-\r
-  //\r
-  //StaticPureUefiHiiHandle\r
-  //The Static FRAMEWORK_EFI_HII_HANDLE starts from 0xFFFF \r
-  // and decrease downwords untill reach the value of StaticHiiHandle. \r
-  // The code will assert to prevent overflow.\r
-  //\r
-  (FRAMEWORK_EFI_HII_HANDLE) 0xFFFF,\r
   {\r
     NULL, NULL                  //HiiHandleLinkList\r
   },\r
@@ -111,6 +98,7 @@ Returns:
   UINTN                   BufferLength;\r
   EFI_HII_HANDLE          *Buffer;\r
   UINTN                   Index;\r
+  HII_THUNK_CONTEXT       *ThunkContext;\r
   \r
 \r
   ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiProtocolGuid);\r
@@ -119,6 +107,8 @@ Returns:
   ASSERT (Private != NULL);\r
   InitializeListHead (&Private->ThunkContextListHead);\r
 \r
+  InitHiiHandleDatabase ();\r
+\r
   mHiiThunkPrivateData = Private;\r
 \r
   Status = gBS->LocateProtocol (\r
@@ -174,8 +164,10 @@ Returns:
   Status = HiiLibListPackageLists (EFI_HII_PACKAGE_STRINGS, NULL, &BufferLength, &Buffer);\r
   if (Status == EFI_SUCCESS) {\r
     for (Index = 0; Index < BufferLength / sizeof (EFI_HII_HANDLE); Index++) {\r
-      CreateThunkContextForUefiHiiHandle (Private, Buffer[Index]);\r
-      ASSERT_EFI_ERROR (Status);\r
+      ThunkContext = CreateThunkContextForUefiHiiHandle (Buffer[Index]);\r
+      ASSERT (ThunkContext!= NULL);\r
+      \r
+      InsertTailList (&Private->ThunkContextListHead, &ThunkContext->Link);\r
     }\r
 \r
     FreePool (Buffer);\r
index 55362ea7bf39b8cc28c7413c91dabf71fe2a425d..55d1859faf6d6b04f0e397edb0e9535f5227d35b 100644 (file)
@@ -64,8 +64,6 @@ typedef struct {
   UINTN                    Signature;\r
   EFI_HANDLE               Handle;\r
   EFI_HII_PROTOCOL         Hii;\r
-  FRAMEWORK_EFI_HII_HANDLE StaticHiiHandle;\r
-  FRAMEWORK_EFI_HII_HANDLE StaticPureUefiHiiHandle;\r
 \r
   //\r
   // The head of link list for all HII_THUNK_CONTEXT.\r
@@ -141,6 +139,8 @@ typedef struct {
   UINTN                     IfrPackageCount;\r
   UINTN                     StringPackageCount;\r
 \r
+  BOOLEAN                   ByFrameworkHiiNewPack;\r
+\r
   //\r
   // The field below is only valid if IsPackageListWithOnlyStringPack is TRUE.\r
   // The HII 0.92 version of HII data implementation in EDK 1.03 and 1.04 make an the following assumption\r
diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiHandle.c b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiHandle.c
new file mode 100644 (file)
index 0000000..78eae0f
--- /dev/null
@@ -0,0 +1,66 @@
+/**@file\r
+  Framework HII handle database allocation and deallocation functins.\r
+  \r
+Copyright (c) 2008, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+\r
+#include "HiiHandle.h"\r
+\r
+//\r
+// FRAMEWORK_EFI_HII_HANDLE\r
+//\r
+UINT8 mHandle[1024 * 8] = {0};\r
+\r
+VOID\r
+InitHiiHandleDatabase (\r
+  VOID\r
+  )\r
+{\r
+  //\r
+  // FRAMEWORK_EFI_HII_HANDLE 0 is reserved.\r
+  // Set Bit 0 in mHandle[0] to 1.\r
+  //\r
+  mHandle[0] |= 1 << 0;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+AllocateHiiHandle (\r
+  FRAMEWORK_EFI_HII_HANDLE *Handle\r
+  )\r
+{\r
+  UINTN       Index;\r
+\r
+  for (Index = 0; Index < sizeof (mHandle) * 8; Index++) {\r
+    if ((mHandle[Index / 8] & (1 << (Index % 8))) == 0) {\r
+      mHandle[Index / 8] |= (1 << (Index % 8));\r
+      *Handle = (FRAMEWORK_EFI_HII_HANDLE) Index;\r
+      ASSERT (*Handle != 0);\r
+      return EFI_SUCCESS;\r
+    }\r
+  }\r
+  \r
+  return EFI_OUT_OF_RESOURCES;\r
+}\r
+\r
+VOID\r
+FreeHiiHandle (\r
+  FRAMEWORK_EFI_HII_HANDLE Handle\r
+  )\r
+{\r
+  UINT16 Num;\r
+\r
+  Num = (UINT16) Handle;\r
+\r
+  ASSERT ((mHandle [Num / 8] & (~(1 << (Num % 8)))) != 0);\r
+  mHandle [Num / 8] &= (~(1 << (Num % 8)));\r
+}\r
diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiHandle.h b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiHandle.h
new file mode 100644 (file)
index 0000000..4697996
--- /dev/null
@@ -0,0 +1,42 @@
+/**@file\r
+\r
+  This file contains utility functions by HII Thunk Modules.\r
+  \r
+Copyright (c) 2006 - 2008, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _HII_HANDLE_H\r
+#define _HII_HANDLE_H\r
+\r
+#include <FrameworkDxe.h>\r
+#include <Protocol/FrameworkHii.h>\r
+#include <Library/DebugLib.h>\r
+\r
+VOID\r
+InitHiiHandleDatabase (\r
+  VOID\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+AllocateHiiHandle (\r
+  FRAMEWORK_EFI_HII_HANDLE *Handle\r
+);\r
+  \r
+\r
+VOID\r
+FreeHiiHandle (\r
+  FRAMEWORK_EFI_HII_HANDLE Handle\r
+);\r
+\r
+\r
+#endif\r
+\r
index 994c67b9a053a69b02e4f6d5f1efc36f40ff8571..49cde52080338d2f663a820dd5c13eb25dd8e15e 100644 (file)
@@ -14,6 +14,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 \r
 #include "HiiDatabase.h"\r
+#include "HiiHandle.h"\r
 \r
 \r
 STATIC BOOLEAN mInFrameworkHiiNewPack = FALSE;\r
@@ -268,124 +269,7 @@ FindStringPackAndAddToPackListWithOnlyIfrPack(
 \r
 }\r
 \r
-HII_THUNK_CONTEXT *\r
-CreateThunkContext (\r
-  IN  HII_THUNK_PRIVATE_DATA      *Private,\r
-  IN  UINTN                       StringPackageCount,\r
-  IN  UINTN                       IfrPackageCount\r
-  )\r
-{\r
-  EFI_STATUS                   Status;\r
-  HII_THUNK_CONTEXT            *ThunkContext;\r
-\r
-  ThunkContext = AllocateZeroPool (sizeof (HII_THUNK_CONTEXT));\r
-  ASSERT (ThunkContext != NULL);\r
-  \r
-  ThunkContext->Signature = HII_THUNK_CONTEXT_SIGNATURE;\r
-  ThunkContext->IfrPackageCount = IfrPackageCount;\r
-  ThunkContext->StringPackageCount = StringPackageCount;\r
-  Status = AssignFrameworkHiiHandle (Private, TRUE, &ThunkContext->FwHiiHandle);\r
-  if (EFI_ERROR (Status)) {\r
-    return NULL;\r
-  }\r
-\r
-  InitializeListHead (&ThunkContext->QuestionIdMapListHead);\r
-  InitializeListHead (&ThunkContext->OneOfOptionMapListHead);\r
-\r
-\r
-  return ThunkContext;\r
-     \r
-}\r
-\r
-VOID\r
-FreeFrameworkHiiHandle (\r
-  IN  HII_THUNK_PRIVATE_DATA      *Private,\r
-  IN  FRAMEWORK_EFI_HII_HANDLE    FwHandle\r
-  )\r
-{\r
-  //\r
-  // TODO: \r
-  //\r
-  \r
-  return;\r
-}\r
-\r
-VOID\r
-DestoryOneOfOptionMap (\r
-  IN LIST_ENTRY     *OneOfOptionMapListHead\r
-  )\r
-{\r
-  ONE_OF_OPTION_MAP         *Map;\r
-  ONE_OF_OPTION_MAP_ENTRY   *MapEntry;\r
-  LIST_ENTRY                *Link;\r
-  LIST_ENTRY                *Link2;\r
-\r
-  while (!IsListEmpty (OneOfOptionMapListHead)) {\r
-    Link = GetFirstNode (OneOfOptionMapListHead);\r
-    \r
-    Map = ONE_OF_OPTION_MAP_FROM_LINK (Link);\r
-\r
-    while (!IsListEmpty (&Map->OneOfOptionMapEntryListHead)) {\r
-      Link2 = GetFirstNode (&Map->OneOfOptionMapEntryListHead);\r
-      \r
-      MapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link);\r
-\r
-      RemoveEntryList (Link2);\r
 \r
-      FreePool (MapEntry);\r
-    }\r
-\r
-    RemoveEntryList (Link);\r
-    FreePool (Map);\r
-  }\r
-}\r
-\r
-VOID\r
-DestroyQuestionIdMap (\r
-  IN LIST_ENTRY     *QuestionIdMapListHead\r
-  )\r
-{\r
-  QUESTION_ID_MAP           *IdMap;\r
-  QUESTION_ID_MAP_ENTRY     *IdMapEntry;\r
-  LIST_ENTRY                *Link;\r
-  LIST_ENTRY                *Link2;\r
-\r
-  while (!IsListEmpty (QuestionIdMapListHead)) {\r
-    Link = GetFirstNode (QuestionIdMapListHead);\r
-    \r
-    IdMap = QUESTION_ID_MAP_FROM_LINK (Link);\r
-\r
-    while (!IsListEmpty (&IdMap->MapEntryListHead)) {\r
-      Link2 = GetFirstNode (&IdMap->MapEntryListHead);\r
-      \r
-      IdMapEntry = QUESTION_ID_MAP_ENTRY_FROM_LINK (Link);\r
-\r
-      RemoveEntryList (Link2);\r
-\r
-      FreePool (IdMapEntry);\r
-    }\r
-\r
-    RemoveEntryList (Link);\r
-    FreePool (IdMap);\r
-  }\r
-}\r
-\r
-VOID\r
-DestroyThunkContext (\r
-  IN  HII_THUNK_PRIVATE_DATA    *Private,\r
-  IN HII_THUNK_CONTEXT          *ThunkContext\r
-  )\r
-{\r
-  ASSERT (ThunkContext != NULL);\r
-\r
-  FreeFrameworkHiiHandle (Private, ThunkContext->FwHiiHandle);\r
-\r
-  DestroyQuestionIdMap (&ThunkContext->QuestionIdMapListHead);\r
-\r
-  DestoryOneOfOptionMap (&ThunkContext->OneOfOptionMapListHead);\r
-\r
-  FreePool (ThunkContext);\r
-}\r
 \r
 CONST EFI_GUID mAGuid = \r
   { 0x14f95e01, 0xd562, 0x432e, { 0x84, 0x4a, 0x95, 0xa4, 0x39, 0x5, 0x10, 0x7e } };\r
@@ -420,7 +304,8 @@ UefiRegisterPackageList(
   if (ThunkContext == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
-\r
+  ThunkContext->ByFrameworkHiiNewPack = TRUE;\r
+  \r
   if (Packages->GuidId == NULL) {\r
     //\r
     // UEFI HII Database require Package List GUID must be unique.\r
@@ -509,7 +394,7 @@ UefiRegisterPackageList(
 \r
 Done:\r
   if (EFI_ERROR (Status)) {\r
-    DestroyThunkContext (Private, ThunkContext);\r
+    DestroyThunkContext (ThunkContext);\r
   } else {\r
     InsertTailList (&Private->ThunkContextListHead, &ThunkContext->Link);\r
     *Handle = ThunkContext->FwHiiHandle;\r
@@ -627,7 +512,7 @@ Returns:
 \r
     RemoveEntryList (&ThunkContext->Link);\r
 \r
-    DestroyThunkContext (Private, ThunkContext);\r
+    DestroyThunkContext (ThunkContext);\r
   }else {\r
     Status = EFI_NOT_FOUND;\r
   }\r
@@ -669,8 +554,10 @@ NewOrAddPackNotify (
   //\r
   ThunkContext = UefiHiiHandleToThunkContext (Private, Handle);\r
   if (ThunkContext == NULL) {\r
-    ThunkContext = CreateThunkContextForUefiHiiHandle (Private, Handle);\r
+    ThunkContext = CreateThunkContextForUefiHiiHandle (Handle);\r
     ASSERT (ThunkContext != NULL);\r
+\r
+    InsertTailList (&Private->ThunkContextListHead, &ThunkContext->Link);\r
   } \r
 \r
 \r
@@ -769,14 +656,14 @@ RemovePackNotify (
 \r
   ThunkContext = UefiHiiHandleToThunkContext (Private, Handle);\r
 \r
-  if (ThunkContext->FwHiiHandle > Private->StaticHiiHandle) {\r
+  if (!ThunkContext->ByFrameworkHiiNewPack) {\r
     if (IsRemovingLastStringPack (Handle)) {\r
       //\r
       // If the string package will be removed is the last string package\r
       // in the package list, we will remove the HII Thunk entry from the\r
       // database.\r
       //\r
-      Status = DestroyThunkContextForUefiHiiHandle (Private, Handle);\r
+      DestroyThunkContextForUefiHiiHandle (Private, Handle);\r
     }\r
   }\r
 \r
index 58019d5b9516b9bb4d58404248e7a53f9ca5188b..9e41487778f2304022e5e354ea0f6f0ba611640c 100644 (file)
@@ -15,6 +15,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 \r
 #include "HiiDatabase.h"\r
+#include "HiiHandle.h"\r
 \r
 EFI_GUID  gFrameworkHiiCompatbilityGuid = EFI_IFR_FRAMEWORK_GUID;\r
 EFI_GUID  gTianoHiiIfrGuid              = EFI_IFR_TIANO_GUID;\r
@@ -137,47 +138,8 @@ TagGuidToUefiHiiHandle (
   \r
 }\r
 \r
-BOOLEAN\r
-IsFrameworkHiiDatabaseHandleDepleted (\r
-  IN CONST HII_THUNK_PRIVATE_DATA *Private\r
-  )\r
-{\r
-  return (BOOLEAN) (Private->StaticHiiHandle == (UINTN) Private->StaticPureUefiHiiHandle);\r
-}\r
-\r
-EFI_STATUS\r
-AssignFrameworkHiiHandle (\r
-  IN OUT HII_THUNK_PRIVATE_DATA     *Private,\r
-  IN     BOOLEAN                    FromFwHiiNewPack,\r
-  OUT    FRAMEWORK_EFI_HII_HANDLE   *Handle\r
-  )\r
-{\r
-  ASSERT (Handle != NULL);\r
-\r
-  if (FromFwHiiNewPack) {\r
-\r
-    *Handle = Private->StaticHiiHandle;\r
-    Private->StaticHiiHandle += 1;\r
-\r
-    if (IsFrameworkHiiDatabaseHandleDepleted (Private)) {\r
-      return EFI_OUT_OF_RESOURCES;\r
-    }\r
 \r
-  } else {\r
-\r
-    *Handle = Private->StaticPureUefiHiiHandle;\r
-    Private->StaticPureUefiHiiHandle -= 1;\r
-    \r
-    if (IsFrameworkHiiDatabaseHandleDepleted (Private)) {\r
-      return EFI_OUT_OF_RESOURCES;\r
-    }\r
-\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
+VOID\r
 DestroyThunkContextForUefiHiiHandle (\r
   IN HII_THUNK_PRIVATE_DATA     *Private,\r
   IN EFI_HII_HANDLE             UefiHiiHandle\r
@@ -188,14 +150,7 @@ DestroyThunkContextForUefiHiiHandle (
   ThunkContext = UefiHiiHandleToThunkContext (Private, UefiHiiHandle);\r
   ASSERT (ThunkContext != NULL);\r
 \r
-  ASSERT (IsListEmpty (&ThunkContext->OneOfOptionMapListHead));\r
-  ASSERT (IsListEmpty (&ThunkContext->QuestionIdMapListHead));\r
-  \r
-  RemoveEntryList (&ThunkContext->Link);\r
-\r
-  FreePool (ThunkContext);\r
-    \r
-  return EFI_SUCCESS;\r
+  DestroyThunkContext (ThunkContext);\r
 }\r
 \r
 \r
@@ -208,7 +163,6 @@ DestroyThunkContextForUefiHiiHandle (
 **/\r
 HII_THUNK_CONTEXT *\r
 CreateThunkContextForUefiHiiHandle (\r
-  IN  HII_THUNK_PRIVATE_DATA     *Private,\r
   IN  EFI_HII_HANDLE             UefiHiiHandle\r
  )\r
 {\r
@@ -221,7 +175,7 @@ CreateThunkContextForUefiHiiHandle (
   \r
   ThunkContext->Signature = HII_THUNK_CONTEXT_SIGNATURE;\r
 \r
-  Status = AssignFrameworkHiiHandle (Private, FALSE, &ThunkContext->FwHiiHandle);\r
+  Status = AllocateHiiHandle (&ThunkContext->FwHiiHandle);\r
   if (EFI_ERROR (Status)) {\r
     return NULL;\r
   }\r
@@ -236,8 +190,6 @@ CreateThunkContextForUefiHiiHandle (
   InitializeListHead (&ThunkContext->QuestionIdMapListHead);\r
   InitializeListHead (&ThunkContext->OneOfOptionMapListHead);\r
   \r
-  InsertTailList (&Private->ThunkContextListHead, &ThunkContext->Link);\r
-\r
   return ThunkContext;\r
 }\r
 \r
@@ -471,3 +423,114 @@ GetMapEntryListHead (
 }\r
 \r
 \r
+HII_THUNK_CONTEXT *\r
+CreateThunkContext (\r
+  IN  HII_THUNK_PRIVATE_DATA      *Private,\r
+  IN  UINTN                       StringPackageCount,\r
+  IN  UINTN                       IfrPackageCount\r
+  )\r
+{\r
+  EFI_STATUS                   Status;\r
+  HII_THUNK_CONTEXT            *ThunkContext;\r
+\r
+  ThunkContext = AllocateZeroPool (sizeof (HII_THUNK_CONTEXT));\r
+  ASSERT (ThunkContext != NULL);\r
+  \r
+  ThunkContext->Signature = HII_THUNK_CONTEXT_SIGNATURE;\r
+  ThunkContext->IfrPackageCount = IfrPackageCount;\r
+  ThunkContext->StringPackageCount = StringPackageCount;\r
+  Status = AllocateHiiHandle (&ThunkContext->FwHiiHandle);\r
+  if (EFI_ERROR (Status)) {\r
+    return NULL;\r
+  }\r
+\r
+  InitializeListHead (&ThunkContext->QuestionIdMapListHead);\r
+  InitializeListHead (&ThunkContext->OneOfOptionMapListHead);\r
+\r
+\r
+  return ThunkContext;\r
+     \r
+}\r
+\r
+VOID\r
+DestroyThunkContext (\r
+  IN HII_THUNK_CONTEXT          *ThunkContext\r
+  )\r
+{\r
+  ASSERT (ThunkContext != NULL);\r
+\r
+  FreeHiiHandle (ThunkContext->FwHiiHandle);\r
+\r
+  DestroyQuestionIdMap (&ThunkContext->QuestionIdMapListHead);\r
+\r
+  DestoryOneOfOptionMap (&ThunkContext->OneOfOptionMapListHead);\r
+\r
+  RemoveEntryList (&ThunkContext->Link);\r
+\r
+  FreePool (ThunkContext);\r
+}\r
+\r
+\r
+VOID\r
+DestroyQuestionIdMap (\r
+  IN LIST_ENTRY     *QuestionIdMapListHead\r
+  )\r
+{\r
+  QUESTION_ID_MAP           *IdMap;\r
+  QUESTION_ID_MAP_ENTRY     *IdMapEntry;\r
+  LIST_ENTRY                *Link;\r
+  LIST_ENTRY                *Link2;\r
+\r
+  while (!IsListEmpty (QuestionIdMapListHead)) {\r
+    Link = GetFirstNode (QuestionIdMapListHead);\r
+    \r
+    IdMap = QUESTION_ID_MAP_FROM_LINK (Link);\r
+\r
+    while (!IsListEmpty (&IdMap->MapEntryListHead)) {\r
+      Link2 = GetFirstNode (&IdMap->MapEntryListHead);\r
+      \r
+      IdMapEntry = QUESTION_ID_MAP_ENTRY_FROM_LINK (Link);\r
+\r
+      RemoveEntryList (Link2);\r
+\r
+      FreePool (IdMapEntry);\r
+    }\r
+\r
+    RemoveEntryList (Link);\r
+    FreePool (IdMap);\r
+  }\r
+}\r
+\r
+VOID\r
+DestoryOneOfOptionMap (\r
+  IN LIST_ENTRY     *OneOfOptionMapListHead\r
+  )\r
+{\r
+  ONE_OF_OPTION_MAP         *Map;\r
+  ONE_OF_OPTION_MAP_ENTRY   *MapEntry;\r
+  LIST_ENTRY                *Link;\r
+  LIST_ENTRY                *Link2;\r
+\r
+  while (!IsListEmpty (OneOfOptionMapListHead)) {\r
+    Link = GetFirstNode (OneOfOptionMapListHead);\r
+    \r
+    Map = ONE_OF_OPTION_MAP_FROM_LINK (Link);\r
+\r
+    while (!IsListEmpty (&Map->OneOfOptionMapEntryListHead)) {\r
+      Link2 = GetFirstNode (&Map->OneOfOptionMapEntryListHead);\r
+      \r
+      MapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link);\r
+\r
+      RemoveEntryList (Link2);\r
+\r
+      FreePool (MapEntry);\r
+    }\r
+\r
+    RemoveEntryList (Link);\r
+    FreePool (Map);\r
+  }\r
+}\r
+\r
+\r
+\r
+\r
index e8867ed29a36ff8dc2e27dfe80521cc83413b081..d6b758d140c850b520328c3ba1dd7b27b5760cff 100644 (file)
@@ -70,12 +70,11 @@ AssignFrameworkHiiHandle (
 \r
 HII_THUNK_CONTEXT *\r
 CreateThunkContextForUefiHiiHandle (\r
-  IN  HII_THUNK_PRIVATE_DATA     *Private,\r
   IN  EFI_HII_HANDLE             UefiHiiHandle\r
  )\r
 ;\r
 \r
-EFI_STATUS\r
+VOID\r
 DestroyThunkContextForUefiHiiHandle (\r
   IN HII_THUNK_PRIVATE_DATA     *Private,\r
   IN EFI_HII_HANDLE             UefiHiiHandle\r
@@ -102,4 +101,31 @@ GetMapEntryListHead (
   )\r
 ;\r
 \r
+HII_THUNK_CONTEXT *\r
+CreateThunkContext (\r
+  IN  HII_THUNK_PRIVATE_DATA      *Private,\r
+  IN  UINTN                       StringPackageCount,\r
+  IN  UINTN                       IfrPackageCount\r
+  )\r
+;\r
+\r
+VOID\r
+DestroyThunkContext (\r
+  IN HII_THUNK_CONTEXT          *ThunkContext\r
+  )\r
+;\r
+\r
+VOID\r
+DestroyQuestionIdMap (\r
+  IN LIST_ENTRY     *QuestionIdMapListHead\r
+  )\r
+;\r
+\r
+\r
+VOID\r
+DestoryOneOfOptionMap (\r
+  IN LIST_ENTRY     *OneOfOptionMapListHead\r
+  )\r
+;\r
+\r
 #endif\r