first
This commit is contained in:
81
include_lib/system/generic/atomic.h
Normal file
81
include_lib/system/generic/atomic.h
Normal file
@ -0,0 +1,81 @@
|
||||
#ifndef ATOMIC_H
|
||||
#define ATOMIC_H
|
||||
|
||||
#include "cpu.h"
|
||||
#include "irq.h"
|
||||
|
||||
typedef struct {
|
||||
int counter;
|
||||
} atomic_t;
|
||||
|
||||
static inline int atomic_add_return(int i, atomic_t *v)
|
||||
{
|
||||
int val;
|
||||
CPU_SR_ALLOC();
|
||||
|
||||
CPU_CRITICAL_ENTER();
|
||||
|
||||
val = v->counter;
|
||||
v->counter = val += i;
|
||||
|
||||
CPU_CRITICAL_EXIT();
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
|
||||
static inline int atomic_sub_return(int i, atomic_t *v)
|
||||
{
|
||||
int val;
|
||||
CPU_SR_ALLOC();
|
||||
|
||||
CPU_CRITICAL_ENTER();
|
||||
|
||||
val = v->counter;
|
||||
v->counter = val -= i;
|
||||
|
||||
CPU_CRITICAL_EXIT();
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline int atomic_set(atomic_t *v, int i)
|
||||
{
|
||||
int val = 0;
|
||||
CPU_SR_ALLOC();
|
||||
|
||||
CPU_CRITICAL_ENTER();
|
||||
|
||||
v->counter = i;
|
||||
|
||||
CPU_CRITICAL_EXIT();
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
|
||||
#define DEFINE_ATOMIC(x) \
|
||||
atomic_t x = {.counter = 0}
|
||||
|
||||
#define atomic_add(i, v) atomic_add_return(i, v)
|
||||
#define atomic_sub(i, v) atomic_sub_return(i, v)
|
||||
|
||||
#define atomic_read(v) arch_atomic_read(v)
|
||||
/*#define atomic_set(v,i) (((v)->counter) = (i))*/
|
||||
|
||||
#define atomic_inc(v) atomic_add(1, v)
|
||||
#define atomic_dec(v) atomic_sub(1, v)
|
||||
|
||||
#define atomic_inc_and_test(v) (atomic_add_return(1, v) == 0)
|
||||
#define atomic_dec_and_test(v) (atomic_sub_return(1, v) == 0)
|
||||
#define atomic_inc_return(v) (atomic_add_return(1, v))
|
||||
#define atomic_dec_return(v) (atomic_sub_return(1, v))
|
||||
#define atomic_sub_and_test(i, v) (atomic_sub_return(i, v) == 0)
|
||||
|
||||
#define atomic_add_negative(i,v) (atomic_add_return(i, v) < 0)
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user