Linux Audio

Check our new training course

Loading...
v4.6
 
 1#ifndef __TOOLS_ASM_GENERIC_ATOMIC_H
 2#define __TOOLS_ASM_GENERIC_ATOMIC_H
 3
 4#include <linux/compiler.h>
 5#include <linux/types.h>
 6
 7/*
 8 * Atomic operations that C can't guarantee us.  Useful for
 9 * resource counting etc..
10 *
11 * Excerpts obtained from the Linux kernel sources.
12 */
13
14#define ATOMIC_INIT(i)	{ (i) }
15
16/**
17 * atomic_read - read atomic variable
18 * @v: pointer of type atomic_t
19 *
20 * Atomically reads the value of @v.
21 */
22static inline int atomic_read(const atomic_t *v)
23{
24	return ACCESS_ONCE((v)->counter);
25}
26
27/**
28 * atomic_set - set atomic variable
29 * @v: pointer of type atomic_t
30 * @i: required value
31 *
32 * Atomically sets the value of @v to @i.
33 */
34static inline void atomic_set(atomic_t *v, int i)
35{
36        v->counter = i;
37}
38
39/**
40 * atomic_inc - increment atomic variable
41 * @v: pointer of type atomic_t
42 *
43 * Atomically increments @v by 1.
44 */
45static inline void atomic_inc(atomic_t *v)
46{
47	__sync_add_and_fetch(&v->counter, 1);
48}
49
50/**
51 * atomic_dec_and_test - decrement and test
52 * @v: pointer of type atomic_t
53 *
54 * Atomically decrements @v by 1 and
55 * returns true if the result is 0, or false for all other
56 * cases.
57 */
58static inline int atomic_dec_and_test(atomic_t *v)
59{
60	return __sync_sub_and_fetch(&v->counter, 1) == 0;
 
 
 
 
 
 
 
 
61}
62
63#endif /* __TOOLS_ASM_GENERIC_ATOMIC_H */
v4.17
 1/* SPDX-License-Identifier: GPL-2.0 */
 2#ifndef __TOOLS_ASM_GENERIC_ATOMIC_H
 3#define __TOOLS_ASM_GENERIC_ATOMIC_H
 4
 5#include <linux/compiler.h>
 6#include <linux/types.h>
 7
 8/*
 9 * Atomic operations that C can't guarantee us.  Useful for
10 * resource counting etc..
11 *
12 * Excerpts obtained from the Linux kernel sources.
13 */
14
15#define ATOMIC_INIT(i)	{ (i) }
16
17/**
18 * atomic_read - read atomic variable
19 * @v: pointer of type atomic_t
20 *
21 * Atomically reads the value of @v.
22 */
23static inline int atomic_read(const atomic_t *v)
24{
25	return READ_ONCE((v)->counter);
26}
27
28/**
29 * atomic_set - set atomic variable
30 * @v: pointer of type atomic_t
31 * @i: required value
32 *
33 * Atomically sets the value of @v to @i.
34 */
35static inline void atomic_set(atomic_t *v, int i)
36{
37        v->counter = i;
38}
39
40/**
41 * atomic_inc - increment atomic variable
42 * @v: pointer of type atomic_t
43 *
44 * Atomically increments @v by 1.
45 */
46static inline void atomic_inc(atomic_t *v)
47{
48	__sync_add_and_fetch(&v->counter, 1);
49}
50
51/**
52 * atomic_dec_and_test - decrement and test
53 * @v: pointer of type atomic_t
54 *
55 * Atomically decrements @v by 1 and
56 * returns true if the result is 0, or false for all other
57 * cases.
58 */
59static inline int atomic_dec_and_test(atomic_t *v)
60{
61	return __sync_sub_and_fetch(&v->counter, 1) == 0;
62}
63
64#define cmpxchg(ptr, oldval, newval) \
65	__sync_val_compare_and_swap(ptr, oldval, newval)
66
67static inline int atomic_cmpxchg(atomic_t *v, int oldval, int newval)
68{
69	return cmpxchg(&(v)->counter, oldval, newval);
70}
71
72#endif /* __TOOLS_ASM_GENERIC_ATOMIC_H */