spinlock.h 1.2 KB

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