rwsem.h 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /* $Id: rwsem.h,v 1.5 2001/11/18 00:12:56 davem Exp $
  2. * rwsem.h: R/W semaphores implemented using CAS
  3. *
  4. * Written by David S. Miller (davem@redhat.com), 2001.
  5. * Derived from asm-i386/rwsem.h
  6. */
  7. #ifndef _SPARC64_RWSEM_H
  8. #define _SPARC64_RWSEM_H
  9. #ifndef _LINUX_RWSEM_H
  10. #error "please don't include asm/rwsem.h directly, use linux/rwsem.h instead"
  11. #endif
  12. #ifdef __KERNEL__
  13. #include <linux/list.h>
  14. #include <linux/spinlock.h>
  15. #include <asm/rwsem-const.h>
  16. struct rwsem_waiter;
  17. struct rw_semaphore {
  18. signed int count;
  19. spinlock_t wait_lock;
  20. struct list_head wait_list;
  21. };
  22. #define __RWSEM_INITIALIZER(name) \
  23. { RWSEM_UNLOCKED_VALUE, SPIN_LOCK_UNLOCKED, LIST_HEAD_INIT((name).wait_list) }
  24. #define DECLARE_RWSEM(name) \
  25. struct rw_semaphore name = __RWSEM_INITIALIZER(name)
  26. static __inline__ void init_rwsem(struct rw_semaphore *sem)
  27. {
  28. sem->count = RWSEM_UNLOCKED_VALUE;
  29. spin_lock_init(&sem->wait_lock);
  30. INIT_LIST_HEAD(&sem->wait_list);
  31. }
  32. extern void __down_read(struct rw_semaphore *sem);
  33. extern int __down_read_trylock(struct rw_semaphore *sem);
  34. extern void __down_write(struct rw_semaphore *sem);
  35. extern int __down_write_trylock(struct rw_semaphore *sem);
  36. extern void __up_read(struct rw_semaphore *sem);
  37. extern void __up_write(struct rw_semaphore *sem);
  38. extern void __downgrade_write(struct rw_semaphore *sem);
  39. static inline int rwsem_atomic_update(int delta, struct rw_semaphore *sem)
  40. {
  41. return atomic_add_return(delta, (atomic_t *)(&sem->count));
  42. }
  43. static inline void rwsem_atomic_add(int delta, struct rw_semaphore *sem)
  44. {
  45. atomic_add(delta, (atomic_t *)(&sem->count));
  46. }
  47. static inline int rwsem_is_locked(struct rw_semaphore *sem)
  48. {
  49. return (sem->count != 0);
  50. }
  51. #endif /* __KERNEL__ */
  52. #endif /* _SPARC64_RWSEM_H */