Blame view

include/linux/atomic.h 2.44 KB
acac43e2f   Arun Sharma   atomic: Update co...
1
  /* Atomic operations usable in machine independent code */
3f9d35b95   Eric Dumazet   atomic: add atomi...
2
3
4
5
6
  #ifndef _LINUX_ATOMIC_H
  #define _LINUX_ATOMIC_H
  #include <asm/atomic.h>
  
  /**
f24219b4e   Arun Sharma   atomic: move atom...
7
8
9
10
11
12
13
14
15
16
17
18
19
20
   * atomic_add_unless - add unless the number is already a given value
   * @v: pointer of type atomic_t
   * @a: the amount to add to v...
   * @u: ...unless v is equal to u.
   *
   * Atomically adds @a to @v, so long as @v was not already @u.
   * Returns non-zero if @v was not @u, and zero otherwise.
   */
  static inline int atomic_add_unless(atomic_t *v, int a, int u)
  {
  	return __atomic_add_unless(v, a, u) != u;
  }
  
  /**
60063497a   Arun Sharma   atomic: use <linu...
21
22
23
24
25
26
27
28
29
   * atomic_inc_not_zero - increment unless the number is zero
   * @v: pointer of type atomic_t
   *
   * Atomically increments @v by 1, so long as @v is non-zero.
   * Returns non-zero if @v was non-zero, and zero otherwise.
   */
  #define atomic_inc_not_zero(v)		atomic_add_unless((v), 1, 0)
  
  /**
3f9d35b95   Eric Dumazet   atomic: add atomi...
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
   * atomic_inc_not_zero_hint - increment if not null
   * @v: pointer of type atomic_t
   * @hint: probable value of the atomic before the increment
   *
   * This version of atomic_inc_not_zero() gives a hint of probable
   * value of the atomic. This helps processor to not read the memory
   * before doing the atomic read/modify/write cycle, lowering
   * number of bus transactions on some arches.
   *
   * Returns: 0 if increment was not done, 1 otherwise.
   */
  #ifndef atomic_inc_not_zero_hint
  static inline int atomic_inc_not_zero_hint(atomic_t *v, int hint)
  {
  	int val, c = hint;
  
  	/* sanity test, should be removed by compiler if hint is a constant */
  	if (!hint)
  		return atomic_inc_not_zero(v);
  
  	do {
  		val = atomic_cmpxchg(v, c, c + 1);
  		if (val == c)
  			return 1;
  		c = val;
  	} while (c);
  
  	return 0;
  }
  #endif
07b8ce1ee   Al Viro   lockless get_writ...
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
  #ifndef atomic_inc_unless_negative
  static inline int atomic_inc_unless_negative(atomic_t *p)
  {
  	int v, v1;
  	for (v = 0; v >= 0; v = v1) {
  		v1 = atomic_cmpxchg(p, v, v + 1);
  		if (likely(v1 == v))
  			return 1;
  	}
  	return 0;
  }
  #endif
  
  #ifndef atomic_dec_unless_positive
  static inline int atomic_dec_unless_positive(atomic_t *p)
  {
  	int v, v1;
  	for (v = 0; v <= 0; v = v1) {
  		v1 = atomic_cmpxchg(p, v, v - 1);
  		if (likely(v1 == v))
  			return 1;
  	}
  	return 0;
  }
  #endif
55c2945aa   Paul E. McKenney   atomic: Add atomi...
85
86
87
88
89
90
91
92
93
94
95
96
  #ifndef CONFIG_ARCH_HAS_ATOMIC_OR
  static inline void atomic_or(int i, atomic_t *v)
  {
  	int old;
  	int new;
  
  	do {
  		old = atomic_read(v);
  		new = old | i;
  	} while (atomic_cmpxchg(v, old, new) != old);
  }
  #endif /* #ifndef CONFIG_ARCH_HAS_ATOMIC_OR */
7847777a4   Arun Sharma   atomic: cleanup a...
97
98
99
100
  #include <asm-generic/atomic-long.h>
  #ifdef CONFIG_GENERIC_ATOMIC64
  #include <asm-generic/atomic64.h>
  #endif
3f9d35b95   Eric Dumazet   atomic: add atomi...
101
  #endif /* _LINUX_ATOMIC_H */