Add Lock for cirtical section in PCD database processing routines as PCD database is a shared resource in the system. The lock level is defined as EFI_TPL_CALLBACK. The PCD spec should be updated accordingly.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2264 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
qwang12
2007-01-18 02:46:28 +00:00
parent 26355eed43
commit a696a78c37
3 changed files with 82 additions and 34 deletions

View File

@@ -17,6 +17,7 @@ Module Name: Pcd.c
#include "Service.h"
EFI_LOCK mPcdDatabaseLock = EFI_INITIALIZE_LOCK_VARIABLE(EFI_TPL_CALLBACK);
PCD_PROTOCOL mPcdInstance = {
DxePcdSetSku,
@@ -472,9 +473,20 @@ DxeRegisterCallBackOnSet (
IN PCD_PROTOCOL_CALLBACK CallBackFunction
)
{
EFI_STATUS Status;
ASSERT (CallBackFunction != NULL);
return DxeRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction);
//
// Aquire lock to prevent reentrance from TPL_CALLBACK level
//
EfiAcquireLock (&mPcdDatabaseLock);
Status = DxeRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction);
EfiReleaseLock (&mPcdDatabaseLock);
return Status;
}
@@ -487,9 +499,20 @@ DxeUnRegisterCallBackOnSet (
IN PCD_PROTOCOL_CALLBACK CallBackFunction
)
{
ASSERT (CallBackFunction != NULL);
EFI_STATUS Status;
return DxeUnRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction);
ASSERT (CallBackFunction != NULL);
//
// Aquire lock to prevent reentrance from TPL_CALLBACK level
//
EfiAcquireLock (&mPcdDatabaseLock);
Status = DxeUnRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction);
EfiReleaseLock (&mPcdDatabaseLock);
return Status;
}