1 #pragma once
2 
3 #include <common/atomic.h>
4 #include <common/spinlock.h>
5 #include <common/glib.h>
6 #include <process/proc-types.h>
7 
8 /**
9  * @brief Mutex - 互斥锁
10  *
11  * - 同一时间只有1个任务可以持有mutex
12  * - 不允许递归地加锁、解锁
13  * - 只允许通过mutex的api来操作mutex
14  * - 在硬中断、软中断中不能使用mutex
15  */
16 typedef struct
17 {
18 
19     atomic_t count; // 锁计数。1->已解锁。 0->已上锁,且有可能存在等待者
20     spinlock_t wait_lock;   // mutex操作锁,用于对mutex的list的操作进行加锁
21     struct List wait_list;  // Mutex的等待队列
22 } mutex_t;
23 
24 /**
25  * @brief 在mutex上的等待者的结构体
26  *
27  */
28 struct mutex_waiter_t
29 {
30     struct List list;
31     struct process_control_block *pcb;
32 };
33 
34 /**
35  * @brief 初始化互斥量
36  *
37  * @param lock mutex结构体
38  */
39 void mutex_init(mutex_t *lock);
40 
41 /**
42  * @brief 对互斥量加锁
43  *
44  * @param lock mutex结构体
45  */
46 void mutex_lock(mutex_t *lock);
47 
48 /**
49  * @brief 对互斥量解锁
50  *
51  * @param lock mutex结构体
52  */
53 void mutex_unlock(mutex_t *lock);
54 
55 /**
56  * @brief 尝试对互斥量加锁
57  *
58  * @param lock mutex结构体
59  *
60  * @return 成功加锁->1, 加锁失败->0
61  */
62 int mutex_trylock(mutex_t *lock);
63 
64 /**
65  * @brief 判断mutex是否已被加锁
66  *
67  * @return 已加锁->1, 未加锁->0
68  */
69 #define mutex_is_locked(lock) ((atomic_read(&(lock)->count) == 1) ? 0 : 1)
70