MdeModulePkg/HiiDB: Make sure database update behaviors are atomic

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1235

When update contents in HiiDatabase, like:
1. Add/update/remove package list
2. Add/update string
3. Add/update image
We should make these operations atomic to prevent the
potential issue that the one update operation with
higher TPL may interrupt another.
This commit is to make the HiiDatabase update behaviors
atomic by adding EfiAcquireLock/EfiReleaseLock function.

Cc: Liming Gao <liming.gao@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Dandan Bi <dandan.bi@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
Dandan Bi
2018-10-12 18:13:19 +08:00
committed by Hao Wu
parent adb2c05012
commit 979b7d802c
4 changed files with 75 additions and 1 deletions

View File

@@ -1210,6 +1210,8 @@ HiiNewString (
return EFI_NOT_FOUND;
}
EfiAcquireLock (&mHiiDatabaseLock);
Status = EFI_SUCCESS;
NewStringPackageCreated = FALSE;
NewStringId = 0;
@@ -1573,6 +1575,8 @@ Done:
}
}
EfiReleaseLock (&mHiiDatabaseLock);
return Status;
}
@@ -1738,6 +1742,8 @@ HiiSetString (
return EFI_NOT_FOUND;
}
EfiAcquireLock (&mHiiDatabaseLock);
Private = HII_STRING_DATABASE_PRIVATE_DATA_FROM_THIS (This);
PackageListNode = NULL;
@@ -1764,6 +1770,7 @@ HiiSetString (
(EFI_FONT_INFO *) StringFontInfo
);
if (EFI_ERROR (Status)) {
EfiReleaseLock (&mHiiDatabaseLock);
return Status;
}
PackageListNode->PackageListHdr.PackageLength += StringPackage->StringPkgHdr->Header.Length - OldPackageLen;
@@ -1774,11 +1781,13 @@ HiiSetString (
if (gExportAfterReadyToBoot) {
HiiGetDatabaseInfo(&Private->HiiDatabase);
}
EfiReleaseLock (&mHiiDatabaseLock);
return EFI_SUCCESS;
}
}
}
EfiReleaseLock (&mHiiDatabaseLock);
return EFI_NOT_FOUND;
}