/** @file | |
DXE Core library services. | |
Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#include "DxeMain.h" | |
// | |
// Lock Stuff | |
// | |
/** | |
Initialize a basic mutual exclusion lock. Each lock | |
provides mutual exclusion access at it's task priority | |
level. Since there is no-premption (at any TPL) or | |
multiprocessor support, acquiring the lock only consists | |
of raising to the locks TPL. | |
@param Lock The EFI_LOCK structure to initialize | |
@retval EFI_SUCCESS Lock Owned. | |
@retval EFI_ACCESS_DENIED Reentrant Lock Acquisition, Lock not Owned. | |
**/ | |
EFI_STATUS | |
CoreAcquireLockOrFail ( | |
IN EFI_LOCK *Lock | |
) | |
{ | |
ASSERT (Lock != NULL); | |
ASSERT (Lock->Lock != EfiLockUninitialized); | |
if (Lock->Lock == EfiLockAcquired) { | |
// | |
// Lock is already owned, so bail out | |
// | |
return EFI_ACCESS_DENIED; | |
} | |
Lock->OwnerTpl = CoreRaiseTpl (Lock->Tpl); | |
Lock->Lock = EfiLockAcquired; | |
return EFI_SUCCESS; | |
} | |
/** | |
Raising to the task priority level of the mutual exclusion | |
lock, and then acquires ownership of the lock. | |
@param Lock The lock to acquire | |
@return Lock owned | |
**/ | |
VOID | |
CoreAcquireLock ( | |
IN EFI_LOCK *Lock | |
) | |
{ | |
ASSERT (Lock != NULL); | |
ASSERT (Lock->Lock == EfiLockReleased); | |
Lock->OwnerTpl = CoreRaiseTpl (Lock->Tpl); | |
Lock->Lock = EfiLockAcquired; | |
} | |
/** | |
Releases ownership of the mutual exclusion lock, and | |
restores the previous task priority level. | |
@param Lock The lock to release | |
@return Lock unowned | |
**/ | |
VOID | |
CoreReleaseLock ( | |
IN EFI_LOCK *Lock | |
) | |
{ | |
EFI_TPL Tpl; | |
ASSERT (Lock != NULL); | |
ASSERT (Lock->Lock == EfiLockAcquired); | |
Tpl = Lock->OwnerTpl; | |
Lock->Lock = EfiLockReleased; | |
CoreRestoreTpl (Tpl); | |
} |