home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / sh / include / asm / atomic.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  2.0 KB  |  90 lines

  1. #ifndef __ASM_SH_ATOMIC_H
  2. #define __ASM_SH_ATOMIC_H
  3.  
  4. /*
  5.  * Atomic operations that C can't guarantee us.  Useful for
  6.  * resource counting etc..
  7.  *
  8.  */
  9.  
  10. typedef struct { volatile int counter; } atomic_t;
  11.  
  12. #define ATOMIC_INIT(i)    ( (atomic_t) { (i) } )
  13.  
  14. #define atomic_read(v)        ((v)->counter)
  15. #define atomic_set(v,i)        ((v)->counter = (i))
  16.  
  17. #include <linux/compiler.h>
  18. #include <asm/system.h>
  19.  
  20. #if defined(CONFIG_GUSA_RB)
  21. #include <asm/atomic-grb.h>
  22. #elif defined(CONFIG_CPU_SH4A)
  23. #include <asm/atomic-llsc.h>
  24. #else
  25. #include <asm/atomic-irq.h>
  26. #endif
  27.  
  28. #define atomic_add_negative(a, v)    (atomic_add_return((a), (v)) < 0)
  29.  
  30. #define atomic_dec_return(v) atomic_sub_return(1,(v))
  31. #define atomic_inc_return(v) atomic_add_return(1,(v))
  32.  
  33. /*
  34.  * atomic_inc_and_test - increment and test
  35.  * @v: pointer of type atomic_t
  36.  *
  37.  * Atomically increments @v by 1
  38.  * and returns true if the result is zero, or false for all
  39.  * other cases.
  40.  */
  41. #define atomic_inc_and_test(v) (atomic_inc_return(v) == 0)
  42.  
  43. #define atomic_sub_and_test(i,v) (atomic_sub_return((i), (v)) == 0)
  44. #define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0)
  45.  
  46. #define atomic_inc(v) atomic_add(1,(v))
  47. #define atomic_dec(v) atomic_sub(1,(v))
  48.  
  49. #ifndef CONFIG_GUSA_RB
  50. static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
  51. {
  52.     int ret;
  53.     unsigned long flags;
  54.  
  55.     local_irq_save(flags);
  56.     ret = v->counter;
  57.     if (likely(ret == old))
  58.         v->counter = new;
  59.     local_irq_restore(flags);
  60.  
  61.     return ret;
  62. }
  63.  
  64. static inline int atomic_add_unless(atomic_t *v, int a, int u)
  65. {
  66.     int ret;
  67.     unsigned long flags;
  68.  
  69.     local_irq_save(flags);
  70.     ret = v->counter;
  71.     if (ret != u)
  72.         v->counter += a;
  73.     local_irq_restore(flags);
  74.  
  75.     return ret != u;
  76. }
  77. #endif
  78.  
  79. #define atomic_xchg(v, new) (xchg(&((v)->counter), new))
  80. #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
  81.  
  82. /* Atomic operations are already serializing on SH */
  83. #define smp_mb__before_atomic_dec()    barrier()
  84. #define smp_mb__after_atomic_dec()    barrier()
  85. #define smp_mb__before_atomic_inc()    barrier()
  86. #define smp_mb__after_atomic_inc()    barrier()
  87.  
  88. #include <asm-generic/atomic.h>
  89. #endif /* __ASM_SH_ATOMIC_H */
  90.