Something went wrong. Try again.
(I'm so sorry!) Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135#ifndef __LINUX_RWLOCK_H#define __LINUX_RWLOCK_H
#ifndef __LINUX_INSIDE_SPINLOCK_H# error "Please do not include this file directly."#endif
/* * rwlock related methods * * split out from spinlock.h * * portions Copyright 2005, Red Hat, Inc., Ingo Molnar * Released under the General Public License (GPL). */
#ifdef CONFIG_DEBUG_SPINLOCK extern void __rwlock_init(rwlock_t *lock, const char *name, struct lock_class_key *key);# define rwlock_init(lock) \do { \ static struct lock_class_key __key; \ \ __rwlock_init((lock), #lock, &__key); \} while (0)#else# define rwlock_init(lock) \ do { *(lock) = __RW_LOCK_UNLOCKED(lock); } while (0)#endif
#ifdef CONFIG_DEBUG_SPINLOCK extern void do_raw_read_lock(rwlock_t *lock) __acquires_shared(lock); extern int do_raw_read_trylock(rwlock_t *lock) __cond_acquires_shared(true, lock); extern void do_raw_read_unlock(rwlock_t *lock) __releases_shared(lock); extern void do_raw_write_lock(rwlock_t *lock) __acquires(lock);extern int do_raw_write_trylock(rwlock_t *lock) __cond_acquires(true, lock); extern void do_raw_write_unlock(rwlock_t *lock) __releases(lock);#else# define do_raw_read_lock(rwlock) do {__acquire_shared(lock); arch_read_lock(&(rwlock)->raw_lock); } while (0)static inline int do_raw_read_trylock(rwlock_t *rwlock) __cond_acquires_shared(true, rwlock) __no_context_analysis{ return arch_read_trylock(&(rwlock)->raw_lock);}# define do_raw_read_unlock(rwlock) do {arch_read_unlock(&(rwlock)->raw_lock); __release_shared(lock); } while (0)# define do_raw_write_lock(rwlock) do {__acquire(lock); arch_write_lock(&(rwlock)->raw_lock); } while (0)static inline int do_raw_write_trylock(rwlock_t *rwlock) __cond_acquires(true, rwlock) __no_context_analysis{ return arch_write_trylock(&(rwlock)->raw_lock);}# define do_raw_write_unlock(rwlock) do {arch_write_unlock(&(rwlock)->raw_lock); __release(lock); } while (0)#endif
/* * Define the various rw_lock methods. Note we define these * regardless of whether CONFIG_SMP or CONFIG_PREEMPT are set. The various * methods are defined as nops in the case they are not required. */#define read_trylock(lock) _raw_read_trylock(lock)#define write_trylock(lock) _raw_write_trylock(lock)
#define write_lock(lock) _raw_write_lock(lock)#define read_lock(lock) _raw_read_lock(lock)
#ifdef CONFIG_DEBUG_LOCK_ALLOC#define write_lock_nested(lock, subclass) _raw_write_lock_nested(lock, subclass)#else#define write_lock_nested(lock, subclass) _raw_write_lock(lock)#endif
#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
#define read_lock_irqsave(lock, flags) \ do { \ typecheck(unsigned long, flags); \ flags = _raw_read_lock_irqsave(lock); \ } while (0)#define write_lock_irqsave(lock, flags) \ do { \ typecheck(unsigned long, flags); \ flags = _raw_write_lock_irqsave(lock); \ } while (0)
#else
#define read_lock_irqsave(lock, flags) \ do { \ typecheck(unsigned long, flags); \ _raw_read_lock_irqsave(lock, flags); \ } while (0)#define write_lock_irqsave(lock, flags) \ do { \ typecheck(unsigned long, flags); \ _raw_write_lock_irqsave(lock, flags); \ } while (0)
#endif
#define read_lock_irq(lock) _raw_read_lock_irq(lock)#define read_lock_bh(lock) _raw_read_lock_bh(lock)#define write_lock_irq(lock) _raw_write_lock_irq(lock)#define write_lock_bh(lock) _raw_write_lock_bh(lock)#define read_unlock(lock) _raw_read_unlock(lock)#define write_unlock(lock) _raw_write_unlock(lock)#define read_unlock_irq(lock) _raw_read_unlock_irq(lock)#define write_unlock_irq(lock) _raw_write_unlock_irq(lock)
#define read_unlock_irqrestore(lock, flags) \ do { \ typecheck(unsigned long, flags); \ _raw_read_unlock_irqrestore(lock, flags); \ } while (0)#define read_unlock_bh(lock) _raw_read_unlock_bh(lock)
#define write_unlock_irqrestore(lock, flags) \ do { \ typecheck(unsigned long, flags); \ _raw_write_unlock_irqrestore(lock, flags); \ } while (0)#define write_unlock_bh(lock) _raw_write_unlock_bh(lock)
#define write_trylock_irqsave(lock, flags) _raw_write_trylock_irqsave(lock, &(flags))
#ifdef arch_rwlock_is_contended#define rwlock_is_contended(lock) \ arch_rwlock_is_contended(&(lock)->raw_lock)#else#define rwlock_is_contended(lock) ((void)(lock), 0)#endif /* arch_rwlock_is_contended */
#endif /* __LINUX_RWLOCK_H */