Blame toonz/sources/include/tatomicvar.h
|
Shinya Kitaoka |
810553 |
#pragma once
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#ifndef TATOMICVAR_H
|
|
Toshihiro Shimizu |
890ddd |
#define TATOMICVAR_H
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#undef DVAPI
|
|
Toshihiro Shimizu |
890ddd |
#undef DVVAR
|
|
Toshihiro Shimizu |
890ddd |
#ifdef TNZCORE_EXPORTS
|
|
Toshihiro Shimizu |
890ddd |
#define DVAPI DV_EXPORT_API
|
|
Toshihiro Shimizu |
890ddd |
#define DVVAR DV_EXPORT_VAR
|
|
Toshihiro Shimizu |
890ddd |
#else
|
|
Toshihiro Shimizu |
890ddd |
#define DVAPI DV_IMPORT_API
|
|
Toshihiro Shimizu |
890ddd |
#define DVVAR DV_IMPORT_VAR
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include <atomic>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Michał Janiszewski |
d8b454 |
typedef std::atomic<long> atomic_t;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
static __inline__ void atomic_set(atomic_t *v, const int value) {
|
|
Shinya Kitaoka |
120a6e |
v->store(value);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
static __inline__ int atomic_inc_return(atomic_t *v) {
|
|
Shinya Kitaoka |
120a6e |
return v->fetch_add(1) + 1; // post increment atomic
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
static __inline__ int atomic_dec_return(atomic_t *v) {
|
|
Shinya Kitaoka |
120a6e |
return v->fetch_sub(1) - 1; // post decriment atomic
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
static __inline__ int atomic_read(const atomic_t *v) { return v->load(); }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
static __inline__ int atomic_add(int num, const atomic_t *v) {
|
|
Shinya Kitaoka |
120a6e |
return const_cast<atomic_t *>(v)->fetch_add(num) +
|
|
Shinya Kitaoka |
120a6e |
num; /* なんで const つけた? */
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
class DVAPI TAtomicVar {
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
TAtomicVar() : m_var(0) {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
long operator++() {
|
|
Michał Janiszewski |
163bdb |
return m_var++ + 1;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
long operator+=(long value) {
|
|
Shinya Kitaoka |
120a6e |
m_var += value;
|
|
Shinya Kitaoka |
120a6e |
return m_var;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
long operator--() {
|
|
Michał Janiszewski |
163bdb |
return m_var-- - 1;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
bool operator<=(const long &rhs) {
|
|
Shinya Kitaoka |
120a6e |
return m_var <= rhs;
|
|
Shinya Kitaoka |
120a6e |
};
|
|
Shinya Kitaoka |
120a6e |
operator long() const {
|
|
Shinya Kitaoka |
120a6e |
return m_var;
|
|
Shinya Kitaoka |
120a6e |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
atomic_t m_var;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#if !defined(LINUX) || defined(LINUX) && (__GNUC__ == 3) && (__GNUC_MINOR__ > 1)
|
|
Shinya Kitaoka |
120a6e |
private: // to avoid well known bug in gcc3 ... fixed in later versions..
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Shinya Kitaoka |
120a6e |
TAtomicVar &operator=(const TAtomicVar &); // not implemented
|
|
Shinya Kitaoka |
120a6e |
TAtomicVar(const TAtomicVar &v); // not implemented
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#endif
|