EFI_STRING gRTConfigRespBuffer = NULL;\r
UINTN gDatabaseInfoSize = 0;\r
UINTN gConfigRespSize = 0;\r
-BOOLEAN gExportConfigResp = TRUE;\r
+BOOLEAN gExportConfigResp = FALSE;\r
UINTN gNvDefaultStoreSize = 0;\r
SKU_ID gSkuId = 0xFFFFFFFFFFFFFFFF;\r
LIST_ENTRY gVarStorageList = INITIALIZE_LIST_HEAD_VARIABLE (gVarStorageList);\r
\r
+//\r
+// HII database lock.\r
+//\r
+EFI_LOCK mHiiDatabaseLock = EFI_INITIALIZE_LOCK_VARIABLE(TPL_NOTIFY);\r
+\r
/**\r
This function generates a HII_DATABASE_RECORD node and adds into hii database.\r
This is a internal function.\r
\r
}\r
\r
-/**\r
-This function mainly use to get and update configuration settings information.\r
-\r
-@param This A pointer to the EFI_HII_DATABASE_PROTOCOL instance.\r
-\r
-@retval EFI_SUCCESS Get the information successfully.\r
-@retval EFI_OUT_OF_RESOURCES Not enough memory to store the Configuration Setting data.\r
-\r
-**/\r
-EFI_STATUS\r
-HiiGetConfigurationSetting(\r
- IN CONST EFI_HII_DATABASE_PROTOCOL *This\r
- )\r
-{\r
- EFI_STATUS Status;\r
-\r
- //\r
- // Get the HiiDatabase info.\r
- //\r
- Status = HiiGetDatabaseInfo(This);\r
-\r
- //\r
- // Get ConfigResp string\r
- //\r
- if (gExportConfigResp) {\r
- Status = HiiGetConfigRespInfo (This);\r
- gExportConfigResp = FALSE;\r
- }\r
- return Status;\r
-\r
-}\r
-\r
-\r
/**\r
This function adds the packages in the package list to the database and returns a handle. If there is a\r
EFI_DEVICE_PATH_PROTOCOL associated with the DriverHandle, then this function will\r
}\r
}\r
\r
+ EfiAcquireLock (&mHiiDatabaseLock);\r
+\r
//\r
// Build a PackageList node\r
//\r
Status = GenerateHiiDatabaseRecord (Private, &DatabaseRecord);\r
if (EFI_ERROR (Status)) {\r
+ EfiReleaseLock (&mHiiDatabaseLock);\r
return Status;\r
}\r
\r
//\r
Status = AddPackages (Private, EFI_HII_DATABASE_NOTIFY_NEW_PACK, PackageList, DatabaseRecord);\r
if (EFI_ERROR (Status)) {\r
+ EfiReleaseLock (&mHiiDatabaseLock);\r
return Status;\r
}\r
\r
*Handle = DatabaseRecord->Handle;\r
\r
//\r
- // Check whether need to get the Database and configuration setting info.\r
+ // Check whether need to get the Database info.\r
// Only after ReadyToBoot, need to do the export.\r
//\r
if (gExportAfterReadyToBoot) {\r
- HiiGetConfigurationSetting(This);\r
+ HiiGetDatabaseInfo (This);\r
+ }\r
+ EfiReleaseLock (&mHiiDatabaseLock);\r
+\r
+ //\r
+ // Notes:\r
+ // HiiGetDatabaseInfo () will get the contents of HII data base,\r
+ // belong to the atomic behavior of Hii Database update.\r
+ // And since HiiGetConfigRespInfo () will get the configuration setting info from HII drivers\r
+ // we can not think it belong to the atomic behavior of Hii Database update.\r
+ // That's why EfiReleaseLock (&mHiiDatabaseLock) is callled before HiiGetConfigRespInfo ().\r
+ //\r
+\r
+ // Check whether need to get the configuration setting info from HII drivers.\r
+ // When after ReadyToBoot and need to do the export for form package add.\r
+ //\r
+ if (gExportAfterReadyToBoot && gExportConfigResp) {\r
+ HiiGetConfigRespInfo (This);\r
}\r
\r
return EFI_SUCCESS;\r
return EFI_NOT_FOUND;\r
}\r
\r
+ EfiAcquireLock (&mHiiDatabaseLock);\r
+\r
Private = HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This);\r
\r
//\r
//\r
Status = RemoveGuidPackages (Private, Handle, PackageList);\r
if (EFI_ERROR (Status)) {\r
+ EfiReleaseLock (&mHiiDatabaseLock);\r
return Status;\r
}\r
Status = RemoveFormPackages (Private, Handle, PackageList);\r
if (EFI_ERROR (Status)) {\r
+ EfiReleaseLock (&mHiiDatabaseLock);\r
return Status;\r
}\r
Status = RemoveKeyboardLayoutPackages (Private, Handle, PackageList);\r
if (EFI_ERROR (Status)) {\r
+ EfiReleaseLock (&mHiiDatabaseLock);\r
return Status;\r
}\r
Status = RemoveStringPackages (Private, Handle, PackageList);\r
if (EFI_ERROR (Status)) {\r
+ EfiReleaseLock (&mHiiDatabaseLock);\r
return Status;\r
}\r
Status = RemoveFontPackages (Private, Handle, PackageList);\r
if (EFI_ERROR (Status)) {\r
+ EfiReleaseLock (&mHiiDatabaseLock);\r
return Status;\r
}\r
Status = RemoveImagePackages (Private, Handle, PackageList);\r
if (EFI_ERROR (Status)) {\r
+ EfiReleaseLock (&mHiiDatabaseLock);\r
return Status;\r
}\r
Status = RemoveSimpleFontPackages (Private, Handle, PackageList);\r
if (EFI_ERROR (Status)) {\r
+ EfiReleaseLock (&mHiiDatabaseLock);\r
return Status;\r
}\r
Status = RemoveDevicePathPackage (Private, Handle, PackageList);\r
if (EFI_ERROR (Status)) {\r
+ EfiReleaseLock (&mHiiDatabaseLock);\r
return Status;\r
}\r
\r
FreePool (Node);\r
\r
//\r
- // Check whether need to get the Database and configuration setting info.\r
+ // Check whether need to get the Database info.\r
// Only after ReadyToBoot, need to do the export.\r
//\r
if (gExportAfterReadyToBoot) {\r
- HiiGetConfigurationSetting(This);\r
+ HiiGetDatabaseInfo (This);\r
+ }\r
+ EfiReleaseLock (&mHiiDatabaseLock);\r
+\r
+ //\r
+ // Notes:\r
+ // HiiGetDatabaseInfo () will get the contents of HII data base,\r
+ // belong to the atomic behavior of Hii Database update.\r
+ // And since HiiGetConfigRespInfo () will get the configuration setting info from HII drivers\r
+ // we can not think it belong to the atomic behavior of Hii Database update.\r
+ // That's why EfiReleaseLock (&mHiiDatabaseLock) is callled before HiiGetConfigRespInfo ().\r
+ //\r
+\r
+ //\r
+ // Check whether need to get the configuration setting info from HII drivers.\r
+ // When after ReadyToBoot and need to do the export for form package remove.\r
+ //\r
+ if (gExportAfterReadyToBoot && gExportConfigResp) {\r
+ HiiGetConfigRespInfo (This);\r
}\r
return EFI_SUCCESS;\r
}\r
}\r
\r
+ EfiReleaseLock (&mHiiDatabaseLock);\r
return EFI_NOT_FOUND;\r
}\r
\r
\r
Status = EFI_SUCCESS;\r
\r
+ EfiAcquireLock (&mHiiDatabaseLock);\r
//\r
// Get original packagelist to be updated\r
//\r
}\r
\r
if (EFI_ERROR (Status)) {\r
+ EfiReleaseLock (&mHiiDatabaseLock);\r
return Status;\r
}\r
\r
Status = AddPackages (Private, EFI_HII_DATABASE_NOTIFY_ADD_PACK, PackageList, Node);\r
\r
//\r
- // Check whether need to get the Database and configuration setting info.\r
+ // Check whether need to get the Database info.\r
// Only after ReadyToBoot, need to do the export.\r
//\r
- if (gExportAfterReadyToBoot) {\r
- if (Status == EFI_SUCCESS){\r
- HiiGetConfigurationSetting(This);\r
- }\r
+ if (gExportAfterReadyToBoot && Status == EFI_SUCCESS) {\r
+ HiiGetDatabaseInfo (This);\r
+ }\r
+ EfiReleaseLock (&mHiiDatabaseLock);\r
+\r
+ //\r
+ // Notes:\r
+ // HiiGetDatabaseInfo () will get the contents of HII data base,\r
+ // belong to the atomic behavior of Hii Database update.\r
+ // And since HiiGetConfigRespInfo () will get the configuration setting info from HII drivers\r
+ // we can not think it belong to the atomic behavior of Hii Database update.\r
+ // That's why EfiReleaseLock (&mHiiDatabaseLock) is callled before HiiGetConfigRespInfo ().\r
+ //\r
+\r
+ //\r
+ // Check whether need to get the configuration setting info from HII drivers.\r
+ // When after ReadyToBoot and need to do the export for form package update.\r
+ //\r
+ if (gExportAfterReadyToBoot && gExportConfigResp && Status == EFI_SUCCESS) {\r
+ HiiGetConfigRespInfo (This);\r
}\r
\r
return Status;\r
}\r
}\r
-\r
+ EfiReleaseLock (&mHiiDatabaseLock);\r
return EFI_NOT_FOUND;\r
}\r
\r