Check delay_del_ref if it's really deleted 80/100180/2
authorMinJeong Kim <minjjj.kim@samsung.com>
Wed, 16 Nov 2016 13:21:24 +0000 (22:21 +0900)
committerMinJeong Kim <minjjj.kim@samsung.com>
Tue, 29 Nov 2016 02:41:49 +0000 (18:41 -0800)
Change-Id: Iaac3e8f51a6e779e996b912053fdcc98a0e9c03d
Signed-off-by: MinJeong Kim <minjjj.kim@samsung.com>
src/e_mod_effect.c

index c92897f..665e62d 100644 (file)
@@ -6,6 +6,7 @@ typedef struct _E_Effect_Client
 {
    E_Client *ec;
    unsigned int animating;
+   unsigned int delay_del_ref;
    E_Comp_Wl_Buffer_Ref buffer_ref;
    E_Pixmap *ep;
    E_Client *reverse_ec;
@@ -79,6 +80,7 @@ _eff_client_new(E_Client *ec)
    efc = E_NEW(E_Effect_Client, 1);
    efc->ec = ec;
    efc->animating = 0;
+   efc->delay_del_ref = 0;
    efc->ep = NULL;
 
    return efc;
@@ -147,21 +149,30 @@ _eff_ref(E_Client *ec)
 
    if (!_eff) return EINA_FALSE;
 
+   efc = _eff_client_get(ec);
+   if (!efc) return EINA_FALSE;
+
    if (e_object_is_del(E_OBJECT(ec)))
      {
-        ERR("Client is deleted already! ec(%p)", ec);
-        eina_hash_del_by_key(_eff->clients, &ec);
-        return EINA_FALSE;
+        if (!e_object_delay_del_ref_get(E_OBJECT(ec)))
+          {
+             ERR("Client is deleted already! ec(%p)", ec);
+             eina_hash_del_by_key(_eff->clients, &ec);
+             return EINA_FALSE;
+          }
      }
 
-   efc = _eff_client_get(ec);
-   if (!efc) return EINA_FALSE;
-
    if (!ec->pixmap) return EINA_FALSE;
    if ((e_comp_object_content_type_get(ec->frame) == E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE) &&
        (!e_pixmap_usable_get(ec->pixmap)))
      return EINA_FALSE;
 
+   if (e_object_is_del(E_OBJECT(ec)))
+     {
+        e_object_delay_del_ref(E_OBJECT(ec));
+        efc->delay_del_ref ++;
+     }
+
    efc->animating++;
    e_object_ref(E_OBJECT(ec));
    efc->ep = e_pixmap_ref(ec->pixmap);
@@ -184,6 +195,12 @@ _eff_unref(E_Client *ec)
    efc = _eff_client_get(ec);
    if (!efc) return NULL;
 
+   while (efc->delay_del_ref)
+     {
+        e_object_delay_del_unref(E_OBJECT(ec));
+        efc->delay_del_ref--;
+     }
+
    if (e_object_is_del(E_OBJECT(ec)))
      do_unref = efc->animating;
 
@@ -501,7 +518,10 @@ _eff_cb_hidden(void *data, Evas_Object *obj, const char *signal)
 
    ec = e_comp_object_client_get(obj);
    if (!ec) return EINA_FALSE;
-   if (e_object_is_del(E_OBJECT(ec))) return EINA_FALSE;
+   if (e_object_is_del(E_OBJECT(ec)))
+     {
+        if (!e_object_delay_del_ref_get(E_OBJECT(ec))) return;
+     }
 
    /* check for effect group */
    group = _eff_group_get(ec);