hey,

here is a patch for efreet that should remove the leaks found with the following code (see bug #247)

#include <Efreet_Mime.h>
int main()
{
  efreet_mime_init();
  efreet_mime_shutdown();
  return 0;
}

I don't know the efreet code veery much, so i think that one of the efreet authors should look at it before i commit it

Vincent
Index: src/lib/efreet_menu.c
===================================================================
--- src/lib/efreet_menu.c       (révision 39637)
+++ src/lib/efreet_menu.c       (copie de travail)
@@ -280,6 +280,7 @@
 static char *efreet_menu_path_get(Efreet_Menu_Internal *internal, const char 
*suffix);
 
 static Efreet_Menu_App_Dir *efreet_menu_app_dir_new(void);
+static void efreet_menu_app_dir_free(Efreet_Menu_App_Dir *dir);
 
 static Efreet_Menu_Move *efreet_menu_move_new(void);
 static void efreet_menu_move_free(Efreet_Menu_Move *move);
@@ -288,6 +289,7 @@
 static void efreet_menu_filter_free(Efreet_Menu_Filter *filter);
 
 static Efreet_Menu_Layout *efreet_menu_layout_new(void);
+static void efreet_menu_layout_free(Efreet_Menu_Layout *layout);
 
 static Efreet_Menu_Filter_Op *efreet_menu_filter_op_new(void);
 static void efreet_menu_filter_op_free(Efreet_Menu_Filter_Op *op);
@@ -500,7 +502,7 @@
     char buf[PATH_MAX];
     char *p, *s;
 
-    IF_FREE_LIST(efreet_menu_kde_legacy_dirs);
+    IF_FREE_LIST(efreet_menu_kde_legacy_dirs, eina_stringshare_del);
 
     f = popen("kde-config --path apps", "r");
     if (!f) return 0;
@@ -547,7 +549,7 @@
     IF_FREE_HASH(efreet_menu_move_cbs);
     IF_FREE_HASH(efreet_menu_layout_cbs);
 
-    IF_FREE_LIST(efreet_menu_kde_legacy_dirs);
+    IF_FREE_LIST(efreet_menu_kde_legacy_dirs, eina_stringshare_del);
 
     IF_FREE_HASH(efreet_merged_menus);
     IF_FREE_HASH(efreet_merged_dirs);
@@ -995,21 +997,23 @@
     IF_RELEASE(internal->name.internal);
     internal->name.name = NULL;
 
-    IF_FREE_LIST(internal->applications);
+    while (internal->applications)
+        internal->applications = eina_list_remove_list(internal->applications,
+                                                       internal->applications);
 
     IF_FREE_DLIST(internal->directories);
-    IF_FREE_LIST(internal->app_dirs);
-    IF_FREE_LIST(internal->app_pool);
+    IF_FREE_LIST(internal->app_dirs, efreet_menu_app_dir_free);
+    IF_FREE_LIST(internal->app_pool, efreet_menu_desktop_free);
     IF_FREE_DLIST(internal->directory_dirs);
     IF_FREE_HASH(internal->directory_cache);
 
-    IF_FREE_LIST(internal->moves);
-    IF_FREE_LIST(internal->filters);
+    IF_FREE_LIST(internal->moves, efreet_menu_move_free);
+    IF_FREE_LIST(internal->filters, efreet_menu_filter_free);
 
-    IF_FREE_LIST(internal->sub_menus);
+    IF_FREE_LIST(internal->sub_menus, efreet_menu_internal_free);
 
-    IF_FREE_LIST(internal->layout);
-    IF_FREE_LIST(internal->default_layout);
+    IF_FREE_LIST(internal->layout, efreet_menu_layout_free);
+    IF_FREE_LIST(internal->default_layout, efreet_menu_layout_free);
 
     FREE(internal);
 }
@@ -2427,6 +2431,21 @@
 
 /**
  * @internal
+ * @param filter: The filter to work with
+ * @return Returns no data
+ * @brief Frees the given filter and all data
+ */
+static void
+efreet_menu_layout_free(Efreet_Menu_Layout *layout)
+{
+    if (!layout) return;
+
+    IF_FREE(layout->name);
+    FREE(layout);
+}
+
+/**
+ * @internal
  * @return Returns a new Efreet_Menu_Filter_Op on success or NULL on failure
  * @brief Creates and initializes an Efreet_Menu_Filter_Op structure
  */
