Skip to content

Commit

Permalink
Improve resource management in CAI_Space
Browse files Browse the repository at this point in the history
Raw pointers are changed to unique_ptr's, init() method becomes private, instance of the class becomes static, prohibited copy construction and assignment.
  • Loading branch information
FreeZoneMods committed Nov 3, 2018
1 parent 378e69f commit eec4a57
Show file tree
Hide file tree
Showing 9 changed files with 70 additions and 73 deletions.
23 changes: 17 additions & 6 deletions src/utils/xrSE_Factory/ai_space.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,17 @@
#include "xrScriptEngine/script_engine.hpp"
#include "xrServerEntities/object_factory.h"

CAI_Space* g_ai_space = nullptr;
static CAI_Space g_ai_space;

CAI_Space::CAI_Space() { m_script_engine = nullptr; }
CAI_Space& CAI_Space::GetInstance()
{
auto& instance = g_ai_space;
if (!instance.m_inited)
{
instance.init();
}
return instance;
}

void CAI_Space::RegisterScriptClasses()
{
Expand Down Expand Up @@ -49,13 +57,16 @@ void CAI_Space::RegisterScriptClasses()

void CAI_Space::init()
{
VERIFY(!m_script_engine);
R_ASSERT(!m_inited);

VERIFY(!GEnv.ScriptEngine);
GEnv.ScriptEngine = m_script_engine = new CScriptEngine(true);
GEnv.ScriptEngine = new CScriptEngine(true);
XRay::ScriptExporter::Reset(); // mark all nodes as undone
m_script_engine->init(XRay::ScriptExporter::Export, true);
GEnv.ScriptEngine->init(XRay::ScriptExporter::Export, true);
RegisterScriptClasses();
object_factory().register_script();

m_inited = true;
}

CAI_Space::~CAI_Space() { xr_delete(m_script_engine); }
CAI_Space::~CAI_Space() { xr_delete(GEnv.ScriptEngine); }
12 changes: 7 additions & 5 deletions src/utils/xrSE_Factory/ai_space.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,21 @@ class CScriptEngine;
class CAI_Space
{
private:
CScriptEngine* m_script_engine;
bool m_inited = false;

void init();
void RegisterScriptClasses();

public:
CAI_Space();
CAI_Space() = default;
CAI_Space(const CAI_Space&) = delete;
CAI_Space& operator=(const CAI_Space&) = delete;
virtual ~CAI_Space();
void init();
static CAI_Space& GetInstance();

IC CScriptEngine& script_engine() const;
};

extern CAI_Space* g_ai_space;

IC CAI_Space& ai();

#include "ai_space_inline.h"
14 changes: 3 additions & 11 deletions src/utils/xrSE_Factory/ai_space_inline.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,8 @@

IC CScriptEngine& CAI_Space::script_engine() const
{
VERIFY(m_script_engine);
return *m_script_engine;
VERIFY(GEnv.ScriptEngine);
return *GEnv.ScriptEngine;
}

IC CAI_Space& ai()
{
if (!g_ai_space)
{
g_ai_space = new CAI_Space();
g_ai_space->init();
}
return *g_ai_space;
}
IC CAI_Space& ai() { return CAI_Space::GetInstance(); }
1 change: 0 additions & 1 deletion src/utils/xrSE_Factory/xrSE_Factory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ BOOL APIENTRY DllMain(HANDLE module_handle, DWORD call_reason, LPVOID reserved)
auto s = (CInifile**)&pSettings;
xr_delete(*s);
xr_delete(g_property_list_helper);
xr_delete(g_ai_space);
xr_delete(g_object_factory);
if (prop_helper_module)
prop_helper_module = nullptr;
Expand Down
2 changes: 0 additions & 2 deletions src/xrGame/Level.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,6 @@ CLevel::CLevel()
Msg("%s", Core.Params);
}

extern CAI_Space* g_ai_space;

