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 raw_spinlock {
  21        arch_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} raw_spinlock_t;
  33
  34#define SPINLOCK_MAGIC          0xdead4ead
  35
  36#define SPINLOCK_OWNER_INIT     ((void *)-1L)
  37
  38#ifdef CONFIG_DEBUG_LOCK_ALLOC
  39# define SPIN_DEP_MAP_INIT(lockname)    .dep_map = { .name = #lockname }
  40#else
  41# define SPIN_DEP_MAP_INIT(lockname)
  42#endif
  43
  44#ifdef CONFIG_DEBUG_SPINLOCK
  45# define SPIN_DEBUG_INIT(lockname)              \
  46        .magic = SPINLOCK_MAGIC,                \
  47        .owner_cpu = -1,                        \
  48        .owner = SPINLOCK_OWNER_INIT,
  49#else
  50# define SPIN_DEBUG_INIT(lockname)
  51#endif
  52
  53#define __RAW_SPIN_LOCK_INITIALIZER(lockname)   \
  54        {                                       \
  55        .raw_lock = __ARCH_SPIN_LOCK_UNLOCKED,  \
  56        SPIN_DEBUG_INIT(lockname)               \
  57        SPIN_DEP_MAP_INIT(lockname) }
  58
  59#define __RAW_SPIN_LOCK_UNLOCKED(lockname)      \
  60        (raw_spinlock_t) __RAW_SPIN_LOCK_INITIALIZER(lockname)
  61
  62#define DEFINE_RAW_SPINLOCK(x)  raw_spinlock_t x = __RAW_SPIN_LOCK_UNLOCKED(x)
  63
  64typedef struct spinlock {
  65        union {
  66                struct raw_spinlock rlock;
  67
  68#ifdef CONFIG_DEBUG_LOCK_ALLOC
  69# define LOCK_PADSIZE (offsetof(struct raw_spinlock, dep_map))
  70                struct {
  71                        u8 __padding[LOCK_PADSIZE];
  72                        struct lockdep_map dep_map;
  73                };
  74#endif
  75        };
  76} spinlock_t;
  77
  78#define __SPIN_LOCK_INITIALIZER(lockname) \
  79        { { .rlock = __RAW_SPIN_LOCK_INITIALIZER(lockname) } }
  80
  81#define __SPIN_LOCK_UNLOCKED(lockname) \
  82        (spinlock_t ) __SPIN_LOCK_INITIALIZER(lockname)
  83
  84#define DEFINE_SPINLOCK(x)      spinlock_t x = __SPIN_LOCK_UNLOCKED(x)
  85
  86#include <linux/rwlock_types.h>
  87
  88#endif /* __LINUX_SPINLOCK_TYPES_H */
  89