Subversion Repositories Kolibri OS

Rev

Rev 5270 | Rev 6934 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5270 serge 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 
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
 
23
typedef atomic64_t atomic_long_t;
24
 
25
#define ATOMIC_LONG_INIT(i)	ATOMIC64_INIT(i)
6082 serge 26
#define ATOMIC_LONG_PFX(x)	atomic64 ## x
5270 serge 27
 
6082 serge 28
#else
5270 serge 29
 
6082 serge 30
typedef atomic_t atomic_long_t;
5270 serge 31
 
6082 serge 32
#define ATOMIC_LONG_INIT(i)	ATOMIC_INIT(i)
33
#define ATOMIC_LONG_PFX(x)	atomic ## x
5270 serge 34
 
6082 serge 35
#endif
5270 serge 36
 
6082 serge 37
#define ATOMIC_LONG_READ_OP(mo)						\
38
static inline long atomic_long_read##mo(const 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);			\
5270 serge 43
}
6082 serge 44
ATOMIC_LONG_READ_OP()
45
ATOMIC_LONG_READ_OP(_acquire)
5270 serge 46
 
6082 serge 47
#undef ATOMIC_LONG_READ_OP
5270 serge 48
 
6082 serge 49
#define ATOMIC_LONG_SET_OP(mo)						\
50
static 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);				\
5270 serge 55
}
6082 serge 56
ATOMIC_LONG_SET_OP()
57
ATOMIC_LONG_SET_OP(_release)
5270 serge 58
 
6082 serge 59
#undef ATOMIC_LONG_SET_OP
5270 serge 60
 
6082 serge 61
#define ATOMIC_LONG_ADD_SUB_OP(op, mo)					\
62
static inline long							\
63
atomic_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);		\
5270 serge 68
}
6082 serge 69
ATOMIC_LONG_ADD_SUB_OP(add,)
70
ATOMIC_LONG_ADD_SUB_OP(add, _relaxed)
71
ATOMIC_LONG_ADD_SUB_OP(add, _acquire)
72
ATOMIC_LONG_ADD_SUB_OP(add, _release)
73
ATOMIC_LONG_ADD_SUB_OP(sub,)
74
ATOMIC_LONG_ADD_SUB_OP(sub, _relaxed)
75
ATOMIC_LONG_ADD_SUB_OP(sub, _acquire)
76
ATOMIC_LONG_ADD_SUB_OP(sub, _release)
5270 serge 77
 
6082 serge 78
#undef ATOMIC_LONG_ADD_SUB_OP
5270 serge 79
 
6082 serge 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)))
5270 serge 91
 
6082 serge 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)))
5270 serge 98
#define atomic_long_xchg(v, new) \
6082 serge 99
	(ATOMIC_LONG_PFX(_xchg)((ATOMIC_LONG_PFX(_t) *)(v), (new)))
5270 serge 100
 
101
static inline void atomic_long_inc(atomic_long_t *l)
102
{
6082 serge 103
	ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l;
5270 serge 104
 
6082 serge 105
	ATOMIC_LONG_PFX(_inc)(v);
5270 serge 106
}
107
 
108
static inline void atomic_long_dec(atomic_long_t *l)
109
{
6082 serge 110
	ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l;
5270 serge 111
 
6082 serge 112
	ATOMIC_LONG_PFX(_dec)(v);
5270 serge 113
}
114
 
6082 serge 115
#define ATOMIC_LONG_OP(op)						\
116
static inline void							\
117
atomic_long_##op(long i, atomic_long_t *l)				\
118
{									\
119
	ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l;		\
120
									\
121
	ATOMIC_LONG_PFX(_##op)(i, v);					\
5270 serge 122
}
123
 
6082 serge 124
ATOMIC_LONG_OP(add)
125
ATOMIC_LONG_OP(sub)
126
ATOMIC_LONG_OP(and)
127
ATOMIC_LONG_OP(or)
128
ATOMIC_LONG_OP(xor)
129
ATOMIC_LONG_OP(andnot)
5270 serge 130
 
6082 serge 131
#undef ATOMIC_LONG_OP
5270 serge 132
 
133
static inline int atomic_long_sub_and_test(long i, atomic_long_t *l)
134
{
6082 serge 135
	ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l;
5270 serge 136
 
6082 serge 137
	return ATOMIC_LONG_PFX(_sub_and_test)(i, v);
5270 serge 138
}
139
 
140
static inline int atomic_long_dec_and_test(atomic_long_t *l)
141
{
6082 serge 142
	ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l;
5270 serge 143
 
6082 serge 144
	return ATOMIC_LONG_PFX(_dec_and_test)(v);
5270 serge 145
}
146
 
147
static inline int atomic_long_inc_and_test(atomic_long_t *l)
148
{
6082 serge 149
	ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l;
5270 serge 150
 
6082 serge 151
	return ATOMIC_LONG_PFX(_inc_and_test)(v);
5270 serge 152
}
153
 
154
static inline int atomic_long_add_negative(long i, atomic_long_t *l)
155
{
6082 serge 156
	ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l;
5270 serge 157
 
6082 serge 158
	return ATOMIC_LONG_PFX(_add_negative)(i, v);
5270 serge 159
}
160
 
6082 serge 161
#define ATOMIC_LONG_INC_DEC_OP(op, mo)					\
162
static inline long							\
163
atomic_long_##op##_return##mo(atomic_long_t *l)				\
164
{									\
165
	ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l;		\
166
									\
167
	return (long)ATOMIC_LONG_PFX(_##op##_return##mo)(v);		\
5270 serge 168
}
6082 serge 169
ATOMIC_LONG_INC_DEC_OP(inc,)
170
ATOMIC_LONG_INC_DEC_OP(inc, _relaxed)
171
ATOMIC_LONG_INC_DEC_OP(inc, _acquire)
172
ATOMIC_LONG_INC_DEC_OP(inc, _release)
173
ATOMIC_LONG_INC_DEC_OP(dec,)
174
ATOMIC_LONG_INC_DEC_OP(dec, _relaxed)
175
ATOMIC_LONG_INC_DEC_OP(dec, _acquire)
176
ATOMIC_LONG_INC_DEC_OP(dec, _release)
5270 serge 177
 
6082 serge 178
#undef ATOMIC_LONG_INC_DEC_OP
5270 serge 179
 
180
static inline long atomic_long_add_unless(atomic_long_t *l, long a, long u)
181
{
6082 serge 182
	ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l;
5270 serge 183
 
6082 serge 184
	return (long)ATOMIC_LONG_PFX(_add_unless)(v, a, u);
5270 serge 185
}
186
 
6082 serge 187
#define atomic_long_inc_not_zero(l) \
188
	ATOMIC_LONG_PFX(_inc_not_zero)((ATOMIC_LONG_PFX(_t) *)(l))
5270 serge 189
 
190
#endif  /*  _ASM_GENERIC_ATOMIC_LONG_H  */