• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
3  * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without modification,
6  * are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice, this list of
9  *    conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright notice, this list
12  *    of conditions and the following disclaimer in the documentation and/or other materials
13  *    provided with the distribution.
14  *
15  * 3. Neither the name of the copyright holder nor the names of its contributors may be used
16  *    to endorse or promote products derived from this software without specific prior written
17  *    permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
26  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
28  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
29  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #ifndef _LOS_LOCKDEP_H
33 #define _LOS_LOCKDEP_H
34 
35 #ifdef __cplusplus
36 #if __cplusplus
37 extern "C" {
38 #endif /* __cplusplus */
39 #endif /* __cplusplus */
40 
41 typedef struct Spinlock SPIN_LOCK_S;
42 
43 #define MAX_LOCK_DEPTH  16U
44 
45 enum LockDepErrType {
46     LOCKDEP_SUCCESS = 0,
47     LOCKDEP_ERR_DOUBLE_LOCK,
48     LOCKDEP_ERR_DEAD_LOCK,
49     LOCKDEP_ERR_UNLOCK_WITOUT_LOCK,
50     /* overflow, needs expand */
51     LOCKDEP_ERR_OVERFLOW,
52 };
53 
54 typedef struct {
55     VOID *lockPtr;
56     VOID *lockAddr;
57     UINT64 waitTime;
58     UINT64 holdTime;
59 } HeldLocks;
60 
61 typedef struct {
62     VOID *waitLock;
63     INT32 lockDepth;
64     HeldLocks heldLocks[MAX_LOCK_DEPTH];
65 } LockDep;
66 
67 /**
68  * @ingroup los_lockdep
69  *
70  * @par Description:
71  * This API is used to check dead lock in spinlock.
72  * @attention
73  * <ul>
74  * <li>The parameter passed in should be ensured to be a legal pointer.</li>
75  * </ul>
76  *
77  * @param lock    [IN] point to a SPIN_LOCK_S.
78  *
79  * @retval None.
80  * @par Dependency:
81  * <ul><li>los_lockdep.h: the header file that contains the API declaration.</li></ul>
82  * @see
83  */
84 extern VOID OsLockDepCheckIn(SPIN_LOCK_S *lock);
85 
86 /**
87  * @ingroup los_lockdep
88  *
89  * @par Description:
90  * This API is used to trace when a spinlock locked.
91  * @attention
92  * <ul>
93  * <li>The parameter passed in should be ensured to be a legal pointer.</li>
94  * </ul>
95  *
96  * @param lock    [IN] point to a SPIN_LOCK_S.
97  *
98  * @retval None.
99  * @par Dependency:
100  * <ul><li>los_lockdep.h: the header file that contains the API declaration.</li></ul>
101  * @see
102  */
103 extern VOID OsLockDepRecord(SPIN_LOCK_S *lock);
104 
105 /**
106  * @ingroup los_lockdep
107  *
108  * @par Description:
109  * This API is used to trace when a spinlock unlocked.
110  * @attention
111  * <ul>
112  * <li>The parameter passed in should be ensured to be a legal pointer.</li>
113  * </ul>
114  *
115  * @param lock  [IN] point to a SPIN_LOCK_S.
116  *
117  * @retval None.
118  * @par Dependency:
119  * <ul><li>los_lockdep.h: the header file that contains the API declaration.</li></ul>
120  * @see
121  */
122 extern VOID OsLockDepCheckOut(SPIN_LOCK_S *lock);
123 
124 /**
125  * @ingroup los_lockdep
126  *
127  * @par Description:
128  * This API is used to clear lockdep record of current task.
129  * @attention
130  * <ul>
131  * <li>None.</li>
132  * </ul>
133  *
134  * @param None
135  * @retval None.
136  * @par Dependency:
137  * <ul><li>los_lockdep.h: the header file that contains the API declaration.</li></ul>
138  * @see
139  */
140 extern VOID OsLockdepClearSpinlocks(VOID);
141 
142 #ifdef __cplusplus
143 #if __cplusplus
144 }
145 #endif
146 #endif /* __cplusplus */
147 #endif /* _LOS_LOCKDEP_H */
148