summaryrefslogtreecommitdiff
path: root/cpp/src/IceUtil
diff options
context:
space:
mode:
authorJose <jose@zeroc.com>2015-02-19 18:20:48 +0100
committerJose <jose@zeroc.com>2015-02-19 18:20:48 +0100
commit3368ee4416a96aea7450e3a64a1bd32bf30627ef (patch)
tree06f433bc51ba3ae235bc3b3bbc6d4c092f69c8eb /cpp/src/IceUtil
parentICE-6322 Network I/O on main thread (diff)
downloadice-3368ee4416a96aea7450e3a64a1bd32bf30627ef.tar.bz2
ice-3368ee4416a96aea7450e3a64a1bd32bf30627ef.tar.xz
ice-3368ee4416a96aea7450e3a64a1bd32bf30627ef.zip
Add IceUtil/Atomic.h with support for std::atomic
Diffstat (limited to 'cpp/src/IceUtil')
-rw-r--r--cpp/src/IceUtil/Shared.cpp61
1 files changed, 2 insertions, 59 deletions
diff --git a/cpp/src/IceUtil/Shared.cpp b/cpp/src/IceUtil/Shared.cpp
index f242ee8d986..f88068569e0 100644
--- a/cpp/src/IceUtil/Shared.cpp
+++ b/cpp/src/IceUtil/Shared.cpp
@@ -44,81 +44,24 @@ IceUtil::Shared::Shared(const Shared&) :
void
IceUtil::Shared::__incRef()
{
-#if defined(ICE_CPP11)
- assert(_ref.fetch_add(0, std::memory_order_relaxed) >= 0);
- ++_ref;
-#elif defined(_WIN32)
- assert(InterlockedExchangeAdd(&_ref, 0) >= 0);
- InterlockedIncrement(&_ref);
-#elif defined(ICE_HAS_GCC_BUILTINS)
-
-# ifndef NDEBUG
- int c =
-# endif
- __sync_fetch_and_add(&_ref, 1);
- assert(c >= 0);
-#else
- _mutex.lock();
assert(_ref >= 0);
++_ref;
- _mutex.unlock();
-#endif
}
void
IceUtil::Shared::__decRef()
{
-#if defined(ICE_CPP11)
- assert(_ref.fetch_add(0, std::memory_order_relaxed) > 0);
- if(--_ref == 0 && !(_flags & NoDelete))
- {
- delete this;
- }
-#elif defined(_WIN32)
- assert(InterlockedExchangeAdd(&_ref, 0) > 0);
- if(InterlockedDecrement(&_ref) == 0 && !(_flags & NoDelete))
- {
- delete this;
- }
-#elif defined(ICE_HAS_GCC_BUILTINS)
- int c = __sync_fetch_and_sub(&_ref, 1);
- assert(c > 0);
- if(c == 1 && !(_flags & NoDelete))
- {
- delete this;
- }
-#else
- bool doDelete = false;
- _mutex.lock();
assert(_ref > 0);
- if(--_ref == 0)
- {
- doDelete = !(_flags & NoDelete);
- _flags |= NoDelete;
- }
- _mutex.unlock();
- if(doDelete)
+ if(--_ref == 0 && !(_flags & NoDelete))
{
delete this;
}
-#endif
}
int
IceUtil::Shared::__getRef() const
{
-#if defined(ICE_CPP11)
- return _ref.load(std::memory_order_relaxed);
-#elif defined(_WIN32)
- return InterlockedExchangeAdd(const_cast<LONG*>(&_ref), 0);
-#elif defined(ICE_HAS_GCC_BUILTINS)
- return __sync_fetch_and_sub(const_cast<volatile int*>(&_ref), 0);
-#else
- _mutex.lock();
- int ref = _ref;
- _mutex.unlock();
- return ref;
-#endif
+ return _ref;
}
void