File: /Users/paulross/dev/linux/linux-3.13/include/linux/spinlock_types.h

Green shading in the line number column means the source is part of the translation unit, red means it is conditionally excluded. Highlighted line numbers link to the translation unit page. Highlighted macros link to the macro page.

       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: 
      20: typedef 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: 
      64: typedef 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: