55 lines
1.1 KiB
C
55 lines
1.1 KiB
C
#ifndef __PRIVATE_LIBNCP_GENERIC_ATOMIC_H__
|
|
#define __PRIVATE_LIBNCP_GENERIC_ATOMIC_H__
|
|
|
|
#include "config.h"
|
|
|
|
#include "private/libncp-lock.h"
|
|
|
|
typedef struct {
|
|
int counter;
|
|
ncpt_mutex_t mutex;
|
|
} ncpt_atomic_t;
|
|
|
|
#define NCPT_ATOMIC_INIT(i) { (i), NCPT_MUTEX_INITIALIZER }
|
|
|
|
static inline int ncpt_atomic_read(ncpt_atomic_t* v) {
|
|
int tmp;
|
|
|
|
ncpt_mutex_lock(&v->mutex);
|
|
tmp = v->counter;
|
|
ncpt_mutex_unlock(&v->mutex);
|
|
return tmp;
|
|
}
|
|
|
|
static inline int ncpt_atomic_set(ncpt_atomic_t* v, int i) {
|
|
v->counter = i;
|
|
ncpt_mutex_init(&v->mutex);
|
|
return i;
|
|
}
|
|
|
|
static inline void ncpt_atomic_add(int i, ncpt_atomic_t* v) {
|
|
ncpt_mutex_lock(&v->mutex);
|
|
v->counter += i;
|
|
ncpt_mutex_unlock(&v->mutex);
|
|
}
|
|
|
|
static inline void ncpt_atomic_sub(int i, ncpt_atomic_t* v) {
|
|
ncpt_mutex_lock(&v->mutex);
|
|
v->counter -= i;
|
|
ncpt_mutex_unlock(&v->mutex);
|
|
}
|
|
|
|
#define ncpt_atomic_inc(v) ncpt_atomic_add(1,v)
|
|
#define ncpt_atomic_dec(v) ncpt_atomic_sub(1,v)
|
|
|
|
static inline int ncpt_atomic_dec_and_test(ncpt_atomic_t* v) {
|
|
int tmp;
|
|
|
|
ncpt_mutex_lock(&v->mutex);
|
|
tmp = !(--v->counter);
|
|
ncpt_mutex_unlock(&v->mutex);
|
|
return tmp;
|
|
}
|
|
|
|
#endif /* __PRIVATE_LIBNCP_GENERIC_ATOMIC_H__ */
|