// ********************************************************************** // // Copyright (c) 2003-2016 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 FREEZE_TRANSACTIONAL_EVICTOR_I_H #define FREEZE_TRANSACTIONAL_EVICTOR_I_H #include #include #include namespace Freeze { class TransactionalEvictorI; class TransactionalEvictorElement; typedef IceUtil::Handle TransactionalEvictorElementPtr; class TransactionalEvictorElement : public Ice::LocalObject { public: TransactionalEvictorElement(ObjectRecord&, ObjectStore&); ~TransactionalEvictorElement(); void init(ObjectStore::Position); const Ice::ObjectPtr& servant() const { return _servant; } bool stale() const { return _stale; } private: friend class TransactionalEvictorI; const Ice::ObjectPtr _servant; // // Immutable // ObjectStore& _store; // // Immutable once set // ObjectStore::Position _cachePosition; // // Protected by TransactionalEvictorI // std::list::iterator _evictPosition; bool _stale; bool _inEvictor; }; class TransactionalEvictorI : public TransactionalEvictor, public EvictorI { public: TransactionalEvictorI(const Ice::ObjectAdapterPtr&, const std::string&, DbEnv*, const std::string&, const FacetTypeMap&, const ServantInitializerPtr&, const std::vector&, bool); virtual ~TransactionalEvictorI(); virtual TransactionPtr getCurrentTransaction() const; virtual void setCurrentTransaction(const TransactionPtr&); virtual Ice::ObjectPrx addFacet(const Ice::ObjectPtr&, const Ice::Identity&, const std::string&); virtual Ice::ObjectPtr removeFacet(const Ice::Identity&, const std::string&); virtual bool hasFacet(const Ice::Identity&, const std::string&); virtual void finished(const Ice::Current&, const Ice::ObjectPtr&, const Ice::LocalObjectPtr&); virtual void deactivate(const std::string&); virtual TransactionIPtr beforeQuery(); Ice::DispatchStatus dispatch(Ice::Request&); Ice::ObjectPtr evict(const Ice::Identity&, ObjectStore*); protected: virtual bool hasAnotherFacet(const Ice::Identity&, const std::string&); virtual Ice::ObjectPtr locateImpl(const Ice::Current&, Ice::LocalObjectPtr&); virtual void evict(); private: Ice::ObjectPtr loadCachedServant(const Ice::Identity&, ObjectStore*); void evict(const TransactionalEvictorElementPtr&); void fixEvictPosition(const TransactionalEvictorElementPtr&); void servantNotFound(const char*, int, const Ice::Current&); // // The _evictorList contains a list of all objects we keep, // with the most recently used first. // std::list _evictorList; std::list::size_type _currentEvictorSize; bool _rollbackOnUserException; Ice::DispatchInterceptorPtr _interceptor; }; typedef IceUtil::Handle TransactionalEvictorIPtr; } #endif