diff options
author | Benoit Foucher <benoit@zeroc.com> | 2006-11-29 14:40:22 +0000 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2006-11-29 14:40:22 +0000 |
commit | 8fdb96f93af7f6ac27ecb50ea4a5f22856b8546c (patch) | |
tree | 463ee5268393e18f55fdf9da9946e2960ca7899c /cpp/src/IceGrid/ServerCache.cpp | |
parent | Fixes (diff) | |
download | ice-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.cpp | 38 |
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; // |