Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.3-rc6 181 lines 4.9 kB view raw
1#ifndef _ASM_GENERIC_ATOMIC_LONG_H 2#define _ASM_GENERIC_ATOMIC_LONG_H 3/* 4 * Copyright (C) 2005 Silicon Graphics, Inc. 5 * Christoph Lameter 6 * 7 * Allows to provide arch independent atomic definitions without the need to 8 * edit all arch specific atomic.h files. 9 */ 10 11#include <asm/types.h> 12 13/* 14 * Suppport for atomic_long_t 15 * 16 * Casts for parameters are avoided for existing atomic functions in order to 17 * avoid issues with cast-as-lval under gcc 4.x and other limitations that the 18 * macros of a platform may have. 19 */ 20 21#if BITS_PER_LONG == 64 22 23typedef atomic64_t atomic_long_t; 24 25#define ATOMIC_LONG_INIT(i) ATOMIC64_INIT(i) 26#define ATOMIC_LONG_PFX(x) atomic64 ## x 27 28#else 29 30typedef atomic_t atomic_long_t; 31 32#define ATOMIC_LONG_INIT(i) ATOMIC_INIT(i) 33#define ATOMIC_LONG_PFX(x) atomic ## x 34 35#endif 36 37#define ATOMIC_LONG_READ_OP(mo) \ 38static inline long atomic_long_read##mo(atomic_long_t *l) \ 39{ \ 40 ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; \ 41 \ 42 return (long)ATOMIC_LONG_PFX(_read##mo)(v); \ 43} 44ATOMIC_LONG_READ_OP() 45ATOMIC_LONG_READ_OP(_acquire) 46 47#undef ATOMIC_LONG_READ_OP 48 49#define ATOMIC_LONG_SET_OP(mo) \ 50static inline void atomic_long_set##mo(atomic_long_t *l, long i) \ 51{ \ 52 ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; \ 53 \ 54 ATOMIC_LONG_PFX(_set##mo)(v, i); \ 55} 56ATOMIC_LONG_SET_OP() 57ATOMIC_LONG_SET_OP(_release) 58 59#undef ATOMIC_LONG_SET_OP 60 61#define ATOMIC_LONG_ADD_SUB_OP(op, mo) \ 62static inline long \ 63atomic_long_##op##_return##mo(long i, atomic_long_t *l) \ 64{ \ 65 ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; \ 66 \ 67 return (long)ATOMIC_LONG_PFX(_##op##_return##mo)(i, v); \ 68} 69ATOMIC_LONG_ADD_SUB_OP(add,) 70ATOMIC_LONG_ADD_SUB_OP(add, _relaxed) 71ATOMIC_LONG_ADD_SUB_OP(add, _acquire) 72ATOMIC_LONG_ADD_SUB_OP(add, _release) 73ATOMIC_LONG_ADD_SUB_OP(sub,) 74ATOMIC_LONG_ADD_SUB_OP(sub, _relaxed) 75ATOMIC_LONG_ADD_SUB_OP(sub, _acquire) 76ATOMIC_LONG_ADD_SUB_OP(sub, _release) 77 78#undef ATOMIC_LONG_ADD_SUB_OP 79 80#define atomic_long_cmpxchg_relaxed(l, old, new) \ 81 (ATOMIC_LONG_PFX(_cmpxchg_relaxed)((ATOMIC_LONG_PFX(_t) *)(l), \ 82 (old), (new))) 83#define atomic_long_cmpxchg_acquire(l, old, new) \ 84 (ATOMIC_LONG_PFX(_cmpxchg_acquire)((ATOMIC_LONG_PFX(_t) *)(l), \ 85 (old), (new))) 86#define atomic_long_cmpxchg_release(l, old, new) \ 87 (ATOMIC_LONG_PFX(_cmpxchg_release)((ATOMIC_LONG_PFX(_t) *)(l), \ 88 (old), (new))) 89#define atomic_long_cmpxchg(l, old, new) \ 90 (ATOMIC_LONG_PFX(_cmpxchg)((ATOMIC_LONG_PFX(_t) *)(l), (old), (new))) 91 92#define atomic_long_xchg_relaxed(v, new) \ 93 (ATOMIC_LONG_PFX(_xchg_relaxed)((ATOMIC_LONG_PFX(_t) *)(v), (new))) 94#define atomic_long_xchg_acquire(v, new) \ 95 (ATOMIC_LONG_PFX(_xchg_acquire)((ATOMIC_LONG_PFX(_t) *)(v), (new))) 96#define atomic_long_xchg_release(v, new) \ 97 (ATOMIC_LONG_PFX(_xchg_release)((ATOMIC_LONG_PFX(_t) *)(v), (new))) 98#define atomic_long_xchg(v, new) \ 99 (ATOMIC_LONG_PFX(_xchg)((ATOMIC_LONG_PFX(_t) *)(v), (new))) 100 101static inline void atomic_long_inc(atomic_long_t *l) 102{ 103 ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; 104 105 ATOMIC_LONG_PFX(_inc)(v); 106} 107 108static inline void atomic_long_dec(atomic_long_t *l) 109{ 110 ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; 111 112 ATOMIC_LONG_PFX(_dec)(v); 113} 114 115static inline void atomic_long_add(long i, atomic_long_t *l) 116{ 117 ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; 118 119 ATOMIC_LONG_PFX(_add)(i, v); 120} 121 122static inline void atomic_long_sub(long i, atomic_long_t *l) 123{ 124 ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; 125 126 ATOMIC_LONG_PFX(_sub)(i, v); 127} 128 129static inline int atomic_long_sub_and_test(long i, atomic_long_t *l) 130{ 131 ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; 132 133 return ATOMIC_LONG_PFX(_sub_and_test)(i, v); 134} 135 136static inline int atomic_long_dec_and_test(atomic_long_t *l) 137{ 138 ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; 139 140 return ATOMIC_LONG_PFX(_dec_and_test)(v); 141} 142 143static inline int atomic_long_inc_and_test(atomic_long_t *l) 144{ 145 ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; 146 147 return ATOMIC_LONG_PFX(_inc_and_test)(v); 148} 149 150static inline int atomic_long_add_negative(long i, atomic_long_t *l) 151{ 152 ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; 153 154 return ATOMIC_LONG_PFX(_add_negative)(i, v); 155} 156 157static inline long atomic_long_inc_return(atomic_long_t *l) 158{ 159 ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; 160 161 return (long)ATOMIC_LONG_PFX(_inc_return)(v); 162} 163 164static inline long atomic_long_dec_return(atomic_long_t *l) 165{ 166 ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; 167 168 return (long)ATOMIC_LONG_PFX(_dec_return)(v); 169} 170 171static inline long atomic_long_add_unless(atomic_long_t *l, long a, long u) 172{ 173 ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; 174 175 return (long)ATOMIC_LONG_PFX(_add_unless)(v, a, u); 176} 177 178#define atomic_long_inc_not_zero(l) \ 179 ATOMIC_LONG_PFX(_inc_not_zero)((ATOMIC_LONG_PFX(_t) *)(l)) 180 181#endif /* _ASM_GENERIC_ATOMIC_LONG_H */