summaryrefslogtreecommitdiff
path: root/cpp/src/IceGrid/ServerCache.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2006-11-29 14:40:22 +0000
committerBenoit Foucher <benoit@zeroc.com>2006-11-29 14:40:22 +0000
commit8fdb96f93af7f6ac27ecb50ea4a5f22856b8546c (patch)
tree463ee5268393e18f55fdf9da9946e2960ca7899c /cpp/src/IceGrid/ServerCache.cpp
parentFixes (diff)
downloadice-8fdb96f93af7f6ac27ecb50ea4a5f22856b8546c.tar.bz2
ice-8fdb96f93af7f6ac27ecb50ea4a5f22856b8546c.tar.xz
ice-8fdb96f93af7f6ac27ecb50ea4a5f22856b8546c.zip
More bug fixes
Diffstat (limited to 'cpp/src/IceGrid/ServerCache.cpp')
-rw-r--r--cpp/src/IceGrid/ServerCache.cpp38
1 files changed, 22 insertions, 16 deletions
diff --git a/cpp/src/IceGrid/ServerCache.cpp b/cpp/src/IceGrid/ServerCache.cpp
index 8acb32f19da..8da34d4ffca 100644
--- a/cpp/src/IceGrid/ServerCache.cpp
+++ b/cpp/src/IceGrid/ServerCache.cpp
@@ -128,14 +128,15 @@ ServerCache::remove(const string& id, bool destroy)
ServerEntryPtr entry = getImpl(id);
ServerInfo info = entry->getInfo();
- if(destroy)
- {
- entry->destroy();
- }
+ forEachCommunicator(RemoveCommunicator(*this, entry))(info.descriptor);
_nodeCache.get(info.node)->removeServer(entry);
- forEachCommunicator(RemoveCommunicator(*this, entry))(info.descriptor);
+ if(destroy)
+ {
+ entry->destroy(); // This must be done after otherwise some allocatable objects
+ // might allocate a destroyed server.
+ }
if(_traceLevels && _traceLevels->server > 0)
{
@@ -258,11 +259,7 @@ ServerEntry::update(const ServerInfo& info)
_load = descriptor;
_loaded.reset(0);
-
- //
- // Update the allocatable flag.
- //
- const_cast<bool&>(_allocatable) = info.descriptor->allocatable || info.descriptor->activation == "session";
+ _allocatable = info.descriptor->allocatable || info.descriptor->activation == "session";
}
void
@@ -289,6 +286,7 @@ ServerEntry::destroy()
_load.reset(0);
_loaded.reset(0);
+ _allocatable = false;
}
ServerInfo
@@ -346,10 +344,10 @@ ServerEntry::getProxy(int& activationTimeout, int& deactivationTimeout, string&
Lock sync(*this);
if(_loaded.get() || _proxy && _synchronizing && !upToDate) // Synced or if not up to date is fine
{
- assert(_loaded.get() || _load.get());
+ assert(_loaded.get() || _load.get() || _destroy.get());
activationTimeout = _activationTimeout;
deactivationTimeout = _deactivationTimeout;
- node = _loaded.get() ? _loaded->node : _load->node;
+ node = _loaded.get() ? _loaded->node : (_load.get() ? _load->node : _destroy->node);
return _proxy;
}
}
@@ -362,10 +360,10 @@ ServerEntry::getProxy(int& activationTimeout, int& deactivationTimeout, string&
Lock sync(*this);
if(_loaded.get() || _proxy && _synchronizing && !upToDate) // Synced or if not up to date is fine
{
- assert(_loaded.get() || _load.get());
+ assert(_loaded.get() || _load.get() || _destroy.get());
activationTimeout = _activationTimeout;
deactivationTimeout = _deactivationTimeout;
- node = _loaded.get() ? _loaded->node : _load->node;
+ node = _loaded.get() ? _loaded->node : (_load.get() ? _load->node : _destroy->node);
return _proxy;
}
else if(_load.get())
@@ -748,6 +746,11 @@ ServerEntry::canRemove()
void
ServerEntry::allocated(const SessionIPtr& session)
{
+ if(!_loaded.get() && !_load.get())
+ {
+ return;
+ }
+
TraceLevelsPtr traceLevels = _cache.getTraceLevels();
if(traceLevels && traceLevels->server > 1)
{
@@ -755,7 +758,6 @@ ServerEntry::allocated(const SessionIPtr& session)
out << "server `" << _id << "' allocated by `" << session->getId() << "' (" << _count << ")";
}
- assert(_loaded.get() || _load.get());
ServerDescriptorPtr desc = _loaded.get() ? _loaded->descriptor : _load->descriptor;
//
@@ -834,7 +836,11 @@ ServerEntry::allocatedNoSync(const SessionIPtr& session)
void
ServerEntry::released(const SessionIPtr& session)
{
- assert(_loaded.get() || _load.get());
+ if(!_loaded.get() && !_load.get())
+ {
+ return;
+ }
+
ServerDescriptorPtr desc = _loaded.get() ? _loaded->descriptor : _load->descriptor;
//