123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- #pragma once
- #include <common/atomic.h>
- #include <common/spinlock.h>
- #include <common/glib.h>
- #include <process/process.h>
- /**
- * @brief Mutex - 互斥锁
- *
- * - 同一时间只有1个任务可以持有mutex
- * - 不允许递归地加锁、解锁
- * - 只允许通过mutex的api来操作mutex
- * - 在硬中断、软中断中不能使用mutex
- */
- typedef struct
- {
- atomic_t count; // 锁计数。1->已解锁。 0->已上锁,且有可能存在等待者
- spinlock_t wait_lock; // mutex操作锁,用于对mutex的list的操作进行加锁
- struct List wait_list; // Mutex的等待队列
- } mutex_t;
- /**
- * @brief 在mutex上的等待者的结构体
- *
- */
- struct mutex_waiter_t
- {
- struct List list;
- struct process_control_block *pcb;
- };
- /**
- * @brief 初始化互斥量
- *
- * @param lock mutex结构体
- */
- void mutex_init(mutex_t *lock);
- /**
- * @brief 对互斥量加锁
- *
- * @param lock mutex结构体
- */
- void mutex_lock(mutex_t *lock);
- /**
- * @brief 对互斥量解锁
- *
- * @param lock mutex结构体
- */
- void mutex_unlock(mutex_t *lock);
- /**
- * @brief 尝试对互斥量加锁
- *
- * @param lock mutex结构体
- *
- * @return 成功加锁->1, 加锁失败->0
- */
- int mutex_trylock(mutex_t *lock);
- /**
- * @brief 判断mutex是否已被加锁
- *
- * @return 已加锁->1, 未加锁->0
- */
- #define mutex_is_locked(lock) ((atomic_read(&(lock)->count) == 1) ? 0 : 1)
|