Home | History | Annotate | Download | only in linux
      1 #ifndef __LINUX_SPINLOCK_UP_H
      2 #define __LINUX_SPINLOCK_UP_H
      3 
      4 #ifndef __LINUX_SPINLOCK_H
      5 # error "please don't include this file directly"
      6 #endif
      7 
      8 /*
      9  * include/linux/spinlock_up.h - UP-debug version of spinlocks.
     10  *
     11  * portions Copyright 2005, Red Hat, Inc., Ingo Molnar
     12  * Released under the General Public License (GPL).
     13  *
     14  * In the debug case, 1 means unlocked, 0 means locked. (the values
     15  * are inverted, to catch initialization bugs)
     16  *
     17  * No atomicity anywhere, we are on UP.
     18  */
     19 
     20 #ifdef CONFIG_DEBUG_SPINLOCK
     21 #define __raw_spin_is_locked(x)		((x)->slock == 0)
     22 
     23 static inline void __raw_spin_lock(raw_spinlock_t *lock)
     24 {
     25 	lock->slock = 0;
     26 }
     27 
     28 static inline void
     29 __raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long flags)
     30 {
     31 	local_irq_save(flags);
     32 	lock->slock = 0;
     33 }
     34 
     35 static inline int __raw_spin_trylock(raw_spinlock_t *lock)
     36 {
     37 	char oldval = lock->slock;
     38 
     39 	lock->slock = 0;
     40 
     41 	return oldval > 0;
     42 }
     43 
     44 static inline void __raw_spin_unlock(raw_spinlock_t *lock)
     45 {
     46 	lock->slock = 1;
     47 }
     48 
     49 /*
     50  * Read-write spinlocks. No debug version.
     51  */
     52 #define __raw_read_lock(lock)		do { (void)(lock); } while (0)
     53 #define __raw_write_lock(lock)		do { (void)(lock); } while (0)
     54 #define __raw_read_trylock(lock)	({ (void)(lock); 1; })
     55 #define __raw_write_trylock(lock)	({ (void)(lock); 1; })
     56 #define __raw_read_unlock(lock)		do { (void)(lock); } while (0)
     57 #define __raw_write_unlock(lock)	do { (void)(lock); } while (0)
     58 
     59 #else /* DEBUG_SPINLOCK */
     60 #define __raw_spin_is_locked(lock)	((void)(lock), 0)
     61 /* for sched.c and kernel_lock.c: */
     62 # define __raw_spin_lock(lock)		do { (void)(lock); } while (0)
     63 # define __raw_spin_unlock(lock)	do { (void)(lock); } while (0)
     64 # define __raw_spin_trylock(lock)	({ (void)(lock); 1; })
     65 #endif /* DEBUG_SPINLOCK */
     66 
     67 #define __raw_read_can_lock(lock)	(((void)(lock), 1))
     68 #define __raw_write_can_lock(lock)	(((void)(lock), 1))
     69 
     70 #define __raw_spin_unlock_wait(lock) \
     71 		do { cpu_relax(); } while (__raw_spin_is_locked(lock))
     72 
     73 #endif /* __LINUX_SPINLOCK_UP_H */
     74