From: Chidambar 'ilLogict' Zinnoury <illogict@online.fr>
authorraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sun, 26 Sep 2010 02:27:01 +0000 (02:27 +0000)
committerraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sun, 26 Sep 2010 02:27:01 +0000 (02:27 +0000)
Subject: [E-devel] [tentative patch] evas memleak when no callbacks

 I'm seeing some memleaks while using Evas' buffer engine. After
 investigation, it seems that evas_free does nothing and returns
 immediately if the canvas has no callbacks, which is what happens with
 the buffer engine.

  The attached patch seems to do the trick.

   However, as I don't know that much Evas' internals, I thought it'd be
   better to ask whether it's correct or I'm mistaken before committing.

    So please comment.

git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/evas@52769 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/canvas/evas_main.c

index 5579ed4..c58700a 100644 (file)
@@ -202,19 +202,22 @@ evas_free(Evas *e)
    if (e->walking_list == 0) evas_render_idle_flush(e);
    
    if (e->walking_list > 0) return;
-   if (!e->callbacks) return;
-   if (e->callbacks->deletions_waiting) return;
-   
-   e->callbacks->deletions_waiting = 0;
-   evas_event_callback_list_post_free(&e->callbacks->callbacks);
-   if (!e->callbacks->callbacks)
+
+   if (e->callbacks)
      {
-        free(e->callbacks);
-       e->callbacks = NULL;
+       if (e->callbacks->deletions_waiting) return;
+
+       e->callbacks->deletions_waiting = 0;
+       evas_event_callback_list_post_free(&e->callbacks->callbacks);
+       if (!e->callbacks->callbacks)
+         {
+            free(e->callbacks);
+            e->callbacks = NULL;
+         }
+
+       _evas_post_event_callback_free(e);
      }
    
-   _evas_post_event_callback_free(e);
-   
    del = 1;
    e->walking_list++;
    e->cleanup = 1;