diff options
Diffstat (limited to 'cpp')
-rw-r--r--[-rwxr-xr-x] | cpp/include/Ice/GCShared.h | 13 | ||||
-rw-r--r--[-rwxr-xr-x] | cpp/include/Ice/Service.h | 0 | ||||
-rw-r--r--[-rwxr-xr-x] | cpp/include/Ice/StringConverter.h | 0 | ||||
-rw-r--r-- | cpp/include/IceUtil/Shared.h | 6 | ||||
-rw-r--r-- | cpp/src/Ice/GC.cpp | 40 | ||||
-rw-r--r--[-rwxr-xr-x] | cpp/src/IceUtil/ConvertUTF.cpp | 0 | ||||
-rw-r--r--[-rwxr-xr-x] | cpp/src/IceUtil/ConvertUTF.h | 0 | ||||
-rw-r--r--[-rwxr-xr-x] | cpp/src/IceUtil/Options.cpp | 0 | ||||
-rw-r--r--[-rwxr-xr-x] | cpp/src/IceUtil/Shared.cpp | 0 | ||||
-rw-r--r--[-rwxr-xr-x] | cpp/src/IceUtil/Timer.cpp | 0 |
10 files changed, 42 insertions, 17 deletions
diff --git a/cpp/include/Ice/GCShared.h b/cpp/include/Ice/GCShared.h index aa45311aeda..b9edb0409f9 100755..100644 --- a/cpp/include/Ice/GCShared.h +++ b/cpp/include/Ice/GCShared.h @@ -23,8 +23,6 @@ class ICE_API GCShared : public virtual IceUtil::Shared { public: - GCShared(); - GCShared(const GCShared&); virtual ~GCShared() {} GCShared& operator=(const GCShared&) @@ -45,12 +43,20 @@ public: int __getRefUnsafe() const { +#if defined(ICE_HAS_ATOMIC_FUNCTIONS) + return _ref.counter; +#else return _ref; +#endif } void __decRefUnsafe() { +#if defined(ICE_HAS_ATOMIC_FUNCTIONS) + IceUtilInternal::atomicDecAndTest(&_ref); +#else --_ref; +#endif } protected: @@ -58,9 +64,6 @@ protected: void __gcIncRef(); void __gcDecRef(); - int _ref; - bool _noDelete; - friend class IceInternal::GC; // Allows IceInternal::GC to read value of _ref. }; diff --git a/cpp/include/Ice/Service.h b/cpp/include/Ice/Service.h index 0e97101146b..0e97101146b 100755..100644 --- a/cpp/include/Ice/Service.h +++ b/cpp/include/Ice/Service.h diff --git a/cpp/include/Ice/StringConverter.h b/cpp/include/Ice/StringConverter.h index de35ba731f1..de35ba731f1 100755..100644 --- a/cpp/include/Ice/StringConverter.h +++ b/cpp/include/Ice/StringConverter.h diff --git a/cpp/include/IceUtil/Shared.h b/cpp/include/IceUtil/Shared.h index 49d00918cdd..96261a0e017 100644 --- a/cpp/include/IceUtil/Shared.h +++ b/cpp/include/IceUtil/Shared.h @@ -40,6 +40,12 @@ struct AtomicCounter { volatile int counter; }; + +void atomicSet(AtomicCounter*, int); +void atomicInc(AtomicCounter *); +int atomicDecAndTest(AtomicCounter *); +int atomicExchangeAdd(int, AtomicCounter*); + } #elif defined(_WIN32) diff --git a/cpp/src/Ice/GC.cpp b/cpp/src/Ice/GC.cpp index 04d934cc008..29b6fcf452f 100644 --- a/cpp/src/Ice/GC.cpp +++ b/cpp/src/Ice/GC.cpp @@ -54,24 +54,17 @@ using namespace IceInternal; // GCShared // -IceInternal::GCShared::GCShared() : - _ref(0), - _noDelete(false) -{ -} - -IceInternal::GCShared::GCShared(const GCShared&) : - _ref(0), - _noDelete(false) -{ -} - void IceInternal::GCShared::__incRef() { RecMutex::Lock lock(gcRecMutex); +#if defined(ICE_HAS_ATOMIC_FUNCTIONS) + assert(_ref.counter >= 0); + atomicInc(&_ref); +#else assert(_ref >= 0); ++_ref; +#endif } void @@ -79,8 +72,13 @@ IceInternal::GCShared::__decRef() { RecMutex::Lock lock(gcRecMutex); bool doDelete = false; +#if defined(ICE_HAS_ATOMIC_FUNCTIONS) + assert(_ref.counter > 0); + if(IceUtilInternal::atomicDecAndTest(&_ref)) +#else assert(_ref > 0); if(--_ref == 0) +#endif { doDelete = !_noDelete; _noDelete = true; @@ -96,7 +94,11 @@ int IceInternal::GCShared::__getRef() const { RecMutex::Lock lock(gcRecMutex); +#if defined(ICE_HAS_ATOMIC_FUNCTIONS) + return _ref.counter; +#else return _ref; +#endif } void @@ -110,8 +112,13 @@ void IceInternal::GCShared::__gcIncRef() { RecMutex::Lock lock(gcRecMutex); +#if defined(ICE_HAS_ATOMIC_FUNCTIONS) + assert(_ref.counter >= 0); + if(_ref.counter == 0) +#else assert(_ref >= 0); if(_ref == 0) +#endif { #ifdef NDEBUG // To avoid annoying warnings about variables that are not used... gcObjects.insert(this); @@ -120,7 +127,11 @@ IceInternal::GCShared::__gcIncRef() assert(rc.second); #endif } +#if defined(ICE_HAS_ATOMIC_FUNCTIONS) + IceUtilInternal::atomicInc(&_ref); +#else ++_ref; +#endif } void @@ -128,8 +139,13 @@ IceInternal::GCShared::__gcDecRef() { RecMutex::Lock lock(gcRecMutex); bool doDelete = false; +#if defined(ICE_HAS_ATOMIC_FUNCTIONS) + assert(_ref.counter > 0); + if(IceUtilInternal::atomicDecAndTest(&_ref)) +#else assert(_ref > 0); if(--_ref == 0) +#endif { doDelete = !_noDelete; _noDelete = true; diff --git a/cpp/src/IceUtil/ConvertUTF.cpp b/cpp/src/IceUtil/ConvertUTF.cpp index 331fa50cfa7..331fa50cfa7 100755..100644 --- a/cpp/src/IceUtil/ConvertUTF.cpp +++ b/cpp/src/IceUtil/ConvertUTF.cpp diff --git a/cpp/src/IceUtil/ConvertUTF.h b/cpp/src/IceUtil/ConvertUTF.h index db25674998c..db25674998c 100755..100644 --- a/cpp/src/IceUtil/ConvertUTF.h +++ b/cpp/src/IceUtil/ConvertUTF.h diff --git a/cpp/src/IceUtil/Options.cpp b/cpp/src/IceUtil/Options.cpp index 444c71d96cc..444c71d96cc 100755..100644 --- a/cpp/src/IceUtil/Options.cpp +++ b/cpp/src/IceUtil/Options.cpp diff --git a/cpp/src/IceUtil/Shared.cpp b/cpp/src/IceUtil/Shared.cpp index 5c30967bc35..5c30967bc35 100755..100644 --- a/cpp/src/IceUtil/Shared.cpp +++ b/cpp/src/IceUtil/Shared.cpp diff --git a/cpp/src/IceUtil/Timer.cpp b/cpp/src/IceUtil/Timer.cpp index 8a70432709d..8a70432709d 100755..100644 --- a/cpp/src/IceUtil/Timer.cpp +++ b/cpp/src/IceUtil/Timer.cpp |