CLevel::~CLevel()
{
xr_delete(g_player_hud);
Expand Down
54 changes: 26 additions & 28 deletions src/xrGame/ai_space.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,43 +22,42 @@
#include "moving_objects.h"
#include "doors_manager.h"

CAI_Space* g_ai_space = 0;
static CAI_Space g_ai_space;

CAI_Space::CAI_Space()
CAI_Space& CAI_Space::GetInstance()
{
m_ef_storage = 0;
m_cover_manager = 0;
m_alife_simulator = 0;
m_moving_objects = 0;
m_doors_manager = 0;
auto& instance = g_ai_space;
if (!instance.m_inited)
{
instance.init();
}
return instance;
}

void CAI_Space::init()
{
if (GEnv.isDedicatedServer)
return;
AISpaceBase::Initialize();
VERIFY(!m_ef_storage);
m_ef_storage = new CEF_Storage();

VERIFY(!m_cover_manager);
m_cover_manager = new CCoverManager();

VERIFY(!m_moving_objects);
m_moving_objects = new ::moving_objects();
VERIFY(!GEnv.ScriptEngine);
GEnv.ScriptEngine = new CScriptEngine();
SetupScriptEngine();
R_ASSERT(!m_inited);

if (!GEnv.isDedicatedServer)
{
AISpaceBase::Initialize();

m_ef_storage = std::make_unique<CEF_Storage>();
m_cover_manager = std::make_unique<CCoverManager>();
m_moving_objects = std::make_unique<::moving_objects>();

VERIFY(!GEnv.ScriptEngine);
GEnv.ScriptEngine = new CScriptEngine();
SetupScriptEngine();
}

m_inited = true;
}

CAI_Space::~CAI_Space()
{
unload();
xr_delete(GEnv.ScriptEngine); // XXX: wrapped into try..catch(...) in vanilla source
xr_delete(m_doors_manager);
xr_delete(m_moving_objects);
xr_delete(m_cover_manager);
xr_delete(m_ef_storage);
}

void CAI_Space::RegisterScriptClasses()
Expand Down Expand Up @@ -147,8 +146,7 @@ void CAI_Space::load(LPCSTR level_name)
m_cover_manager->compute_static_cover();
m_moving_objects->on_level_load();

VERIFY(!m_doors_manager);
m_doors_manager = new ::doors::manager(level_graph().header().box());
m_doors_manager.reset(new ::doors::manager(level_graph().header().box()));

#ifdef DEBUG
Msg("* Loading ai space is successfully completed (%.3fs, %7.3f Mb)", timer.GetElapsed_sec(),
Expand All @@ -161,7 +159,7 @@ void CAI_Space::unload(bool reload)
if (GEnv.isDedicatedServer)
return;
GEnv.ScriptEngine->unload();
xr_delete(m_doors_manager);
m_doors_manager.reset(nullptr);
AISpaceBase::Unload(reload);
}

Expand Down
25 changes: 16 additions & 9 deletions src/xrGame/ai_space.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@

#include "xrAICore/AISpaceBase.hpp"

#include <memory>

class CGameGraph;
class CGameLevelCrossTable;
class CLevelGraph;
Expand All @@ -36,23 +38,30 @@ class CAI_Space : public AISpaceBase
friend class CLevel;

private:
CEF_Storage* m_ef_storage;
CALifeSimulator* m_alife_simulator;
CCoverManager* m_cover_manager;
moving_objects* m_moving_objects;
doors::manager* m_doors_manager;
bool m_inited = false;

std::unique_ptr<CEF_Storage> m_ef_storage;
std::unique_ptr<CCoverManager> m_cover_manager;
std::unique_ptr<moving_objects> m_moving_objects;
std::unique_ptr<doors::manager> m_doors_manager;

CALifeSimulator* m_alife_simulator = nullptr;

private:
void init();
void load(LPCSTR level_name);
void unload(bool reload = false);
void set_alife(CALifeSimulator* alife_simulator);
void LoadCommonScripts();
void RegisterScriptClasses();

public:
CAI_Space();
CAI_Space() = default;
CAI_Space(const CAI_Space&) = delete;
CAI_Space& operator=(const CAI_Space&) = delete;
virtual ~CAI_Space();
void init();
static CAI_Space& GetInstance();

void SetupScriptEngine();
IC CEF_Storage& ef_storage() const;

Expand All @@ -65,6 +74,4 @@ class CAI_Space : public AISpaceBase

IC CAI_Space& ai();

extern CAI_Space* g_ai_space;

#include "ai_space_inline.h"
10 changes: 1 addition & 9 deletions src/xrGame/ai_space_inline.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,4 @@ IC doors::manager& CAI_Space::doors() const
return (*m_doors_manager);
}

IC CAI_Space& ai()
{
if (!g_ai_space)
{
g_ai_space = new CAI_Space();
g_ai_space->init();
}
return (*g_ai_space);
}
IC CAI_Space& ai() { return CAI_Space::GetInstance(); }
2 changes: 0 additions & 2 deletions src/xrGame/xrgame_dll_detach.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,6 @@ extern void destroy_lua_wpn_params();
void clean_game_globals()
{
destroy_lua_wpn_params();
// destroy ai space
xr_delete(g_ai_space);
// destroy object factory
xr_delete(g_object_factory);
// destroy monster squad global var
Expand Down

0 comments on commit eec4a57

Please sign in to comment.