Imported Upstream version 3.0
[platform/upstream/gnu-efi.git] / lib / runtime / rtlock.c
1 /*++
2
3 Copyright (c) 1998  Intel Corporation
4
5 Module Name:
6
7     lock.c
8
9 Abstract:
10
11     Implements FLOCK
12
13
14
15 Revision History
16
17 --*/
18
19
20 #include "lib.h"
21
22
23
24 #ifndef __GNUC__
25 #pragma RUNTIME_CODE(RtAcquireLock)
26 #endif
27 VOID
28 RtAcquireLock (
29     IN FLOCK    *Lock
30     )
31 /*++
32
33 Routine Description:
34
35     Raising to the task priority level of the mutual exclusion
36     lock, and then acquires ownership of the lock.
37     
38 Arguments:
39
40     Lock        - The lock to acquire
41     
42 Returns:
43
44     Lock owned
45
46 --*/
47 {
48     if (BS) {
49         if (BS->RaiseTPL != NULL) {
50             Lock->OwnerTpl = uefi_call_wrapper(BS->RaiseTPL, 1, Lock->Tpl);
51         } 
52     }
53     else {
54         if (LibRuntimeRaiseTPL != NULL) {
55             Lock->OwnerTpl = LibRuntimeRaiseTPL(Lock->Tpl);
56         }
57     }
58     Lock->Lock += 1;
59     ASSERT (Lock->Lock == 1);
60 }
61
62
63 #ifndef __GNUC__
64 #pragma RUNTIME_CODE(RtAcquireLock)
65 #endif
66 VOID
67 RtReleaseLock (
68     IN FLOCK    *Lock
69     )
70 /*++
71
72 Routine Description:
73
74     Releases ownership of the mutual exclusion lock, and
75     restores the previous task priority level.
76     
77 Arguments:
78
79     Lock        - The lock to release
80     
81 Returns:
82
83     Lock unowned
84
85 --*/
86 {
87     EFI_TPL     Tpl;
88
89     Tpl = Lock->OwnerTpl;
90     ASSERT(Lock->Lock == 1);
91     Lock->Lock -= 1;
92     if (BS) {
93         if (BS->RestoreTPL != NULL) {
94             uefi_call_wrapper(BS->RestoreTPL, 1, Tpl);
95         } 
96     }
97     else {
98         if (LibRuntimeRestoreTPL != NULL) {
99             LibRuntimeRestoreTPL(Tpl);
100         }
101     }
102 }