linux/arch/alpha/lib/dec_and_lock.c
<<
>>
Prefs
   1/*
   2 * arch/alpha/lib/dec_and_lock.c
   3 *
   4 * ll/sc version of atomic_dec_and_lock()
   5 * 
   6 */
   7
   8#include <linux/spinlock.h>
   9#include <asm/atomic.h>
  10
  11  asm (".text                                   \n\
  12        .global _atomic_dec_and_lock            \n\
  13        .ent _atomic_dec_and_lock               \n\
  14        .align  4                               \n\
  15_atomic_dec_and_lock:                           \n\
  16        .prologue 0                             \n\
  171:      ldl_l   $1, 0($16)                      \n\
  18        subl    $1, 1, $1                       \n\
  19        beq     $1, 2f                          \n\
  20        stl_c   $1, 0($16)                      \n\
  21        beq     $1, 4f                          \n\
  22        mb                                      \n\
  23        clr     $0                              \n\
  24        ret                                     \n\
  252:      br      $29, 3f                         \n\
  263:      ldgp    $29, 0($29)                     \n\
  27        br      $atomic_dec_and_lock_1..ng      \n\
  28        .subsection 2                           \n\
  294:      br      1b                              \n\
  30        .previous                               \n\
  31        .end _atomic_dec_and_lock");
  32
  33static int __used atomic_dec_and_lock_1(atomic_t *atomic, spinlock_t *lock)
  34{
  35        /* Slow path */
  36        spin_lock(lock);
  37        if (atomic_dec_and_test(atomic))
  38                return 1;
  39        spin_unlock(lock);
  40        return 0;
  41}
  42