Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 /* rwsem-spinlock.h: fallback C implementation
  2  *
  3  * Copyright (c) 2001   David Howells (dhowells@redhat.com).
  4  * - Derived partially from ideas by Andrea Arcangeli <andrea@suse.de>
  5  * - Derived also from comments by Linus
  6  */
  7 
  8 #ifndef _LINUX_RWSEM_SPINLOCK_H
  9 #define _LINUX_RWSEM_SPINLOCK_H
 10 
 11 #ifndef _LINUX_RWSEM_H
 12 #error "please don't include linux/rwsem-spinlock.h directly, use linux/rwsem.h instead"
 13 #endif
 14 
 15 #include <linux/spinlock.h>
 16 #include <linux/list.h>
 17 
 18 #ifdef __KERNEL__
 19 
 20 #include <linux/types.h>
 21 
 22 struct rwsem_waiter;
 23 
 24 /*
 25  * the rw-semaphore definition
 26  * - if activity is 0 then there are no active readers or writers
 27  * - if activity is +ve then that is the number of active readers
 28  * - if activity is -1 then there is one active writer
 29  * - if wait_list is not empty, then there are processes waiting for the semaphore
 30  */
 31 struct compat_rw_semaphore {
 32         __s32                   activity;
 33         spinlock_t              wait_lock;
 34         struct list_head        wait_list;
 35 #ifdef CONFIG_DEBUG_LOCK_ALLOC
 36         struct lockdep_map dep_map;
 37 #endif
 38 };
 39 
 40 #ifdef CONFIG_DEBUG_LOCK_ALLOC
 41 # define __RWSEM_DEP_MAP_INIT(lockname) , .dep_map = { .name = #lockname }
 42 #else
 43 # define __RWSEM_DEP_MAP_INIT(lockname)
 44 #endif
 45 
 46 #define __COMPAT_RWSEM_INITIALIZER(name) \
 47 { 0, SPIN_LOCK_UNLOCKED, LIST_HEAD_INIT((name).wait_list) __RWSEM_DEP_MAP_INIT(name) }
 48 
 49 #define COMPAT_DECLARE_RWSEM(name) \
 50         struct compat_rw_semaphore name = __COMPAT_RWSEM_INITIALIZER(name)
 51 
 52 extern void __compat_init_rwsem(struct compat_rw_semaphore *sem, const char *name,
 53                          struct lock_class_key *key);
 54 
 55 #define compat_init_rwsem(sem)                                  \
 56 do {                                                            \
 57         static struct lock_class_key __key;                     \
 58                                                                 \
 59         __compat_init_rwsem((sem), #sem, &__key);               \
 60 } while (0)
 61 
 62 extern void __down_read(struct compat_rw_semaphore *sem);
 63 extern int __down_read_trylock(struct compat_rw_semaphore *sem);
 64 extern void __down_write(struct compat_rw_semaphore *sem);
 65 extern void __down_write_nested(struct compat_rw_semaphore *sem, int subclass);
 66 extern int __down_write_trylock(struct compat_rw_semaphore *sem);
 67 extern void __up_read(struct compat_rw_semaphore *sem);
 68 extern void __up_write(struct compat_rw_semaphore *sem);
 69 extern void __downgrade_write(struct compat_rw_semaphore *sem);
 70 
 71 static inline int compat_rwsem_is_locked(struct compat_rw_semaphore *sem)
 72 {
 73         return (sem->activity != 0);
 74 }
 75 
 76 #endif /* __KERNEL__ */
 77 #endif /* _LINUX_RWSEM_SPINLOCK_H */
 78 
  This page was automatically generated by the LXR engine.