summaryrefslogtreecommitdiff
path: root/gtk2_ardour/luainstance.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2017-03-27 04:59:20 +0200
committerRobin Gareus <robin@gareus.org>2017-03-27 04:59:20 +0200
commitc3f2cff8bc5d017e16398fa6e0e9ca96155d831c (patch)
tree122ba137207c73dbd146a81ac0054ce7ce392a88 /gtk2_ardour/luainstance.cc
parent47ea6534d0ee1d55392f9866f14b638663a7daee (diff)
optimize LuaInstance::get_action_state, LuaInstance::get_hook_state
Lua serialize() is called recursively and concatenates strings. (in Lua that results in a new string on the stack, with 2 unused old strings). Collecting garbage every time becomes expensive, so do it only once at the end. GUI scripts are not memory limited anyway.
Diffstat (limited to 'gtk2_ardour/luainstance.cc')
-rw-r--r--gtk2_ardour/luainstance.cc14
1 files changed, 9 insertions, 5 deletions
diff --git a/gtk2_ardour/luainstance.cc b/gtk2_ardour/luainstance.cc
index b7963737cc..e83bef93ee 100644
--- a/gtk2_ardour/luainstance.cc
+++ b/gtk2_ardour/luainstance.cc
@@ -977,7 +977,6 @@ LuaInstance::init ()
""
" local function serialize (name, value)"
" local rv = name .. ' = '"
- " collectgarbage()"
" if type(value) == \"number\" or type(value) == \"string\" or type(value) == \"nil\" then"
" return rv .. basic_serialize(value) .. ' '"
" elseif type(value) == \"table\" then"
@@ -985,7 +984,6 @@ LuaInstance::init ()
" for k,v in pairs(value) do"
" local fieldname = string.format(\"%s[%s]\", name, basic_serialize(k))"
" rv = rv .. serialize(fieldname, v) .. ' '"
- " collectgarbage()" // string concatenation allocates a new string
" end"
" return rv;"
" elseif type(value) == \"function\" then"
@@ -1600,7 +1598,15 @@ LuaCallback::get_state (void)
luabridge::LuaRef savedstate ((*_lua_save)());
saved = savedstate.cast<std::string>();
}
- lua.collect_garbage ();
+
+ lua.collect_garbage (); // this may be expensive:
+ /* Editor::instant_save() calls Editor::get_state() which
+ * calls LuaInstance::get_hook_state() which in turn calls
+ * this LuaCallback::get_state() for every registered hook.
+ *
+ * serialize in _lua_save() allocates many small strings
+ * on the lua-stack, collecting them all may take a ms.
+ */
gchar* b64 = g_base64_encode ((const guchar*)saved.c_str (), saved.size ());
std::string b64s (b64);
@@ -1676,7 +1682,6 @@ LuaCallback::init (void)
""
" local function serialize (name, value)"
" local rv = name .. ' = '"
- " collectgarbage()"
" if type(value) == \"number\" or type(value) == \"string\" or type(value) == \"nil\" then"
" return rv .. basic_serialize(value) .. ' '"
" elseif type(value) == \"table\" then"
@@ -1684,7 +1689,6 @@ LuaCallback::init (void)
" for k,v in pairs(value) do"
" local fieldname = string.format(\"%s[%s]\", name, basic_serialize(k))"
" rv = rv .. serialize(fieldname, v) .. ' '"
- " collectgarbage()" // string concatenation allocates a new string
" end"
" return rv;"
" elseif type(value) == \"function\" then"