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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user