eo: Fix deadlock due to the shared mutex
authorJean-Philippe Andre <jp.andre@samsung.com>
Wed, 19 Jul 2017 06:25:46 +0000 (15:25 +0900)
committerJean-Philippe Andre <jp.andre@samsung.com>
Wed, 19 Jul 2017 06:44:49 +0000 (15:44 +0900)
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

index 2345fd3..5af21f5 100644 (file)
@@ -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;