spinlock_types.h 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #ifndef __LINUX_SPINLOCK_TYPES_H
  2. #define __LINUX_SPINLOCK_TYPES_H
  3. /*
  4. * include/linux/spinlock_types.h - generic spinlock type definitions
  5. * and initializers
  6. *
  7. * portions Copyright 2005, Red Hat, Inc., Ingo Molnar
  8. * Released under the General Public License (GPL).
  9. */
  10. #include <linux/lockdep.h>
  11. #if defined(CONFIG_SMP)
  12. # include <asm/spinlock_types.h>
  13. #else
  14. # include <linux/spinlock_types_up.h>
  15. #endif
  16. typedef struct {
  17. raw_spinlock_t raw_lock;
  18. #if defined(CONFIG_PREEMPT) && defined(CONFIG_SMP)
  19. unsigned int break_lock;
  20. #endif
  21. #ifdef CONFIG_DEBUG_SPINLOCK
  22. unsigned int magic, owner_cpu;
  23. void *owner;
  24. #endif
  25. #ifdef CONFIG_DEBUG_LOCK_ALLOC
  26. struct lockdep_map dep_map;
  27. #endif
  28. } spinlock_t;
  29. #define SPINLOCK_MAGIC 0xdead4ead
  30. typedef struct {
  31. raw_rwlock_t raw_lock;
  32. #if defined(CONFIG_PREEMPT) && defined(CONFIG_SMP)
  33. unsigned int break_lock;
  34. #endif
  35. #ifdef CONFIG_DEBUG_SPINLOCK
  36. unsigned int magic, owner_cpu;
  37. void *owner;
  38. #endif
  39. #ifdef CONFIG_DEBUG_LOCK_ALLOC
  40. struct lockdep_map dep_map;
  41. #endif
  42. } rwlock_t;
  43. #define RWLOCK_MAGIC 0xdeaf1eed
  44. #define SPINLOCK_OWNER_INIT ((void *)-1L)
  45. #ifdef CONFIG_DEBUG_LOCK_ALLOC
  46. # define SPIN_DEP_MAP_INIT(lockname) .dep_map = { .name = #lockname }
  47. #else
  48. # define SPIN_DEP_MAP_INIT(lockname)
  49. #endif
  50. #ifdef CONFIG_DEBUG_LOCK_ALLOC
  51. # define RW_DEP_MAP_INIT(lockname) .dep_map = { .name = #lockname }
  52. #else
  53. # define RW_DEP_MAP_INIT(lockname)
  54. #endif
  55. #ifdef CONFIG_DEBUG_SPINLOCK
  56. # define __SPIN_LOCK_UNLOCKED(lockname) \
  57. (spinlock_t) { .raw_lock = __RAW_SPIN_LOCK_UNLOCKED, \
  58. .magic = SPINLOCK_MAGIC, \
  59. .owner = SPINLOCK_OWNER_INIT, \
  60. .owner_cpu = -1, \
  61. SPIN_DEP_MAP_INIT(lockname) }
  62. #define __RW_LOCK_UNLOCKED(lockname) \
  63. (rwlock_t) { .raw_lock = __RAW_RW_LOCK_UNLOCKED, \
  64. .magic = RWLOCK_MAGIC, \
  65. .owner = SPINLOCK_OWNER_INIT, \
  66. .owner_cpu = -1, \
  67. RW_DEP_MAP_INIT(lockname) }
  68. #else
  69. # define __SPIN_LOCK_UNLOCKED(lockname) \
  70. (spinlock_t) { .raw_lock = __RAW_SPIN_LOCK_UNLOCKED, \
  71. SPIN_DEP_MAP_INIT(lockname) }
  72. #define __RW_LOCK_UNLOCKED(lockname) \
  73. (rwlock_t) { .raw_lock = __RAW_RW_LOCK_UNLOCKED, \
  74. RW_DEP_MAP_INIT(lockname) }
  75. #endif
  76. #define SPIN_LOCK_UNLOCKED __SPIN_LOCK_UNLOCKED(old_style_spin_init)
  77. #define RW_LOCK_UNLOCKED __RW_LOCK_UNLOCKED(old_style_rw_init)
  78. #define DEFINE_SPINLOCK(x) spinlock_t x = __SPIN_LOCK_UNLOCKED(x)
  79. #define DEFINE_RWLOCK(x) rwlock_t x = __RW_LOCK_UNLOCKED(x)
  80. #endif /* __LINUX_SPINLOCK_TYPES_H */