Reduces crashes after reset
Ensure the Pager doesn't hold onto a stale request.
This commit is contained in:
parent
b01beac664
commit
df98d54948
1 changed files with 20 additions and 9 deletions
|
@ -1217,6 +1217,20 @@ void fgStartNewReset()
|
||||||
fgSetBool("/sim/signals/reinit", true);
|
fgSetBool("/sim/signals/reinit", true);
|
||||||
fgSetBool("/sim/freeze/master", true);
|
fgSetBool("/sim/freeze/master", true);
|
||||||
|
|
||||||
|
// pause the osgDB requests right now, but more may appear; we will
|
||||||
|
// clear and cancel further down once shutdown has occured
|
||||||
|
FGRenderer* render = globals->get_renderer();
|
||||||
|
auto pager = render->getView()->getDatabasePager();
|
||||||
|
pager->setAcceptNewDatabaseRequests(false);
|
||||||
|
pager->cancel();
|
||||||
|
|
||||||
|
// extra clear is needed to ensure compile/merge lists are also empty
|
||||||
|
pager->clear();
|
||||||
|
|
||||||
|
assert(pager->getDataToMergeListSize() == 0);
|
||||||
|
assert(pager->getDataToCompileListSize() == 0);
|
||||||
|
|
||||||
|
|
||||||
SGSubsystemMgr* subsystemManger = globals->get_subsystem_mgr();
|
SGSubsystemMgr* subsystemManger = globals->get_subsystem_mgr();
|
||||||
// Nasal is added in fgPostInit, ensure it's already shutdown
|
// Nasal is added in fgPostInit, ensure it's already shutdown
|
||||||
// before other subsystems, so Nasal listeners don't fire during shutdown
|
// before other subsystems, so Nasal listeners don't fire during shutdown
|
||||||
|
@ -1258,7 +1272,6 @@ void fgStartNewReset()
|
||||||
// drop any references to AI objects with TACAN
|
// drop any references to AI objects with TACAN
|
||||||
flightgear::NavDataCache::instance()->clearDynamicPositioneds();
|
flightgear::NavDataCache::instance()->clearDynamicPositioneds();
|
||||||
|
|
||||||
FGRenderer* render = globals->get_renderer();
|
|
||||||
// needed or we crash in multi-threaded OSG mode
|
// needed or we crash in multi-threaded OSG mode
|
||||||
render->getViewerBase()->stopThreading();
|
render->getViewerBase()->stopThreading();
|
||||||
|
|
||||||
|
@ -1274,11 +1287,7 @@ void fgStartNewReset()
|
||||||
|
|
||||||
FGScenery::getPagerSingleton()->clearRequests();
|
FGScenery::getPagerSingleton()->clearRequests();
|
||||||
flightgear::CameraGroup::setDefault(NULL);
|
flightgear::CameraGroup::setDefault(NULL);
|
||||||
|
|
||||||
// don't cancel the pager until after shutdown, since AIModels (and
|
|
||||||
// potentially others) can queue delete requests on the pager.
|
|
||||||
render->getView()->getDatabasePager()->cancel();
|
|
||||||
render->getView()->getDatabasePager()->clear();
|
|
||||||
|
|
||||||
osgDB::Registry::instance()->clearObjectCache();
|
osgDB::Registry::instance()->clearObjectCache();
|
||||||
// Pager requests depend on this, so don't clear it until now
|
// Pager requests depend on this, so don't clear it until now
|
||||||
|
@ -1292,7 +1301,7 @@ void fgStartNewReset()
|
||||||
|
|
||||||
globals->set_renderer(NULL);
|
globals->set_renderer(NULL);
|
||||||
globals->set_matlib(NULL);
|
globals->set_matlib(NULL);
|
||||||
|
|
||||||
flightgear::unregisterMainLoopProperties();
|
flightgear::unregisterMainLoopProperties();
|
||||||
FGReplayData::resetStatisticsProperties();
|
FGReplayData::resetStatisticsProperties();
|
||||||
|
|
||||||
|
@ -1370,7 +1379,8 @@ void fgStartNewReset()
|
||||||
sgUserDataInit( globals->get_props() );
|
sgUserDataInit( globals->get_props() );
|
||||||
|
|
||||||
if (composite_viewer) {
|
if (composite_viewer) {
|
||||||
composite_viewer_view->getDatabasePager()->setUpThreads(20, 1);
|
composite_viewer_view->getDatabasePager()->setUpThreads(2, 1);
|
||||||
|
composite_viewer_view->getDatabasePager()->setAcceptNewDatabaseRequests(true);
|
||||||
flightgear::CameraGroup::buildDefaultGroup(composite_viewer_view);
|
flightgear::CameraGroup::buildDefaultGroup(composite_viewer_view);
|
||||||
composite_viewer_view->setFrameStamp(composite_viewer->getFrameStamp());
|
composite_viewer_view->setFrameStamp(composite_viewer->getFrameStamp());
|
||||||
composite_viewer_view->setDatabasePager(FGScenery::getPagerSingleton());
|
composite_viewer_view->setDatabasePager(FGScenery::getPagerSingleton());
|
||||||
|
@ -1381,7 +1391,8 @@ void fgStartNewReset()
|
||||||
composite_viewer->startThreading();
|
composite_viewer->startThreading();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
viewer->getDatabasePager()->setUpThreads(20, 1);
|
viewer->getDatabasePager()->setUpThreads(2, 1);
|
||||||
|
viewer->getDatabasePager()->setAcceptNewDatabaseRequests(true);
|
||||||
// must do this before preinit for Rembrandthe
|
// must do this before preinit for Rembrandthe
|
||||||
flightgear::CameraGroup::buildDefaultGroup(viewer.get());
|
flightgear::CameraGroup::buildDefaultGroup(viewer.get());
|
||||||
render->preinit();
|
render->preinit();
|
||||||
|
|
Loading…
Reference in a new issue