summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorMarc Laukien <marc@zeroc.com>2006-03-16 21:22:28 +0000
committerMarc Laukien <marc@zeroc.com>2006-03-16 21:22:28 +0000
commitf855eca8a97fbce34e60fc94c60a60e0e3292856 (patch)
treec7abfe769b05ae9149707025a995609a80c40ca9 /cpp/src
parentAdded BlobjectArray (diff)
downloadice-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.cpp9
-rw-r--r--cpp/src/Glacier2/RouterI.h1
-rw-r--r--cpp/src/Glacier2/RoutingTable.cpp68
-rw-r--r--cpp/src/Glacier2/RoutingTable.h23
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;
};
}