diff --git a/plugins/scripting/utils/inline-script.cpp b/plugins/scripting/utils/inline-script.cpp index 3c7ca19b..a0bd92c3 100644 --- a/plugins/scripting/utils/inline-script.cpp +++ b/plugins/scripting/utils/inline-script.cpp @@ -2,9 +2,13 @@ #include "log-helper.hpp" #include "obs-module-helper.hpp" +#include #include #include +#include +#include + #include #include @@ -28,6 +32,17 @@ const std::string_view InlineScript::_defaultLUAScript = "end"; ; +static std::mutex instancesMutex; +static std::unordered_set instances; + +static void handleScriptingShutdown(enum obs_frontend_event event, void *) +{ + if (event != OBS_FRONTEND_EVENT_SCRIPTING_SHUTDOWN) { + return; + } + InlineScript::DeregisterAll(); +} + static bool setup() { auto sh = obs_get_signal_handler(); @@ -35,6 +50,8 @@ static bool setup() std::string("void ") + signalName.data() + "(string id)"; signal_handler_add(sh, signalDecl.c_str()); + obs_frontend_add_event_callback(handleScriptingShutdown, nullptr); + return true; } static bool setupDone = setup(); @@ -98,6 +115,10 @@ static bool createScriptFile(const char *settingsFile, const char *content) InlineScript::InlineScript() : _instanceId(_instanceIdCounter++) { + { + std::lock_guard lock(instancesMutex); + instances.insert(this); + } Setup(); } @@ -107,9 +128,27 @@ InlineScript::InlineScript(const InlineScript &other) _textLUA(other._textLUA), _instanceId(_instanceIdCounter++) { + { + std::lock_guard lock(instancesMutex); + instances.insert(this); + } Setup(); } +InlineScript::~InlineScript() +{ + std::lock_guard lock(instancesMutex); + instances.erase(this); +} + +void InlineScript::DeregisterAll() +{ + std::lock_guard lock(instancesMutex); + for (auto *instance : instances) { + instance->_script.reset(); + } +} + void InlineScript::Save(obs_data_t *data) const { OBSDataAutoRelease obj = obs_data_create(); diff --git a/plugins/scripting/utils/inline-script.hpp b/plugins/scripting/utils/inline-script.hpp index a9b3fd27..52f03da1 100644 --- a/plugins/scripting/utils/inline-script.hpp +++ b/plugins/scripting/utils/inline-script.hpp @@ -15,6 +15,7 @@ class InlineScript { public: InlineScript(); InlineScript(const InlineScript &); + ~InlineScript(); enum Type { INLINE, FILE }; @@ -34,6 +35,8 @@ public: void ResolveVariablesToFixedValues(); + static void DeregisterAll(); + private: void Setup(); void SetupFile();