1#ifndef __LINUX_RWLOCK_TYPES_H
2#define __LINUX_RWLOCK_TYPES_H
3
4/*
5 * include/linux/rwlock_types.h - generic rwlock type definitions
6 *				  and initializers
7 *
8 * portions Copyright 2005, Red Hat, Inc., Ingo Molnar
9 * Released under the General Public License (GPL).
10 */
11typedef struct {
12	arch_rwlock_t raw_lock;
13#ifdef CONFIG_GENERIC_LOCKBREAK
14	unsigned int break_lock;
15#endif
16#ifdef CONFIG_DEBUG_SPINLOCK
17	unsigned int magic, owner_cpu;
18	void *owner;
19#endif
20#ifdef CONFIG_DEBUG_LOCK_ALLOC
21	struct lockdep_map dep_map;
22#endif
23} rwlock_t;
24
25#define RWLOCK_MAGIC		0xdeaf1eed
26
27#ifdef CONFIG_DEBUG_LOCK_ALLOC
28# define RW_DEP_MAP_INIT(lockname)	.dep_map = { .name = #lockname }
29#else
30# define RW_DEP_MAP_INIT(lockname)
31#endif
32
33#ifdef CONFIG_DEBUG_SPINLOCK
34#define __RW_LOCK_UNLOCKED(lockname)					\
35	(rwlock_t)	{	.raw_lock = __ARCH_RW_LOCK_UNLOCKED,	\
36				.magic = RWLOCK_MAGIC,			\
37				.owner = SPINLOCK_OWNER_INIT,		\
38				.owner_cpu = -1,			\
39				RW_DEP_MAP_INIT(lockname) }
40#else
41#define __RW_LOCK_UNLOCKED(lockname) \
42	(rwlock_t)	{	.raw_lock = __ARCH_RW_LOCK_UNLOCKED,	\
43				RW_DEP_MAP_INIT(lockname) }
44#endif
45
46#define DEFINE_RWLOCK(x)	rwlock_t x = __RW_LOCK_UNLOCKED(x)
47
48#endif /* __LINUX_RWLOCK_TYPES_H */
49