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/module.h>
    2 #include <linux/spinlock.h>
    3 #include <asm/atomic.h>
    4 
    5 /*
    6  * This is an architecture-neutral, but slow,
    7  * implementation of the notion of "decrement
    8  * a reference count, and return locked if it
    9  * decremented to zero".
   10  *
   11  * NOTE NOTE NOTE! This is _not_ equivalent to
   12  *
   13  *      if (atomic_dec_and_test(&atomic)) {
   14  *              spin_lock(&lock);
   15  *              return 1;
   16  *      }
   17  *      return 0;
   18  *
   19  * because the spin-lock and the decrement must be
   20  * "atomic".
   21  *
   22  * This slow version gets the spinlock unconditionally,
   23  * and releases it if it isn't needed. Architectures
   24  * are encouraged to come up with better approaches,
   25  * this is trivially done efficiently using a load-locked
   26  * store-conditional approach, for example.
   27  */
   28 
   29 #ifndef ATOMIC_DEC_AND_LOCK
   30 int atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock)
   31 {
   32         spin_lock(lock);
   33         if (atomic_dec_and_test(atomic))
   34                 return 1;
   35         spin_unlock(lock);
   36         return 0;
   37 }
   38 
   39 EXPORT_SYMBOL(atomic_dec_and_lock);
   40 #endif

Cache object: 82e9f92f02ef1039c9b0fdf13a109329


[ 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.