From 8f3a13d998e812e1c997bd8485b0d5c7b7ff9809 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sat, 19 Mar 2016 18:03:36 +0100 Subject: [PATCH] hotfix for concurrent lua interpreter calls ToDo: localize parameter descriptor in init() --- libs/ardour/ardour/luaproc.h | 3 +++ libs/ardour/luaproc.cc | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/libs/ardour/ardour/luaproc.h b/libs/ardour/ardour/luaproc.h index d0560e9953..062aad9fff 100644 --- a/libs/ardour/ardour/luaproc.h +++ b/libs/ardour/ardour/luaproc.h @@ -142,6 +142,9 @@ private: int64_t _stats_max[2]; int64_t _stats_cnt; #endif + + mutable Glib::Threads::Mutex debug_hack; // prevent concurrent calls to _lua_dsp() and _lua_params() -- test/debug + }; class LIBARDOUR_API LuaPluginInfo : public PluginInfo diff --git a/libs/ardour/luaproc.cc b/libs/ardour/luaproc.cc index a030691e9f..2669f3a03f 100644 --- a/libs/ardour/luaproc.cc +++ b/libs/ardour/luaproc.cc @@ -531,6 +531,7 @@ LuaProc::connect_and_run (BufferSet& bufs, try { if (_lua_does_channelmapping) { + Glib::Threads::Mutex::Lock lm (debug_hack); // run the DSP function (*_lua_dsp)(&bufs, in, out, nframes, offset); } else { @@ -594,6 +595,7 @@ LuaProc::connect_and_run (BufferSet& bufs, } + Glib::Threads::Mutex::Lock lm (debug_hack); // run the DSP function (*_lua_dsp)(in_map, out_map, nframes); } @@ -747,6 +749,7 @@ LuaProc::default_value (uint32_t port) return 0; } int lp = _ctrl_params[port].second; + Glib::Threads::Mutex::Lock lm (debug_hack); luabridge::LuaRef lr = (*_lua_params)[lp]; return (lr["default"]).cast (); } @@ -778,6 +781,7 @@ LuaProc::get_parameter_descriptor (uint32_t port, ParameterDescriptor& desc) con assert (port <= parameter_count ()); int lp = _ctrl_params[port].second; + Glib::Threads::Mutex::Lock lm (debug_hack); luabridge::LuaRef lr = (*_lua_params)[lp]; desc.lower = (lr["min"]).cast (); desc.upper = (lr["max"]).cast (); @@ -814,6 +818,7 @@ std::string LuaProc::get_parameter_docs (uint32_t port) const { assert (port <= parameter_count ()); int lp = _ctrl_params[port].second; + Glib::Threads::Mutex::Lock lm (debug_hack); luabridge::LuaRef lr = (*_lua_params)[lp]; luabridge::LuaRef doc = lr["doc"]; if (doc.isString ()) { @@ -864,6 +869,7 @@ LuaProc::describe_parameter (Evoral::Parameter param) { if (param.type () == PluginAutomation && param.id () < parameter_count ()) { int lp = _ctrl_params[param.id ()].second; + Glib::Threads::Mutex::Lock lm (debug_hack); luabridge::LuaRef lr = (*_lua_params)[lp]; return (lr["name"]).cast (); } else { @@ -887,6 +893,7 @@ boost::shared_ptr LuaProc::get_scale_points (uint32_t port) const { int lp = _ctrl_params[port].second; + Glib::Threads::Mutex::Lock lm (debug_hack); luabridge::LuaRef lr = (*_lua_params)[lp]; if (!lr["scalepoints"].isTable()) {