Home | History | Annotate | Download | only in linux
      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 #include <linux/lockdep.h>
     13 
     14 #if defined(CONFIG_SMP)
     15 # include <asm/spinlock_types.h>
     16 #else
     17 # include <linux/spinlock_types_up.h>
     18 #endif
     19 
     20 typedef struct {
     21 	raw_spinlock_t raw_lock;
     22 #if defined(CONFIG_PREEMPT) && defined(CONFIG_SMP)
     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 #if defined(CONFIG_PREEMPT) && defined(CONFIG_SMP)
     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 #define SPIN_LOCK_UNLOCKED	__SPIN_LOCK_UNLOCKED(old_style_spin_init)
     89 #define RW_LOCK_UNLOCKED	__RW_LOCK_UNLOCKED(old_style_rw_init)
     90 
     91 #define DEFINE_SPINLOCK(x)	spinlock_t x = __SPIN_LOCK_UNLOCKED(x)
     92 #define DEFINE_RWLOCK(x)	rwlock_t x = __RW_LOCK_UNLOCKED(x)
     93 
     94 #endif /* __LINUX_SPINLOCK_TYPES_H */
     95