small bugfixes in atomic_int_generic.h
This commit is contained in:
parent
9af315bb18
commit
3adba90ef3
wrap/system/multithreading
|
@ -9,100 +9,104 @@ namespace mt{
|
|||
class atomicInt
|
||||
{
|
||||
public:
|
||||
atomicInt()
|
||||
{
|
||||
value = 0;
|
||||
}
|
||||
atomicInt( int value )
|
||||
{
|
||||
value = value;
|
||||
}
|
||||
atomicInt()
|
||||
{
|
||||
value = 0;
|
||||
}
|
||||
|
||||
// atomic API
|
||||
atomicInt( int value )
|
||||
{
|
||||
value = value;
|
||||
}
|
||||
|
||||
/**
|
||||
Reads the current value of this QAtomicInt and then adds valueToAdd
|
||||
to the current value, returning the original value.
|
||||
*/
|
||||
inline int fetchAndAddAcquire( int valueToAdd )
|
||||
{
|
||||
mutexlocker lock(m);
|
||||
int originalValue = value;
|
||||
value += valueToAdd;
|
||||
return originalValue;
|
||||
}
|
||||
// atomic API
|
||||
|
||||
/**
|
||||
Atomically increments the value of this atomicInt.
|
||||
Returns true if the new value is non-zero, false otherwise.*/
|
||||
inline bool ref()
|
||||
{
|
||||
mutexlocker lock(m);
|
||||
value++;
|
||||
return value == 0;
|
||||
}
|
||||
/**
|
||||
Reads the current value of this QAtomicInt and then adds valueToAdd
|
||||
to the current value, returning the original value.
|
||||
*/
|
||||
inline int fetchAndAddAcquire( int valueToAdd )
|
||||
{
|
||||
mutexlocker lock(&m);
|
||||
int originalValue = value;
|
||||
value += valueToAdd;
|
||||
return originalValue;
|
||||
}
|
||||
|
||||
/*
|
||||
Atomically decrements the value of this QAtomicInt.
|
||||
Returns true if the new value is non-zero, false otherwise.*/
|
||||
inline bool deref()
|
||||
{
|
||||
mutexlocker lock(m);
|
||||
value--;
|
||||
return value == 0;
|
||||
}
|
||||
/**
|
||||
Atomically increments the value of this atomicInt.
|
||||
Returns true if the new value is non-zero, false otherwise.*/
|
||||
inline bool ref()
|
||||
{
|
||||
mutexlocker lock(&m);
|
||||
return ++value != 0;
|
||||
}
|
||||
|
||||
inline bool testAndSetOrdered(int expectedValue, int newValue)
|
||||
{
|
||||
mutexlocker lock(m);
|
||||
if (value == expectedValue) {
|
||||
value = newValue;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/*
|
||||
Atomically decrements the value of this QAtomicInt.
|
||||
Returns true if the new value is non-zero, false otherwise.*/
|
||||
inline bool deref()
|
||||
{
|
||||
mutexlocker lock(&m);
|
||||
return --value != 0;
|
||||
}
|
||||
|
||||
// Non-atomic API
|
||||
inline bool operator==(int value) const
|
||||
{
|
||||
return value == value;
|
||||
/*
|
||||
If the current value of this QAtomicInt is the expectedValue,
|
||||
the test-and-set functions assign the newValue to this QAtomicInt
|
||||
and return true. If the values are not the same, this function
|
||||
does nothing and returns false.
|
||||
*/
|
||||
inline bool testAndSetOrdered(int expectedValue, int newValue)
|
||||
{
|
||||
mutexlocker lock(&m);
|
||||
if (value == expectedValue) {
|
||||
value = newValue;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
inline bool operator!=(int value) const
|
||||
{
|
||||
return value != value;
|
||||
}
|
||||
// Non-atomic API
|
||||
inline bool operator==(int value) const
|
||||
{
|
||||
return value == value;
|
||||
}
|
||||
|
||||
inline bool operator!() const
|
||||
{
|
||||
return value == 0;
|
||||
}
|
||||
inline bool operator!=(int value) const
|
||||
{
|
||||
return value != value;
|
||||
}
|
||||
|
||||
inline operator int() const
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
inline atomicInt &operator=(int value)
|
||||
{
|
||||
value = value;
|
||||
return *this;
|
||||
}
|
||||
inline bool operator!() const
|
||||
{
|
||||
return value == 0;
|
||||
}
|
||||
|
||||
inline bool operator>(int value) const
|
||||
{
|
||||
return value > value;
|
||||
}
|
||||
inline operator int() const
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
inline bool operator<(int value) const
|
||||
{
|
||||
return value < value;
|
||||
}
|
||||
inline atomicInt &operator=(int value)
|
||||
{
|
||||
value = value;
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline bool operator>(int value) const
|
||||
{
|
||||
return value > value;
|
||||
}
|
||||
|
||||
inline bool operator<(int value) const
|
||||
{
|
||||
return value < value;
|
||||
}
|
||||
|
||||
private:
|
||||
volatile int value;
|
||||
mutex m;
|
||||
|
||||
volatile int value;
|
||||
mutex m;
|
||||
};
|
||||
|
||||
}//namespace
|
||||
|
|
Loading…
Reference in New Issue