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