From f54b3efe9ef1e32c5180b1865bd5625575d2fc5a Mon Sep 17 00:00:00 2001 From: Ted John Date: Fri, 23 Mar 2018 22:39:12 +0000 Subject: [PATCH] Use shared_ptr for Plugin --- src/openrct2/scripting/HookEngine.cpp | 6 +++--- src/openrct2/scripting/HookEngine.h | 10 +++++----- src/openrct2/scripting/Plugin.cpp | 14 -------------- src/openrct2/scripting/Plugin.h | 2 +- src/openrct2/scripting/ScContext.hpp | 2 +- src/openrct2/scripting/ScriptEngine.cpp | 22 +++++++++++----------- src/openrct2/scripting/ScriptEngine.h | 8 ++++---- 7 files changed, 25 insertions(+), 39 deletions(-) diff --git a/src/openrct2/scripting/HookEngine.cpp b/src/openrct2/scripting/HookEngine.cpp index 4b649b7332..f364a21d11 100644 --- a/src/openrct2/scripting/HookEngine.cpp +++ b/src/openrct2/scripting/HookEngine.cpp @@ -35,7 +35,7 @@ HookEngine::HookEngine(ScriptExecutionInfo& execInfo) : } } -uint32 HookEngine::Subscribe(HOOK_TYPE type, Plugin& owner, const DukValue &function) +uint32 HookEngine::Subscribe(HOOK_TYPE type, std::shared_ptr owner, const DukValue &function) { auto& hookList = GetHookList(type); auto cookie = _nextCookie++; @@ -58,14 +58,14 @@ void HookEngine::Unsubscribe(HOOK_TYPE type, uint32 cookie) } } -void HookEngine::UnsubscribeAll(const Plugin& owner) +void HookEngine::UnsubscribeAll(std::shared_ptr owner) { for (auto& hookList : _hookMap) { auto& hooks = hookList.Hooks; for (auto it = hooks.begin(); it != hooks.end();) { - if (it->Owner == &owner) + if (it->Owner == owner) { it = hooks.erase(it); } diff --git a/src/openrct2/scripting/HookEngine.h b/src/openrct2/scripting/HookEngine.h index 12058aea2a..8fc3099f9f 100644 --- a/src/openrct2/scripting/HookEngine.h +++ b/src/openrct2/scripting/HookEngine.h @@ -33,13 +33,13 @@ namespace OpenRCT2::Scripting struct Hook { uint32 Cookie; - Plugin * Owner; + std::shared_ptr Owner; DukValue Function; Hook(); - Hook(uint32 cookie, Plugin& owner, const DukValue &function) + Hook(uint32 cookie, std::shared_ptr owner, const DukValue &function) : Cookie(cookie), - Owner(&owner), + Owner(owner), Function(function) { } @@ -70,9 +70,9 @@ namespace OpenRCT2::Scripting public: HookEngine(ScriptExecutionInfo& execInfo); HookEngine(const HookEngine&) = delete; - uint32 Subscribe(HOOK_TYPE type, Plugin& owner, const DukValue &function); + uint32 Subscribe(HOOK_TYPE type, std::shared_ptr owner, const DukValue &function); void Unsubscribe(HOOK_TYPE type, uint32 cookie); - void UnsubscribeAll(const Plugin& owner); + void UnsubscribeAll(std::shared_ptr owner); void Call(HOOK_TYPE type); private: diff --git a/src/openrct2/scripting/Plugin.cpp b/src/openrct2/scripting/Plugin.cpp index 201749ec57..d0ea3f1013 100644 --- a/src/openrct2/scripting/Plugin.cpp +++ b/src/openrct2/scripting/Plugin.cpp @@ -34,20 +34,6 @@ Plugin::Plugin(duk_context * context, const std::string &path) { } -Plugin::Plugin(Plugin&& src) - : _context(src._context), - _path(src._path), - _metadata(src._metadata), - _hotReloadData(src._hotReloadData), - _hotReloadEnabled(src._hotReloadEnabled) -{ - src._context = nullptr; - src._path = std::string(); - src._metadata = PluginMetadata(); - src._hotReloadData = HotReloadData(); - src._hotReloadEnabled = false; -} - Plugin::~Plugin() { DisableHotReload(); diff --git a/src/openrct2/scripting/Plugin.h b/src/openrct2/scripting/Plugin.h index 675a985308..d14d125c3a 100644 --- a/src/openrct2/scripting/Plugin.h +++ b/src/openrct2/scripting/Plugin.h @@ -50,7 +50,7 @@ namespace OpenRCT2::Scripting Plugin() { } Plugin(duk_context * context, const std::string &path); Plugin(const Plugin&) = delete; - Plugin(Plugin&&); + Plugin(Plugin&&) = delete; ~Plugin(); void Load(); diff --git a/src/openrct2/scripting/ScContext.hpp b/src/openrct2/scripting/ScContext.hpp index 864979054c..f858cd7232 100644 --- a/src/openrct2/scripting/ScContext.hpp +++ b/src/openrct2/scripting/ScContext.hpp @@ -45,7 +45,7 @@ namespace OpenRCT2::Scripting throw DukException() << "Not in a plugin context"; } - auto cookie = _hookEngine.Subscribe(hookType, *owner, callback); + auto cookie = _hookEngine.Subscribe(hookType, owner, callback); return std::make_shared( [this, hookType, cookie]() { diff --git a/src/openrct2/scripting/ScriptEngine.cpp b/src/openrct2/scripting/ScriptEngine.cpp index 67a2d3d957..a68fc3795b 100644 --- a/src/openrct2/scripting/ScriptEngine.cpp +++ b/src/openrct2/scripting/ScriptEngine.cpp @@ -80,11 +80,11 @@ void ScriptEngine::LoadPlugins() auto path = std::string(scanner->GetPath()); try { - Plugin p(_context, path); - _execInfo.SetCurrentPlugin(&p); - p.Load(); - p.EnableHotReload(); - _plugins.push_back(std::move(p)); + auto plugin = std::make_shared(_context, path); + _execInfo.SetCurrentPlugin(plugin); + plugin->Load(); + plugin->EnableHotReload(); + _plugins.push_back(std::move(plugin)); } catch (const std::exception &e) { @@ -98,14 +98,14 @@ void ScriptEngine::AutoReloadPlugins() { for (auto& plugin : _plugins) { - if (plugin.ShouldHotReload()) + if (plugin->ShouldHotReload()) { try { _hookEngine.UnsubscribeAll(plugin); - _execInfo.SetCurrentPlugin(&plugin); - plugin.Load(); - plugin.Start(); + _execInfo.SetCurrentPlugin(plugin); + plugin->Load(); + plugin->Start(); } catch (const std::exception &e) { @@ -120,10 +120,10 @@ void ScriptEngine::StartPlugins() { for (auto& plugin : _plugins) { - _execInfo.SetCurrentPlugin(&plugin); + _execInfo.SetCurrentPlugin(plugin); try { - plugin.Start(); + plugin->Start(); } catch (const std::exception &e) { diff --git a/src/openrct2/scripting/ScriptEngine.h b/src/openrct2/scripting/ScriptEngine.h index d8f81b089c..b7177524df 100644 --- a/src/openrct2/scripting/ScriptEngine.h +++ b/src/openrct2/scripting/ScriptEngine.h @@ -31,11 +31,11 @@ namespace OpenRCT2::Scripting class ScriptExecutionInfo { private: - Plugin * _plugin; + std::shared_ptr _plugin; public: - Plugin * GetCurrentPlugin() { return _plugin; } - void SetCurrentPlugin(Plugin * value) { _plugin = value; } + std::shared_ptr GetCurrentPlugin() { return _plugin; } + void SetCurrentPlugin(std::shared_ptr value) { _plugin = value; } }; class ScriptEngine @@ -46,7 +46,7 @@ namespace OpenRCT2::Scripting bool _initialised{}; duk_context * _context{}; std::queue, std::string>> _evalQueue; - std::vector _plugins; + std::vector> _plugins; uint32 _lastHotReloadCheckTick{}; HookEngine _hookEngine; ScriptExecutionInfo _execInfo;