@@ -2451,9 +2470,9 @@
 {
     if (!op) return;
 
-    IF_FREE_LIST(op->categories);
-    IF_FREE_LIST(op->filenames);
-    IF_FREE_LIST(op->filters);
+    IF_FREE_LIST(op->categories, free);
+    IF_FREE_LIST(op->filenames, free);
+    IF_FREE_LIST(op->filters, efreet_menu_filter_op_free);
 
     FREE(op);
 }
@@ -2513,7 +2532,9 @@
 {
     IF_RELEASE(entry->name);
     IF_RELEASE(entry->icon);
-    IF_FREE_LIST(entry->entries);
+    while (entry->entries)
+        entry->entries = eina_list_remove_list(entry->entries,
+                                               entry->entries);
     IF_RELEASE(entry->id);
     if (entry->desktop) efreet_desktop_free(entry->desktop);
     FREE(entry);
@@ -3079,7 +3100,7 @@
             efreet_menu_internal_free(origin);
         }
     }
-    IF_FREE_LIST(internal->moves);
+    IF_FREE_LIST(internal->moves, efreet_menu_move_free);
 }
 
 /**
@@ -3200,6 +3221,21 @@
 
 /**
  * @internal
+ * @param dir: The Efreet_Menu_App_Dir to free
+ * @return Returns no value.
+ * @brief Frees the given dir structure
+ */
+static void
+efreet_menu_app_dir_free(Efreet_Menu_App_Dir *dir)
+{
+    if (!dir) return;
+
+    IF_FREE(dir->path);
+    FREE(dir);
+}
+
+/**
+ * @internal
  * @param a: The app dir to compare too
  * @param b: The path to compare too
  * @return Returns 1 if the strings are equals, 0 otherwise
@@ -3764,7 +3800,9 @@
                     entry->entries = eina_list_append(entry->entries, 
sub_entry);
                 }
             }
-            IF_FREE_LIST(internal->applications);
+            while (internal->applications)
+                internal->applications = 
eina_list_remove_list(internal->applications,
+                                                               
internal->applications);
         }
         else if (internal->sub_menus && !strcmp(layout->name, "menus"))
         {
@@ -3842,7 +3880,7 @@
                 }
                 efreet_menu_internal_free(sub);
             }
-            IF_FREE_LIST(internal->sub_menus);
+            IF_FREE_LIST(internal->sub_menus, efreet_menu_internal_free);
         }
         else if (internal->sub_menus && !strcmp(layout->name, "all"))
         {
Index: src/lib/efreet_desktop.c
===================================================================
--- src/lib/efreet_desktop.c    (révision 39637)
+++ src/lib/efreet_desktop.c    (copie de travail)
@@ -371,8 +371,8 @@
     IF_FREE(desktop->path);
     IF_FREE(desktop->startup_wm_class);
 
-    IF_FREE_LIST(desktop->only_show_in);
-    IF_FREE_LIST(desktop->not_show_in);
+    IF_FREE_LIST(desktop->only_show_in, free);
+    IF_FREE_LIST(desktop->not_show_in, free);
     while (desktop->categories)
     {
         data = eina_list_data_get(desktop->categories);
@@ -511,8 +511,8 @@
     IF_FREE(desktop->path);
     IF_FREE(desktop->startup_wm_class);
 
-    IF_FREE_LIST(desktop->only_show_in);
-    IF_FREE_LIST(desktop->not_show_in);
+    IF_FREE_LIST(desktop->only_show_in, free);
+    IF_FREE_LIST(desktop->not_show_in, free);
 
     EINA_LIST_FREE(desktop->categories, str)
         eina_stringshare_del(str);
Index: src/lib/efreet_base.c
===================================================================
--- src/lib/efreet_base.c       (révision 39637)
+++ src/lib/efreet_base.c       (copie de travail)
@@ -39,8 +39,8 @@
     IF_RELEASE(xdg_config_home);
     IF_RELEASE(xdg_cache_home);
 
-    IF_FREE_LIST(xdg_data_dirs);
-    IF_FREE_LIST(xdg_config_dirs);
+    IF_FREE_LIST(xdg_data_dirs, eina_stringshare_del);
+    IF_FREE_LIST(xdg_config_dirs, eina_stringshare_del);
 
     eina_stringshare_shutdown();
 }
Index: src/lib/efreet_private.h
===================================================================
--- src/lib/efreet_private.h    (révision 39637)
+++ src/lib/efreet_private.h    (copie de travail)
@@ -70,8 +70,12 @@
  * @def IF_FREE_LIST(x)
  * If x is a valid pointer destroy x and set to NULL
  */
