Home | History | Annotate | Download | only in EfiDriverLib
      1 /*++
      2 
      3 Copyright (c) 2004, Intel Corporation. All rights reserved.<BR>
      4 This program and the accompanying materials
      5 are licensed and made available under the terms and conditions of the BSD License
      6 which accompanies this distribution.  The full text of the license may be found at
      7 http://opensource.org/licenses/bsd-license.php
      8 
      9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     11 
     12 Module Name:
     13 
     14   Lock.c
     15 
     16 Abstract:
     17 
     18   Support for locking lib services.
     19 
     20 --*/
     21 
     22 #include "Tiano.h"
     23 #include "EfiDriverLib.h"
     24 
     25 VOID
     26 EfiInitializeLock (
     27   IN OUT EFI_LOCK *Lock,
     28   IN EFI_TPL      Priority
     29   )
     30 /*++
     31 
     32 Routine Description:
     33 
     34   Initialize a basic mutual exclusion lock.   Each lock
     35   provides mutual exclusion access at it's task priority
     36   level.  Since there is no-premption (at any TPL) or
     37   multiprocessor support, acquiring the lock only consists
     38   of raising to the locks TPL.
     39 
     40   Note on a check build ASSERT()s are used to ensure proper
     41   lock usage.
     42 
     43 Arguments:
     44 
     45   Lock        - The EFI_LOCK structure to initialize
     46 
     47   Priority    - The task priority level of the lock
     48 
     49 
     50 Returns:
     51 
     52   An initialized Efi Lock structure.
     53 
     54 --*/
     55 {
     56   Lock->Tpl       = Priority;
     57   Lock->OwnerTpl  = 0;
     58   Lock->Lock      = 0;
     59 }
     60 
     61 EFI_STATUS
     62 EfiAcquireLockOrFail (
     63   IN EFI_LOCK  *Lock
     64   )
     65 /*++
     66 
     67 Routine Description:
     68 
     69   Initialize a basic mutual exclusion lock.   Each lock
     70   provides mutual exclusion access at it's task priority
     71   level.  Since there is no-premption (at any TPL) or
     72   multiprocessor support, acquiring the lock only consists
     73   of raising to the locks TPL.
     74 
     75 Arguments:
     76 
     77   Lock        - The EFI_LOCK structure to initialize
     78 
     79 Returns:
     80 
     81   EFI_SUCCESS       - Lock Owned.
     82   EFI_ACCESS_DENIED - Reentrant Lock Acquisition, Lock not Owned.
     83 
     84 --*/
     85 {
     86   if (Lock->Lock != 0) {
     87     //
     88     // Lock is already owned, so bail out
     89     //
     90     return EFI_ACCESS_DENIED;
     91   }
     92 
     93   Lock->OwnerTpl = gBS->RaiseTPL (Lock->Tpl);
     94 
     95   Lock->Lock += 1;
     96   return EFI_SUCCESS;
     97 }
     98 
     99 VOID
    100 EfiAcquireLock (
    101   IN EFI_LOCK  *Lock
    102   )
    103 /*++
    104 
    105 Routine Description:
    106 
    107   Raising to the task priority level of the mutual exclusion
    108   lock, and then acquires ownership of the lock.
    109 
    110 Arguments:
    111 
    112   Lock - The lock to acquire
    113 
    114 Returns:
    115 
    116   Lock owned
    117 
    118 --*/
    119 {
    120   EFI_STATUS  Status;
    121 
    122   Status = EfiAcquireLockOrFail (Lock);
    123 
    124   //
    125   // Lock was already locked.
    126   //
    127   ASSERT_EFI_ERROR (Status);
    128 }
    129 
    130 VOID
    131 EfiReleaseLock (
    132   IN EFI_LOCK  *Lock
    133   )
    134 /*++
    135 
    136 Routine Description:
    137 
    138     Releases ownership of the mutual exclusion lock, and
    139     restores the previous task priority level.
    140 
    141 Arguments:
    142 
    143     Lock - The lock to release
    144 
    145 Returns:
    146 
    147     Lock unowned
    148 
    149 --*/
    150 {
    151   EFI_TPL Tpl;
    152 
    153   Tpl = Lock->OwnerTpl;
    154 
    155   ASSERT (Lock->Lock == 1);
    156   Lock->Lock -= 1;
    157 
    158   gBS->RestoreTPL (Tpl);
    159 }
    160