mutex.h 1.4 KB

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