e_comp_wl: clear comp object immediately instead of unref e_client 88/44888/1 accepted/tizen/mobile/20150730.014214 accepted/tizen/tv/20150730.014332 accepted/tizen/wearable/20150730.014535 submit/tizen/20150729.082725
authorMinJeong Kim <minjjj.kim@samsung.com>
Wed, 29 Jul 2015 05:58:43 +0000 (14:58 +0900)
committerMinJeong Kim <minjjj.kim@samsung.com>
Wed, 29 Jul 2015 06:33:56 +0000 (15:33 +0900)
When a buffer of deleted e_client destroied, it has unrefed e_client and freed
e_client. but if there remains some action using the e_client such as ecore
event, it's able to try to use e_client which is freed before. for example, if
the event free function is called after buffer destroy, it will try to unref
e_client which is freed already.

For prevent those problem, it's desirable to clear comp object immediately
insted of to unref e_client.

related patch: feaa183a35fbbae4fcf6b9cf27eaee3e7432db73

Change-Id: I47c971b5ae1d1a5ff3a6c11bb5e80ad21c9b9224
Signed-off-by: MinJeong Kim <minjjj.kim@samsung.com>
src/bin/e_comp_wl.c

index fc3ad0c4107d2d13ccfabe1efe4c4a86d4e6a281..c46ebb22a983f11d29b430cb45a5ab1c556230ba 100644 (file)
@@ -956,9 +956,14 @@ _e_comp_wl_buffer_cb_destroy(struct wl_listener *listener, void *data EINA_UNUSE
    sid = wl_resource_get_id(buffer->resource);
    if ((sid) && (ec = eina_hash_find(clients_buffer_hash, &sid)))
      {
-        if (e_object_is_del(E_OBJECT(ec)))
-          while (e_object_unref(E_OBJECT(ec)) > 0);
         eina_hash_del_by_key(clients_buffer_hash, &sid);
+        if (e_object_is_del(E_OBJECT(ec)))
+          {
+             /* clear comp object immediately */
+             e_comp_object_redirected_set(ec->frame, 0);
+             evas_object_del(ec->frame);
+             ec->frame = NULL;
+          }
      }
 
    wl_signal_emit(&buffer->destroy_signal, buffer);