-#define IF_FREE_LIST(x) do { \
-     x = eina_list_free(x);                    \
+#define IF_FREE_LIST(list, free_cb) do { \
+    while (list) \
+    { \
+        free_cb(eina_list_data_get(list)); \
+        list = eina_list_remove_list(list, list); \
+    } \
 } while (0)
 
 /**
Index: src/lib/efreet_mime.c
===================================================================
--- src/lib/efreet_mime.c       (révision 39637)
+++ src/lib/efreet_mime.c       (copie de travail)
@@ -194,8 +194,8 @@
 
     efreet_mime_icons_debug();
 
-    IF_FREE_LIST(globs);
-    IF_FREE_LIST(magics);
+    IF_FREE_LIST(globs, efreet_mime_glob_free);
+    IF_FREE_LIST(magics, efreet_mime_magic_free);
     IF_FREE_HASH(monitors);
     IF_FREE_HASH(wild);
     IF_FREE_HASH(mime_icons);
@@ -1013,7 +1013,7 @@
             {
                 if (!(entry = NEW(Efreet_Mime_Magic_Entry, 1)))
                 {
-                    IF_FREE_LIST(magics);
+                  IF_FREE_LIST(magics, efreet_mime_magic_free);
                     return;
                 }
 
Index: src/lib/efreet_icon.c
===================================================================
--- src/lib/efreet_icon.c       (révision 39643)
+++ src/lib/efreet_icon.c       (copie de travail)
@@ -66,6 +66,7 @@
 
 static Efreet_Icon_Theme_Directory *efreet_icon_theme_directory_new(Efreet_Ini 
*ini,
                                                                 const char 
*name);
+static void efreet_icon_theme_directory_free(Efreet_Icon_Theme_Directory *dir);
 
 static void efreet_icon_theme_cache_check(Efreet_Icon_Theme *theme);
 static int efreet_icon_theme_cache_check_dir(Efreet_Icon_Theme *theme,
@@ -137,9 +138,11 @@
     IF_FREE(efreet_icon_user_dir);
     IF_FREE(efreet_icon_deprecated_user_dir);
 
-    IF_FREE_LIST(efreet_icon_extensions);
+    IF_FREE_LIST(efreet_icon_extensions, free);
     IF_FREE_HASH(efreet_icon_themes);
-    IF_FREE_LIST(efreet_extra_icon_dirs);
+    while (efreet_extra_icon_dirs)
+        efreet_extra_icon_dirs = eina_list_remove_list(efreet_extra_icon_dirs,
+                                                       efreet_extra_icon_dirs);
 
     IF_FREE_HASH(efreet_icon_cache);
 
@@ -980,7 +983,7 @@
 
     IF_FREE(icon->path);
     IF_FREE(icon->name);
-    IF_FREE_LIST(icon->attach_points);
+    IF_FREE_LIST(icon->attach_points, free);
 
     FREE(icon);
 }
@@ -1115,9 +1118,9 @@
     IF_FREE(theme->comment);
     IF_FREE(theme->example_icon);
 
-    IF_FREE_LIST(theme->paths);
-    IF_FREE_LIST(theme->inherits);
-    IF_FREE_LIST(theme->directories);
+    IF_FREE_LIST(theme->paths, free);
+    IF_FREE_LIST(theme->inherits, free);
+    IF_FREE_LIST(theme->directories, efreet_icon_theme_directory_free);
 
     FREE(theme);
 }
@@ -1490,6 +1493,21 @@
     return dir;
 }
 
+/**
+ * @internal
+ * @param dir: The Efreet_Icon_Theme_Directory to free
+ * @return Returns no value
+ * @brief Frees the given directory @a dir
+ */
+static void
+efreet_icon_theme_directory_free(Efreet_Icon_Theme_Directory *dir)
+{
+    if (!dir) return;
+
+    IF_FREE(dir->name);
+    FREE(dir);
+}
+
 static int
 efreet_icon_cache_find(Efreet_Icon_Cache *value, const char *key)
 {
------------------------------------------------------------------------------
Apps built with the Adobe(R) Flex(R) framework and Flex Builder(TM) are
powering Web 2.0 with engaging, cross-platform capabilities. Quickly and
easily build your RIAs with Flex Builder, the Eclipse(TM)based development
software that enables intelligent coding and step-through debugging.
Download the free 60 day trial. http://p.sf.net/sfu/www-adobe-com
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to