atomic.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:2k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef __ASM_SH_ATOMIC_H
  2. #define __ASM_SH_ATOMIC_H
  3. /*
  4.  * Atomic operations that C can't guarantee us.  Useful for
  5.  * resource counting etc..
  6.  *
  7.  */
  8. typedef struct { volatile int counter; } atomic_t;
  9. #define ATOMIC_INIT(i) ( (atomic_t) { (i) } )
  10. #define atomic_read(v) ((v)->counter)
  11. #define atomic_set(v,i) ((v)->counter = (i))
  12. #include <asm/system.h>
  13. /*
  14.  * To get proper branch prediction for the main line, we must branch
  15.  * forward to code at the end of this object's .text section, then
  16.  * branch back to restart the operation.
  17.  */
  18. static __inline__ void atomic_add(int i, atomic_t * v)
  19. {
  20. unsigned long flags;
  21. save_and_cli(flags);
  22. *(long *)v += i;
  23. restore_flags(flags);
  24. }
  25. static __inline__ void atomic_sub(int i, atomic_t *v)
  26. {
  27. unsigned long flags;
  28. save_and_cli(flags);
  29. *(long *)v -= i;
  30. restore_flags(flags);
  31. }
  32. static __inline__ int atomic_add_return(int i, atomic_t * v)
  33. {
  34. unsigned long temp, flags;
  35. save_and_cli(flags);
  36. temp = *(long *)v;
  37. temp += i;
  38. *(long *)v = temp;
  39. restore_flags(flags);
  40. return temp;
  41. }
  42. static __inline__ int atomic_sub_return(int i, atomic_t * v)
  43. {
  44. unsigned long temp, flags;
  45. save_and_cli(flags);
  46. temp = *(long *)v;
  47. temp -= i;
  48. *(long *)v = temp;
  49. restore_flags(flags);
  50. return temp;
  51. }
  52. #define atomic_dec_return(v) atomic_sub_return(1,(v))
  53. #define atomic_inc_return(v) atomic_add_return(1,(v))
  54. #define atomic_sub_and_test(i,v) (atomic_sub_return((i), (v)) == 0)
  55. #define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0)
  56. #define atomic_inc(v) atomic_add(1,(v))
  57. #define atomic_dec(v) atomic_sub(1,(v))
  58. static __inline__ void atomic_clear_mask(unsigned int mask, atomic_t *v)
  59. {
  60. unsigned long flags;
  61. save_and_cli(flags);
  62. *(long *)v &= ~mask;
  63. restore_flags(flags);
  64. }
  65. static __inline__ void atomic_set_mask(unsigned int mask, atomic_t *v)
  66. {
  67. unsigned long flags;
  68. save_and_cli(flags);
  69. *(long *)v |= mask;
  70. restore_flags(flags);
  71. }
  72. /* Atomic operations are already serializing on SH */
  73. #define smp_mb__before_atomic_dec() barrier()
  74. #define smp_mb__after_atomic_dec() barrier()
  75. #define smp_mb__before_atomic_inc() barrier()
  76. #define smp_mb__after_atomic_inc() barrier()
  77. #endif /* __ASM_SH_ATOMIC_H */