avoid entity-server node/octree deadlock on shutdown

This commit is contained in:
Stephen Birarda 2015-07-22 13:52:49 -07:00
parent f86c064059
commit 55b4784a02
2 changed files with 14 additions and 5 deletions

View file

@ -42,7 +42,7 @@ protected:
virtual bool process();
private:
OctreeServer* _myServer;
QPointer<OctreeServer> _myServer;
SharedNodePointer _node;
QUuid _nodeUUID;

View file

@ -1175,13 +1175,22 @@ void OctreeServer::aboutToFinish() {
if (_jurisdictionSender) {
_jurisdictionSender->terminating();
}
QSet<SharedNodePointer> nodesToKill;
// force a shutdown of all of our OctreeSendThreads - at this point it has to be impossible for a
// linkedDataCreateCallback to be called for a new node
nodeList->eachNode([this](const SharedNodePointer& node) {
// Force a shutdown of all of our OctreeSendThreads.
// At this point it has to be impossible for a linkedDataCreateCallback to be called for a new node
nodeList->eachNode([&nodesToKill](const SharedNodePointer& node) {
nodesToKill << node;
});
// What follows is a hack to force OctreeSendThreads to cleanup before the OctreeServer is gone.
// I would prefer to allow the SharedNodePointer ref count drop to zero to do this automatically
// but that isn't possible as long as the OctreeSendThread has an OctreeServer* that it uses.
for (auto& node : nodesToKill) {
qDebug() << qPrintable(_safeServerName) << "server about to finish while node still connected node:" << *node;
forceNodeShutdown(node);
});
}
if (_persistThread) {
_persistThread->aboutToFinish();