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