diff options
author | Marc Laukien <marc@zeroc.com> | 2006-03-16 21:22:28 +0000 |
---|---|---|
committer | Marc Laukien <marc@zeroc.com> | 2006-03-16 21:22:28 +0000 |
commit | f855eca8a97fbce34e60fc94c60a60e0e3292856 (patch) | |
tree | c7abfe769b05ae9149707025a995609a80c40ca9 /cpp/src | |
parent | Added BlobjectArray (diff) | |
download | ice-f855eca8a97fbce34e60fc94c60a60e0e3292856.tar.bz2 ice-f855eca8a97fbce34e60fc94c60a60e0e3292856.tar.xz ice-f855eca8a97fbce34e60fc94c60a60e0e3292856.zip |
started to add evictor
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Glacier2/RouterI.cpp | 9 | ||||
-rw-r--r-- | cpp/src/Glacier2/RouterI.h | 1 | ||||
-rw-r--r-- | cpp/src/Glacier2/RoutingTable.cpp | 68 | ||||
-rw-r--r-- | cpp/src/Glacier2/RoutingTable.h | 23 |
4 files changed, 56 insertions, 45 deletions
diff --git a/cpp/src/Glacier2/RouterI.cpp b/cpp/src/Glacier2/RouterI.cpp index e7de75504b3..293f0760171 100644 --- a/cpp/src/Glacier2/RouterI.cpp +++ b/cpp/src/Glacier2/RouterI.cpp @@ -17,8 +17,7 @@ using namespace Glacier2; Glacier2::RouterI::RouterI(const ObjectAdapterPtr& clientAdapter, const ObjectAdapterPtr& serverAdapter, const ConnectionPtr& connection, const string& userId, const SessionPrx& session) : _communicator(clientAdapter->getCommunicator()), - _routingTable(new RoutingTable), - _routingTableTraceLevel(_communicator->getProperties()->getPropertyAsInt("Glacier2.Trace.RoutingTable")), + _routingTable(new RoutingTable(_communicator)), _clientProxy(clientAdapter->createProxy(stringToIdentity("dummy"))), _connection(connection), _userId(userId), @@ -128,12 +127,6 @@ Glacier2::RouterI::addProxy(const ObjectPrx& proxy, const Current& current) assert(!_destroy); - if(_routingTableTraceLevel) - { - Trace out(_communicator->getLogger(), "Glacier2"); - out << "adding proxy to routing table:\n" << _communicator->proxyToString(proxy); - } - _timestamp = IceUtil::Time::now(); _routingTable->add(proxy); diff --git a/cpp/src/Glacier2/RouterI.h b/cpp/src/Glacier2/RouterI.h index ad8367e0899..f50a0326ae8 100644 --- a/cpp/src/Glacier2/RouterI.h +++ b/cpp/src/Glacier2/RouterI.h @@ -50,7 +50,6 @@ private: const Ice::CommunicatorPtr _communicator; const RoutingTablePtr _routingTable; - const int _routingTableTraceLevel; const Ice::ObjectPrx _clientProxy; const Ice::ObjectPrx _serverProxy; const ClientBlobjectPtr _clientBlobject; diff --git a/cpp/src/Glacier2/RoutingTable.cpp b/cpp/src/Glacier2/RoutingTable.cpp index 0e09b740d3f..c1c5cad24dc 100644 --- a/cpp/src/Glacier2/RoutingTable.cpp +++ b/cpp/src/Glacier2/RoutingTable.cpp @@ -13,8 +13,10 @@ using namespace std; using namespace Ice; using namespace Glacier2; -Glacier2::RoutingTable::RoutingTable() : - _tableHint(_table.end()) +Glacier2::RoutingTable::RoutingTable(const CommunicatorPtr& communicator) : + _communicator(communicator), + _traceLevel(_communicator->getProperties()->getPropertyAsInt("Glacier2.Trace.RoutingTable")), + _maxSize(_communicator->getProperties()->getPropertyAsIntWithDefault("Glacier2.RoutingTable.MaxSize", 1000)) { } @@ -33,28 +35,37 @@ Glacier2::RoutingTable::add(const ObjectPrx& prx) IceUtil::Mutex::Lock sync(*this); - map<Identity, ObjectPrx>::iterator p = _table.end(); - - if(_tableHint != _table.end()) + EvictorMap::iterator p = _map.find(proxy->ice_getIdentity()); + + if(p == _map.end()) { - if(_tableHint->first == proxy->ice_getIdentity()) + if(_traceLevel) { - p = _tableHint; + Trace out(_communicator->getLogger(), "Glacier2"); + out << "adding proxy to routing table:\n" << _communicator->proxyToString(proxy); } - } - - if(p == _table.end()) - { - p = _table.find(proxy->ice_getIdentity()); - } - if(p == _table.end()) - { - _tableHint = _table.insert(_tableHint, pair<const Identity, ObjectPrx>(proxy->ice_getIdentity(), proxy)); + EvictorEntryPtr entry = new EvictorEntry; + p = _map.insert(_map.begin(), pair<const Identity, EvictorEntryPtr>(proxy->ice_getIdentity(), entry)); + EvictorQueue::iterator q = _queue.insert(_queue.end(), p); + entry->proxy = proxy; + entry->pos = q; + return true; } else { + if(_traceLevel) + { + Trace out(_communicator->getLogger(), "Glacier2"); + out << "proxy already in routing table:\n" << _communicator->proxyToString(proxy); + } + + EvictorEntryPtr entry = p->second; + _queue.erase(entry->pos); + EvictorQueue::iterator q = _queue.insert(_queue.end(), p); + entry->pos = q; + return false; } } @@ -69,28 +80,19 @@ Glacier2::RoutingTable::get(const Identity& ident) IceUtil::Mutex::Lock sync(*this); - map<Identity, ObjectPrx>::iterator p = _table.end(); - - if(_tableHint != _table.end()) - { - if(_tableHint->first == ident) - { - p = _tableHint; - } - } - - if(p == _table.end()) - { - p = _table.find(ident); - } + EvictorMap::iterator p = _map.find(ident); - if(p == _table.end()) + if(p == _map.end()) { return 0; } else { - _tableHint = p; - return p->second; + EvictorEntryPtr entry = p->second; + _queue.erase(entry->pos); + EvictorQueue::iterator q = _queue.insert(_queue.end(), p); + entry->pos = q; + + return entry->proxy; } } diff --git a/cpp/src/Glacier2/RoutingTable.h b/cpp/src/Glacier2/RoutingTable.h index 8759a727eba..1159ccdb0b8 100644 --- a/cpp/src/Glacier2/RoutingTable.h +++ b/cpp/src/Glacier2/RoutingTable.h @@ -12,6 +12,7 @@ #include <Ice/Ice.h> #include <IceUtil/Mutex.h> +#include <list> namespace Glacier2 { @@ -23,7 +24,7 @@ class RoutingTable : public IceUtil::Shared, public IceUtil::Mutex { public: - RoutingTable(); + RoutingTable(const Ice::CommunicatorPtr&); // // Clear the contents of the routing table. @@ -42,8 +43,24 @@ public: private: - std::map<Ice::Identity, Ice::ObjectPrx> _table; - std::map<Ice::Identity, Ice::ObjectPrx>::iterator _tableHint; + const Ice::CommunicatorPtr _communicator; + const int _traceLevel; + const int _maxSize; + + struct EvictorEntry; + typedef IceUtil::Handle<EvictorEntry> EvictorEntryPtr; + + typedef std::map<Ice::Identity, EvictorEntryPtr> EvictorMap; + typedef std::list<EvictorMap::iterator> EvictorQueue; + + struct EvictorEntry : public IceUtil::Shared + { + Ice::ObjectPrx proxy; + EvictorQueue::iterator pos; + }; + + EvictorMap _map; + EvictorQueue _queue; }; } |