q66 pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=bcc5ba83b320924ded614ee722c08b8d68a08a44
commit bcc5ba83b320924ded614ee722c08b8d68a08a44 Author: Daniel Kolesa <d.kol...@samsung.com> Date: Fri Mar 6 14:25:29 2015 +0000 elua: a func-to-idx cache for eo callbacks --- src/bindings/luajit/eo.lua | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/bindings/luajit/eo.lua b/src/bindings/luajit/eo.lua index 22f9094..bbb8d9e 100644 --- a/src/bindings/luajit/eo.lua +++ b/src/bindings/luajit/eo.lua @@ -131,14 +131,14 @@ local eo_classes = {} -- event system -local eo_callbacks = {} +local eo_callbacks, eo_cbidcache = {}, {} local eo_event_del, eo_event_cb local eo_event_del_fun = function(data, obj, desc, einfo) local addr = eo_obj_addr_get(obj) if eo_callbacks[addr] then - eo_callbacks[addr] = nil + eo_callbacks[addr], eo_cbidcache[addr] = nil, nil end end @@ -162,13 +162,14 @@ local connect = function(self, ename, func, priority) local cdel = false local addr = eo_obj_addr_get(self) local cbs = eo_callbacks[addr] + local cbi = eo_cbidcache[addr] if not cbs then - cbs = {} - eo_callbacks[addr] = cbs + cbs, cbi = {}, {} + eo_callbacks[addr], eo_cbidcache[addr] = cbs, cbi cdel = true end local cidx = #cbs + 1 - cbs[cidx] = func + cbs[cidx], cbi[func] = func, cidx M.__do_start(self, cl) eo.eo_event_callback_priority_add(ev, priority or 0, eo_event_cb, ffi.cast("void *", cidx)) @@ -191,17 +192,14 @@ local disconnect = function(self, ename, func) return false end -- TODO: make a hash table for func-to-index conversions - local cidx = -1 - for i = 1, #cbs do - if cbs[i] == func then - cidx = i - break - end - end - if cidx < 0 then + local cbi = eo_cbidcache[addr] + assert(cbi) + local cidx = cbi[func] + if not cidx then return false end cbs[cidx] = nil + cbi[func] = nil M.__do_start(self, cl) eo.eo_event_callback_del(ev, eo_event_cb, ffi.cast("void *", cidx)) M.__do_end() @@ -234,6 +232,7 @@ local shutdown = function() eo_event_del = nil eo_event_cb = nil eo_callbacks = {} + eo_cbidcache = {} util.lib_unload("eo") end --