diff options
Diffstat (limited to 'cpp/include')
-rw-r--r-- | cpp/include/Ice/.headers | 3 | ||||
-rw-r--r-- | cpp/include/Ice/GCCountMap.h | 24 | ||||
-rw-r--r-- | cpp/include/Ice/GCObject.h | 73 | ||||
-rw-r--r-- | cpp/include/Ice/GCShared.h | 49 | ||||
-rw-r--r-- | cpp/include/Ice/Initialize.h | 2 | ||||
-rw-r--r-- | cpp/include/Ice/Object.h | 16 | ||||
-rw-r--r-- | cpp/include/Ice/SlicedData.h | 21 | ||||
-rw-r--r-- | cpp/include/IceGrid/.headers | 1 | ||||
-rw-r--r-- | cpp/include/IceUtil/Shared.h | 24 |
9 files changed, 106 insertions, 107 deletions
diff --git a/cpp/include/Ice/.headers b/cpp/include/Ice/.headers index 14ec914402b..931f974c7d2 100644 --- a/cpp/include/Ice/.headers +++ b/cpp/include/Ice/.headers @@ -29,8 +29,7 @@ SDK_HEADERS = \ $(SDK_INCLUDE_PATH)\$(INCLUDE_DIR)\FactoryTableInit.h \ $(SDK_INCLUDE_PATH)\$(INCLUDE_DIR)\Format.h \ $(SDK_INCLUDE_PATH)\$(INCLUDE_DIR)\Functional.h \ - $(SDK_INCLUDE_PATH)\$(INCLUDE_DIR)\GCCountMap.h \ - $(SDK_INCLUDE_PATH)\$(INCLUDE_DIR)\GCShared.h \ + $(SDK_INCLUDE_PATH)\$(INCLUDE_DIR)\GCObject.h \ $(SDK_INCLUDE_PATH)\$(INCLUDE_DIR)\Handle.h \ $(SDK_INCLUDE_PATH)\$(INCLUDE_DIR)\Ice.h \ $(SDK_INCLUDE_PATH)\$(INCLUDE_DIR)\Identity.h \ diff --git a/cpp/include/Ice/GCCountMap.h b/cpp/include/Ice/GCCountMap.h deleted file mode 100644 index 0edbdabe381..00000000000 --- a/cpp/include/Ice/GCCountMap.h +++ /dev/null @@ -1,24 +0,0 @@ -// ********************************************************************** -// -// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved. -// -// This copy of Ice is licensed to you under the terms described in the -// ICE_LICENSE file included in this distribution. -// -// ********************************************************************** - -#ifndef ICE_GCCOUNTMAP_H -#define ICE_GCCOUNTMAP_H - -#include <map> - -namespace IceInternal -{ - -class GCShared; - -typedef ::std::map<GCShared*, int> GCCountMap; - -} - -#endif diff --git a/cpp/include/Ice/GCObject.h b/cpp/include/Ice/GCObject.h new file mode 100644 index 00000000000..1ae1df84c28 --- /dev/null +++ b/cpp/include/Ice/GCObject.h @@ -0,0 +1,73 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +#ifndef ICE_GC_OBJECT_H +#define ICE_GC_OBJECT_H + +#include <Ice/Object.h> + +#include <IceUtil/MutexPtrLock.h> +#include <IceUtil/Mutex.h> + +namespace IceInternal +{ + +class GCObject; + +class GCVisitor +{ +public: + + virtual bool visit(GCObject*) = 0; +}; + +class ICE_API GCObject : virtual public Ice::Object +{ +public: + + // + // Flags constant used for collection of graphs + // + static const unsigned char Collectable; + static const unsigned char CycleMember; + static const unsigned char Visiting; + + // + // Override IceUtil::Shared methods + // + virtual void __incRef(); + virtual void __decRef(); + virtual int __getRef() const; + virtual void __setNoDelete(bool); + + // + // Override Object methods + // + virtual bool __gcVisit(GCVisitor&); + virtual void ice_collectable(bool); + + // + // This method is implemented by Slice classes to visit class + // members. + // + virtual void __gcVisitMembers(IceInternal::GCVisitor&) = 0; + + int __getRefUnsafe() + { + return _ref; + } + +private: + + bool collect(IceUtilInternal::MutexPtrLock<IceUtil::Mutex>&); +}; + +} + +#endif diff --git a/cpp/include/Ice/GCShared.h b/cpp/include/Ice/GCShared.h deleted file mode 100644 index d5e599e4715..00000000000 --- a/cpp/include/Ice/GCShared.h +++ /dev/null @@ -1,49 +0,0 @@ -// ********************************************************************** -// -// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved. -// -// This copy of Ice is licensed to you under the terms described in the -// ICE_LICENSE file included in this distribution. -// -// ********************************************************************** - -#ifndef ICE_GC_SHARED_H -#define ICE_GC_SHARED_H - -#include <IceUtil/Shared.h> -#include <Ice/Config.h> -#include <Ice/GCCountMap.h> - -namespace IceInternal -{ - -class GC; - -class ICE_API GCShared : public virtual IceUtil::Shared -{ -public: - - virtual ~GCShared() {} - - GCShared& operator=(const GCShared&) - { - return *this; - } - - virtual void __incRef(); - virtual void __decRef(); - virtual int __getRef() const; - virtual void __setNoDelete(bool); - - virtual void __gcReachable(GCCountMap&) const = 0; - virtual void __gcClear() = 0; - - int __getRefUnsafe() const - { - return _ref; - } -}; - -} - -#endif diff --git a/cpp/include/Ice/Initialize.h b/cpp/include/Ice/Initialize.h index 2999523ea9e..d0a49de66b1 100644 --- a/cpp/include/Ice/Initialize.h +++ b/cpp/include/Ice/Initialize.h @@ -25,8 +25,6 @@ namespace Ice { -ICE_API void collectGarbage(); - ICE_API StringSeq argsToStringSeq(int, char*[]); #ifdef _WIN32 diff --git a/cpp/include/Ice/Object.h b/cpp/include/Ice/Object.h index 7e568d19a0d..2f2ec7f5e42 100644 --- a/cpp/include/Ice/Object.h +++ b/cpp/include/Ice/Object.h @@ -12,7 +12,6 @@ #include <IceUtil/Mutex.h> #include <IceUtil/Shared.h> -#include <Ice/GCShared.h> #include <Ice/ObjectF.h> #include <Ice/ProxyF.h> #include <Ice/IncomingAsyncF.h> @@ -26,6 +25,7 @@ namespace IceInternal class Incoming; class BasicStream; class Direct; +class GCVisitor; } @@ -100,17 +100,9 @@ public: virtual void __write(const OutputStreamPtr&) const; virtual void __read(const InputStreamPtr&); - - // - // Virtual methods to support garbage collection of Slice class instances. These - // methods are overriden by Slice classes which can have cycles. - // - virtual void __addObject(IceInternal::GCCountMap&) {} - virtual bool __usesGC() { return false; } - void __decRefUnsafe() - { - --_ref; - } + + virtual bool __gcVisit(IceInternal::GCVisitor&) { return false; }; + virtual void ice_collectable(bool) { }; protected: diff --git a/cpp/include/Ice/SlicedData.h b/cpp/include/Ice/SlicedData.h index 0fb961a46e4..d08c4af067f 100644 --- a/cpp/include/Ice/SlicedData.h +++ b/cpp/include/Ice/SlicedData.h @@ -11,7 +11,7 @@ #define ICE_SLICED_DATA_H #include <Ice/SlicedDataF.h> -#include <Ice/Object.h> +#include <Ice/GCObject.h> namespace Ice { @@ -55,7 +55,7 @@ struct ICE_API SliceInfo : public ::IceUtil::Shared // // SlicedData holds the slices of unknown types. // -class ICE_API SlicedData : public ::IceInternal::GCShared +class ICE_API SlicedData : public ::IceUtil::Shared { public: @@ -63,26 +63,18 @@ public: const SliceInfoSeq slices; - // - // The internal methods below are necessary to support garbage collection - // of Ice objects. - // - - virtual void __gcReachable(IceInternal::GCCountMap&) const; - virtual void __gcClear(); + void __gcVisitMembers(IceInternal::GCVisitor&); void __decRefUnsafe() { --_ref; } - - void __addObject(IceInternal::GCCountMap&); }; // // Unknown sliced object holds instance of unknown type. // -class ICE_API UnknownSlicedObject : public Object, private IceInternal::GCShared +class ICE_API UnknownSlicedObject : virtual public Object, private IceInternal::GCObject { public: @@ -92,10 +84,7 @@ public: SlicedDataPtr getSlicedData() const; - virtual void __addObject(::IceInternal::GCCountMap&); - virtual bool __usesGC(); - virtual void __gcReachable(::IceInternal::GCCountMap&) const; - virtual void __gcClear(); + virtual void __gcVisitMembers(IceInternal::GCVisitor&); virtual void __write(::IceInternal::BasicStream*) const; virtual void __read(::IceInternal::BasicStream*); diff --git a/cpp/include/IceGrid/.headers b/cpp/include/IceGrid/.headers index 4a607cc9705..5dd2e28b4ba 100644 --- a/cpp/include/IceGrid/.headers +++ b/cpp/include/IceGrid/.headers @@ -6,6 +6,7 @@ SDK_HEADERS = \ $(SDK_INCLUDE_PATH)\$(INCLUDE_DIR)\IceGrid.h \ $(SDK_INCLUDE_PATH)\$(INCLUDE_DIR)\Locator.h \ $(SDK_INCLUDE_PATH)\$(INCLUDE_DIR)\Observer.h \ + $(SDK_INCLUDE_PATH)\$(INCLUDE_DIR)\PluginFacade.h \ $(SDK_INCLUDE_PATH)\$(INCLUDE_DIR)\Query.h \ $(SDK_INCLUDE_PATH)\$(INCLUDE_DIR)\Registry.h \ $(SDK_INCLUDE_PATH)\$(INCLUDE_DIR)\ReplicaGroupFilter.h \ diff --git a/cpp/include/IceUtil/Shared.h b/cpp/include/IceUtil/Shared.h index 7f95a0f0818..e25637c34dc 100644 --- a/cpp/include/IceUtil/Shared.h +++ b/cpp/include/IceUtil/Shared.h @@ -87,7 +87,6 @@ public: { if(!_noDelete) { - _noDelete = true; delete this; } } @@ -113,6 +112,12 @@ class ICE_UTIL_API Shared { public: + // + // Flag constant used by the Shared class. Derived classes + // such as GCObject define more flag constants. + // + static const unsigned char NoDelete; + Shared(); Shared(const Shared&); @@ -130,6 +135,21 @@ public: virtual int __getRef() const; virtual void __setNoDelete(bool); + void __setFlag(unsigned char flag) + { + _flags |= flag; + } + + void __clearFlag(unsigned char flag) + { + _flags &= ~flag; + } + + bool __hasFlag(unsigned char flag) + { + return (_flags & flag) > 0; + } + protected: #if defined(_WIN32) @@ -140,7 +160,7 @@ protected: int _ref; Mutex _mutex; #endif - bool _noDelete; + unsigned char _flags; }; } |