8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-23 22:03:03 +01:00

Native Solaris AtomicCounter - required for non-intel build

This commit is contained in:
alexpeshkoff 2009-04-03 13:09:58 +00:00
parent 290533d2ef
commit 26d31f5e2e

View File

@ -205,6 +205,65 @@ private:
} // namespace Firebird } // namespace Firebird
#elif defined(SOLARIS)
#include <atomic.h>
namespace Firebird {
// Solaris version - uses Solaris atomic_ops
class AtomicCounter
{
public:
typedef uint_t counter_type;
explicit AtomicCounter(counter_type value = 0) : counter(value) {}
~AtomicCounter() {}
counter_type exchangeAdd(counter_type value)
{
return atomic_add_int_nv(&counter, value);
}
counter_type operator +=(counter_type value)
{
return exchangeAdd(value) + value;
}
counter_type operator -=(counter_type value)
{
return exchangeAdd(-value) - value;
}
counter_type operator ++()
{
return exchangeAdd(1) + 1;
}
counter_type operator --()
{
return exchangeAdd(-1) - 1;
}
counter_type value() const { return counter; }
counter_type setValue(counter_type val)
{
counter_type old;
do
{
old = counter;
} while (!atomic_cas_uint(&counter, old, val));
return old;
}
private:
counter_type counter;
};
} // namespace Firebird
#else #else
#error AtomicCounter: implement appropriate code for your platform! #error AtomicCounter: implement appropriate code for your platform!