From 7231a3295bc2d6238d2e95999be7f642d4b6730a Mon Sep 17 00:00:00 2001 From: Jean-Philippe Andre Date: Wed, 19 Jul 2017 15:25:46 +0900 Subject: [PATCH] eo: Fix deadlock due to the shared mutex Explicit lock / unlock of the shared mutex mixed with implicit lock / unlock when accessing the internal Eo_Object data lead to uncaught issues such as these. This was found by trying to run E with gfx filters under eo_debug. --- src/lib/eo/eo.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lib/eo/eo.c b/src/lib/eo/eo.c index 2345fd3..5af21f5 100644 --- a/src/lib/eo/eo.c +++ b/src/lib/eo/eo.c @@ -1695,12 +1695,14 @@ efl_isa(const Eo *eo_id, const Efl_Class *klass_id) // Currently implemented by reusing the LAST op id. Just marking it with // _eo_class_isa_func. isa = tdata->cache.isa = (func && (func->func == _eo_class_isa_func)); + EO_OBJ_DONE(eo_id); eina_lock_release(&(_eo_table_data_shared_data->obj_lock)); } return isa; err_shared_class: _EO_POINTER_ERR(klass_id, "Class (%p) is an invalid ref.", klass_id); + EO_OBJ_DONE(eo_id); err_shared_obj: eina_lock_release(&(_eo_table_data_shared_data->obj_lock)); return EINA_FALSE; -- 2.7.4