small bugfixes in atomic_int_generic.h

This commit is contained in:
Paolo Cignoni 2011-12-15 17:38:34 +00:00
parent 9af315bb18
commit 3adba90ef3
1 changed files with 84 additions and 80 deletions
wrap/system/multithreading

View File

@ -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