Fix premature deletion of dependencies (#5952)

In particular, the object repository can potentially be deleted before the object manager is deleted. This causes a crash when the object manager is deleted because it requires the object repository within the destructor.
This commit is contained in:
Ted John 2017-07-20 17:44:31 +01:00 committed by GitHub
parent 260f342d73
commit 2eb9657781
5 changed files with 29 additions and 16 deletions

View File

@ -88,6 +88,7 @@ namespace OpenRCT2
ITrackDesignRepository * _trackDesignRepository = nullptr; ITrackDesignRepository * _trackDesignRepository = nullptr;
IScenarioRepository * _scenarioRepository = nullptr; IScenarioRepository * _scenarioRepository = nullptr;
bool _initialised = false;
bool _isWindowMinimised = false; bool _isWindowMinimised = false;
uint32 _lastTick = 0; uint32 _lastTick = 0;
uint32 _accumulator = 0; uint32 _accumulator = 0;
@ -125,6 +126,12 @@ namespace OpenRCT2
EVP_MD_CTX_destroy(gHashCTX); EVP_MD_CTX_destroy(gHashCTX);
#endif // DISABLE_NETWORK #endif // DISABLE_NETWORK
rct2_interop_dispose(); rct2_interop_dispose();
delete _scenarioRepository;
delete _trackDesignRepository;
delete _objectManager;
delete _objectRepository;
Instance = nullptr; Instance = nullptr;
} }
@ -157,6 +164,12 @@ namespace OpenRCT2
bool Initialise() final override bool Initialise() final override
{ {
if (_initialised)
{
throw std::runtime_error("Context already initialised.");
}
_initialised = true;
#ifndef DISABLE_NETWORK #ifndef DISABLE_NETWORK
gHashCTX = EVP_MD_CTX_create(); gHashCTX = EVP_MD_CTX_create();
Guard::Assert(gHashCTX != nullptr, "EVP_MD_CTX_create failed"); Guard::Assert(gHashCTX != nullptr, "EVP_MD_CTX_create failed");

View File

@ -607,17 +607,17 @@ private:
} }
}; };
static std::unique_ptr<ObjectManager> _objectManager; static ObjectManager * _objectManager = nullptr;
IObjectManager * CreateObjectManager(IObjectRepository * objectRepository) IObjectManager * CreateObjectManager(IObjectRepository * objectRepository)
{ {
_objectManager = std::unique_ptr<ObjectManager>(new ObjectManager(objectRepository)); _objectManager = new ObjectManager(objectRepository);
return _objectManager.get(); return _objectManager;
} }
IObjectManager * GetObjectManager() IObjectManager * GetObjectManager()
{ {
return _objectManager.get(); return _objectManager;
} }
extern "C" extern "C"

View File

@ -698,17 +698,17 @@ private:
} }
}; };
static std::unique_ptr<ObjectRepository> _objectRepository; static ObjectRepository * _objectRepository = nullptr;
IObjectRepository * CreateObjectRepository(IPlatformEnvironment * env) IObjectRepository * CreateObjectRepository(IPlatformEnvironment * env)
{ {
_objectRepository = std::unique_ptr<ObjectRepository>(new ObjectRepository(env)); _objectRepository = new ObjectRepository(env);
return _objectRepository.get(); return _objectRepository;
} }
IObjectRepository * GetObjectRepository() IObjectRepository * GetObjectRepository()
{ {
return _objectRepository.get(); return _objectRepository;
} }
bool IsObjectCustom(const ObjectRepositoryItem * object) bool IsObjectCustom(const ObjectRepositoryItem * object)

View File

@ -456,17 +456,17 @@ public:
} }
}; };
static std::unique_ptr<TrackDesignRepository> _trackDesignRepository; static TrackDesignRepository * _trackDesignRepository = nullptr;
ITrackDesignRepository * CreateTrackDesignRepository(IPlatformEnvironment * env) ITrackDesignRepository * CreateTrackDesignRepository(IPlatformEnvironment * env)
{ {
_trackDesignRepository = std::unique_ptr<TrackDesignRepository>(new TrackDesignRepository(env)); _trackDesignRepository = new TrackDesignRepository(env);
return _trackDesignRepository.get(); return _trackDesignRepository;
} }
ITrackDesignRepository * GetTrackDesignRepository() ITrackDesignRepository * GetTrackDesignRepository()
{ {
return _trackDesignRepository.get(); return _trackDesignRepository;
} }
extern "C" extern "C"

View File

@ -604,17 +604,17 @@ private:
} }
}; };
static std::unique_ptr<ScenarioRepository> _scenarioRepository; static ScenarioRepository * _scenarioRepository;
IScenarioRepository * CreateScenarioRepository(IPlatformEnvironment * env) IScenarioRepository * CreateScenarioRepository(IPlatformEnvironment * env)
{ {
_scenarioRepository = std::unique_ptr<ScenarioRepository>(new ScenarioRepository(env)); _scenarioRepository = new ScenarioRepository(env);
return _scenarioRepository.get(); return _scenarioRepository;
} }
IScenarioRepository * GetScenarioRepository() IScenarioRepository * GetScenarioRepository()
{ {
return _scenarioRepository.get(); return _scenarioRepository;
} }
extern "C" extern "C"