X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=include%2Fasm-sh%2Fspinlock.h;h=e770b55649ebb88f0838e1b760844630f1cbf141;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=31f45f2a768266389a1fb3b62de7815dfef770d8;hpb=87fc8d1bb10cd459024a742c6a10961fefcef18f;p=linux-2.6.git diff --git a/include/asm-sh/spinlock.h b/include/asm-sh/spinlock.h index 31f45f2a7..e770b5564 100644 --- a/include/asm-sh/spinlock.h +++ b/include/asm-sh/spinlock.h @@ -17,6 +17,9 @@ */ typedef struct { volatile unsigned long lock; +#ifdef CONFIG_PREEMPT + unsigned int break_lock; +#endif } spinlock_t; #define SPIN_LOCK_UNLOCKED (spinlock_t) { 0 } @@ -48,9 +51,7 @@ static inline void _raw_spin_lock(spinlock_t *lock) static inline void _raw_spin_unlock(spinlock_t *lock) { -#ifdef CONFIG_DEBUG_SPINLOCK - BUG_ON(!spin_is_locked(lock)); -#endif + assert_spin_locked(lock); lock->lock = 0; } @@ -68,12 +69,14 @@ static inline void _raw_spin_unlock(spinlock_t *lock) typedef struct { spinlock_t lock; atomic_t counter; +#ifdef CONFIG_PREEMPT + unsigned int break_lock; +#endif } rwlock_t; #define RW_LOCK_BIAS 0x01000000 #define RW_LOCK_UNLOCKED (rwlock_t) { { 0 }, { RW_LOCK_BIAS } } #define rwlock_init(x) do { *(x) = RW_LOCK_UNLOCKED; } while (0) -#define rwlock_is_locked(x) (atomic_read(&(x)->counter) != RW_LOCK_BIAS) static inline void _raw_read_lock(rwlock_t *rw) { @@ -105,6 +108,8 @@ static inline void _raw_write_unlock(rwlock_t *rw) _raw_spin_unlock(&rw->lock); } +#define _raw_read_trylock(lock) generic_raw_read_trylock(lock) + static inline int _raw_write_trylock(rwlock_t *rw) { if (atomic_sub_and_test(RW_LOCK_BIAS, &rw->counter))