Version:  2.6.24 2.6.25 2.6.26 2.6.27 2.6.28

Architecture:  x86 m68k m68knommu mips powerpc sh blackfin

Linux/lib/dec_and_lock.c

  1 #include <linux/module.h>
  2 #include <linux/spinlock.h>
  3 #include <asm/atomic.h>
  4 
  5 /*
  6  * This is an implementation of the notion of "decrement a
  7  * reference count, and return locked if it decremented to zero".
  8  *
  9  * NOTE NOTE NOTE! This is _not_ equivalent to
 10  *
 11  *      if (atomic_dec_and_test(&atomic)) {
 12  *              spin_lock(&lock);
 13  *              return 1;
 14  *      }
 15  *      return 0;
 16  *
 17  * because the spin-lock and the decrement must be
 18  * "atomic".
 19  */
 20 int _atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock)
 21 {
 22 #ifdef CONFIG_SMP
 23         /* Subtract 1 from counter unless that drops it to 0 (ie. it was 1) */
 24         if (atomic_add_unless(atomic, -1, 1))
 25                 return 0;
 26 #endif
 27         /* Otherwise do it the slow way */
 28         spin_lock(lock);
 29         if (atomic_dec_and_test(atomic))
 30                 return 1;
 31         spin_unlock(lock);
 32         return 0;
 33 }
 34 
 35 EXPORT_SYMBOL(_atomic_dec_and_lock);
 36 

This page was automatically generated by LXR 0.3.1.  •  Linux is a registered trademark of Linus Torvalds