The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/lib/dec_and_lock.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 #include <linux/export.h>
    2 #include <linux/spinlock.h>
    3 #include <linux/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         /* Subtract 1 from counter unless that drops it to 0 (ie. it was 1) */
   23         if (atomic_add_unless(atomic, -1, 1))
   24                 return 0;
   25 
   26         /* Otherwise do it the slow way */
   27         spin_lock(lock);
   28         if (atomic_dec_and_test(atomic))
   29                 return 1;
   30         spin_unlock(lock);
   31         return 0;
   32 }
   33 
   34 EXPORT_SYMBOL(_atomic_dec_and_lock);

Cache object: e13d27694790a03df883739f5a93e46c


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.