spinlock.h 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. /**
  2. * @file spinlock.h
  3. * @author fslongjin ([email protected])
  4. * @brief 自旋锁
  5. * @version 0.1
  6. * @date 2022-04-07
  7. *
  8. * @copyright Copyright (c) 2022
  9. *
  10. */
  11. #include "../common/glib.h"
  12. /**
  13. * @brief 定义自旋锁结构体
  14. *
  15. */
  16. typedef struct
  17. {
  18. __volatile__ char lock; // 1:unlocked 0:locked
  19. } spinlock_t;
  20. /**
  21. * @brief 初始化自旋锁
  22. *
  23. * @param lock
  24. */
  25. void spin_init(spinlock_t *lock)
  26. {
  27. lock->lock = 1;
  28. }
  29. /**
  30. * @brief 自旋锁加锁
  31. *
  32. * @param lock
  33. */
  34. void spin_lock(spinlock_t *lock)
  35. {
  36. __asm__ __volatile__("1: \n\t"
  37. "lock decq %0 \n\t" // 尝试-1
  38. "jns 3f \n\t" // 加锁成功,跳转到步骤3
  39. "2: \n\t" // 加锁失败,稍后再试
  40. "pause \n\t"
  41. "cmpq $0, %0 \n\t"
  42. "jle 2b \n\t" // 若锁被占用,则继续重试
  43. "jmp 1b \n\t" // 尝试加锁
  44. "3:"
  45. : "=m"(lock->lock)::"memory");
  46. }
  47. void spin_unlock(spinlock_t * lock)
  48. {
  49. __asm__ __volatile__("movq $1, %0 \n\t"
  50. :"=m"(lock->lock)::"memory");
  51. }