include/linux/spinlock_types.h
changeset 0 aa628870c1d3
equal deleted inserted replaced
-1:000000000000 0:aa628870c1d3
       
     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 {
       
    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 
       
    36 typedef 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 */