summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorMichi Henning <michi@zeroc.com>2008-03-17 14:17:38 +1000
committerMichi Henning <michi@zeroc.com>2008-03-17 14:17:38 +1000
commite5e44fb09e2ef6b5ac7f3bb77325740877ffc345 (patch)
tree468a9a56b08da808f441020ad827b75f1f5e7397 /cpp
parentbug 2808 - converter demo fixes (diff)
downloadice-e5e44fb09e2ef6b5ac7f3bb77325740877ffc345.tar.bz2
ice-e5e44fb09e2ef6b5ac7f3bb77325740877ffc345.tar.xz
ice-e5e44fb09e2ef6b5ac7f3bb77325740877ffc345.zip
Bug 2429.
Diffstat (limited to 'cpp')
-rw-r--r--[-rwxr-xr-x]cpp/include/Ice/GCShared.h13
-rw-r--r--[-rwxr-xr-x]cpp/include/Ice/Service.h0
-rw-r--r--[-rwxr-xr-x]cpp/include/Ice/StringConverter.h0
-rw-r--r--cpp/include/IceUtil/Shared.h6
-rw-r--r--cpp/src/Ice/GC.cpp40
-rw-r--r--[-rwxr-xr-x]cpp/src/IceUtil/ConvertUTF.cpp0
-rw-r--r--[-rwxr-xr-x]cpp/src/IceUtil/ConvertUTF.h0
-rw-r--r--[-rwxr-xr-x]cpp/src/IceUtil/Options.cpp0
-rw-r--r--[-rwxr-xr-x]cpp/src/IceUtil/Shared.cpp0
-rw-r--r--[-rwxr-xr-x]cpp/src/IceUtil/Timer.cpp0
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